|
|
  |
Instruction pipelining, STM8 |
|
|
|
Nov 4 2011, 07:02
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Доброго врем времени суток! Ковыряю STM8, в данный момент - таймеры. Эксперимент показал, что при разной тактовой частоте ядра команды исполняются за разное количество тактов (отсчитываю по таймеру1 без предделителя). Например, при тактовой 16 МГц выполнение команды nop занимает 1 такт, а если переключить тактовую на 1 МГц, получаем уже 2 такта. Если пойти дальше и использовать LSI осциллятор (38 кГц), то там будем иметь 2, или 3, или даже 4 такта для исполнения команды NOP. Всякий раз, когда я пускаю программу на отладку в STM8L-Discovery, количество тактов разное. В интернете нашёл только http://we.easyelectronics.ru/STM8/pogovori...yadre-stm8.html вот это, но ответов на мои вопросы это не дало, да и ситуация там несколько иная. Где почитать в даташите про instruction flow, как это сделано в PIC и AVR, не нашёл. Помогите, я мозг сломал...
|
|
|
|
|
Nov 4 2011, 14:02
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
scifi, я бы и рад поискать, да я с этими контроллерами общаюсь сравнительно недавно и толком не знаю, где могла вкрасться ошибка. Казалось бы, ничего необычного - есть код, циклически выполняющий команду NOP. Если перед ним поставить переключение тактовой на 125 кГц - таймер считает по 2 такта на команду. Если оставить как есть, 2 МГц (после ресета) - считает по 1 такту на ноп. Чудеса  У Вас есть какие-нибудь предположения? Есть два предположения: либо это связано с отладчиком (т. е. он добавляет какие-то свои промежуточные инструкции в код), либо это связано с непониманием мной процессов декодирования команд и прочих тонкостей работу ЦПУ. Как выяснилось, мой даташит CPU Programming Manual был неполным, в Сети нашёл такой же, но с дополнительным обширным разделом "Instruction pipelining", где на добрый десяток страниц рассказано, как осуществляются все эти decode, fetch, execute и прочее. Причём в зависимости от порядка следования команд время на исполнение может быть разным. Предстоит всё это понять, может, и найду, где загвоздка. А пока послушаю, может, кто что посоветует...
Сообщение отредактировал evil_laugh - Nov 4 2011, 14:03
|
|
|
|
|
Nov 4 2011, 14:41
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(evil_laugh @ Nov 4 2011, 18:02)  Казалось бы, ничего необычного - есть код, циклически выполняющий команду NOP. Если перед ним поставить переключение тактовой на 125 кГц - таймер считает по 2 такта на команду. Если оставить как есть, 2 МГц (после ресета) - считает по 1 такту на ноп. Чудеса  У Вас есть какие-нибудь предположения? Предположения есть. Вопрос первый: откуда Вы знаете, что тактовая переключилась именно на 125 кГц? Требуется независимое подтверждение. Вопрос второй: откуда Вы знаете частоту таймера для расчёта времени выполнения программы? Требуется независимое подтверждение. Вопрос третий: как измеряем время выполнения NOP? Я бы сделал так: цикл с большим числом итераций, в теле цикла - 100 NOP подряд. В начале и конце цикла дёргаем ножку. Тогда время выполнения цикла можно измерить осциллографом, а не таймером (насчёт рабочей частоты которого, как сказано выше, есть сомнения).
|
|
|
|
|
Nov 4 2011, 14:59
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Спасибо, это солидная пища для размышлений. Тактовая переключилась на 125 кГц исходя из даташита, по которому я её переключал. Да ведь по идее неважно, какая тактовая, хоть 1 Гц. Выполнение инструкции по ДШ всё равно будет занимать 1 такт. Нет? У меня подозрения, что вполне возможно, что это не так, ведь исходя из мельком прочитанного мной в ДШ, выполнение инструкции может занимать разное число тактов в зависимости от их порядка и положения во флэш-памяти. Это стоит изучить, я мог неправильно всё понять... С таймером всё то же самое: посмотрел даташит и выставил битики соответственно.  частота у него равна подаваемой на ядро - SYSCLK. Время исполнения NOP измеряю так: нажимаю кнопочку F11 (Step) и смотрю разницу в значении таймера до выполнения команды и после. Про осциллограф идея хорошая, так я и поступлю.
|
|
|
|
|
Nov 4 2011, 15:11
|

Частый гость
 
Группа: Свой
Сообщений: 122
Регистрация: 26-07-05
Из: Россия, Томск
Пользователь №: 7 109

|
Отладка - зло. Оптимальнее сделать как предложил scifi, я так и делал  Вот документ по которому проще понять как работает конвейер команд ziblog.ru/wp-content/plugins/download-monitor/download.php?id=48
|
|
|
|
|
Nov 4 2011, 15:16
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(evil_laugh @ Nov 4 2011, 18:59)  Тактовая переключилась на 125 кГц исходя из даташита, по которому я её переключал. С точностью до ошибок в коде. Мы все люди. Цитата(evil_laugh @ Nov 4 2011, 18:59)  Время исполнения NOP измеряю так: нажимаю кнопочку F11 (Step) и смотрю разницу в значении таймера до выполнения команды и после. За такое измерение Вас следует подвергнуть страшному наказанию. Есть миллион причин, почему так делать не следует.
|
|
|
|
|
Nov 4 2011, 16:33
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
ZiB, благодарю за информацию, документ весьма полезен. Буду изучать и сопоставлять его с даташитом. scifi, я перепроверю код ещё раз. Но судя по частоте мигания диодиком, которую отсчитывает таймер (раз в секунду) тактовая похожа на указанную в ДШ. Цитата За такое измерение Вас следует подвергнуть страшному наказанию. Есть миллион причин, почему так делать не следует. Спасибо за ценное указание! А не затруднит ли Вас коротко озвучить несколько самых распространённых причин того, почему такое измерение может быть ошибочно?.. Хотелось бы понять, в целях расширения познаний по предмету. Спасибо
|
|
|
|
|
Nov 4 2011, 22:37
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Мне казалось, что и таймер, и процессор тактируются одной и той же частотой, а именно SYSCLK от генератора, соответственно, должны быть синхроны... Ну да ладно, впрочем, осциллограф покажет  Печально только то, что если мне, например, потребуется реализовать задержку NOP-ом, или подсчитать время выполнения подпрограммы - я не смогу без осциллографа понять, сколько оно будет составлять, ибо отладчик вкупе с таймером, как оказывается, могут показывать не совсем то, что нужно...
|
|
|
|
|
Nov 16 2011, 20:22
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Добрый день всем. Руки снова дошли до изучения STM8, продолжил (а точнее, начал) читать документ CPU Programming Manual. Вот ссылка.У меня сразу же возник миллион вопросов. Рассмотрим самую первую страницу, рассказывающую о том, как работает конвеер команд. Вот она.  Для наглядности я выделил команды, о которых пойдёт речь, разными цветами. Меня прежде всего заинтересовал вопрос: как производится подсчёт циклов на Decode и Execute? Откуда берутся эти цифры? Открываем описание первой команды LDW. И видим там следующее.  Написано, что команда занимает минимум 5 циклов. Это вполне соответствует сумме указанных на предыдущей картинке тактов для Decode и Execute: 4 + 1 = 5. Смотрим следующую команду. ADDW, написано, что занимает 2 цикла на декодирование, и 2 на выполнение. Смотрим описание.  Что за притча? Почему написано, что команда занимает 2 цикла? Ведь 2 цикла на decode + 2 цикла на execute = 4, разве нет? Ничего не понятно. Следующая команда - LD. Кажется, в ней есть ошибка, так как синтаксиса LD A,[30].w в описании не встречается. Квадратная скобка д. б. в другом месте, но это мелочи. Сказано, что занимает 3 цикла на decode и 1 на execute, всего 4. Проверяем.  Всё верно, 4 цикла там, 4 здесь. Вопрос номер один: чего я не понимаю? Может кто-нибудь объяснить доступным языком, где моя ошибка?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|