Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Instruction pipelining, STM8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
evil_laugh
Доброго врем времени суток!

Ковыряю 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, не нашёл. Помогите, я мозг сломал...
scifi
Цитата(evil_laugh @ Nov 4 2011, 11:02) *
Эксперимент показал, что при разной тактовой частоте ядра команды исполняются за разное количество тактов (отсчитываю по таймеру1 без предделителя).

Это ещё ни о чём не говорит. Вот недавно у кого-то эксперимент показал, что нейтрино летает быстрее света. Потом разобрались, нашли ошибку. Вот и Вы поищите.
evil_laugh
scifi, я бы и рад поискать, да я с этими контроллерами общаюсь сравнительно недавно и толком не знаю, где могла вкрасться ошибка. Казалось бы, ничего необычного - есть код, циклически выполняющий команду NOP. Если перед ним поставить переключение тактовой на 125 кГц - таймер считает по 2 такта на команду. Если оставить как есть, 2 МГц (после ресета) - считает по 1 такту на ноп. Чудеса sm.gif У Вас есть какие-нибудь предположения?

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

Предположения есть.
Вопрос первый: откуда Вы знаете, что тактовая переключилась именно на 125 кГц? Требуется независимое подтверждение.
Вопрос второй: откуда Вы знаете частоту таймера для расчёта времени выполнения программы? Требуется независимое подтверждение.
Вопрос третий: как измеряем время выполнения NOP?
Я бы сделал так: цикл с большим числом итераций, в теле цикла - 100 NOP подряд. В начале и конце цикла дёргаем ножку. Тогда время выполнения цикла можно измерить осциллографом, а не таймером (насчёт рабочей частоты которого, как сказано выше, есть сомнения).
evil_laugh
Спасибо, это солидная пища для размышлений.

Тактовая переключилась на 125 кГц исходя из даташита, по которому я её переключал. Да ведь по идее неважно, какая тактовая, хоть 1 Гц. Выполнение инструкции по ДШ всё равно будет занимать 1 такт. Нет? У меня подозрения, что вполне возможно, что это не так, ведь исходя из мельком прочитанного мной в ДШ, выполнение инструкции может занимать разное число тактов в зависимости от их порядка и положения во флэш-памяти. Это стоит изучить, я мог неправильно всё понять...

С таймером всё то же самое: посмотрел даташит и выставил битики соответственно. sm.gif частота у него равна подаваемой на ядро - SYSCLK.

Время исполнения NOP измеряю так: нажимаю кнопочку F11 (Step) и смотрю разницу в значении таймера до выполнения команды и после.

Про осциллограф идея хорошая, так я и поступлю.
ZiB
Отладка - зло.
Оптимальнее сделать как предложил scifi, я так и делал sm.gif
Вот документ по которому проще понять как работает конвейер команд
ziblog.ru/wp-content/plugins/download-monitor/download.php?id=48
scifi
Цитата(evil_laugh @ Nov 4 2011, 18:59) *
Тактовая переключилась на 125 кГц исходя из даташита, по которому я её переключал.

С точностью до ошибок в коде. Мы все люди.

Цитата(evil_laugh @ Nov 4 2011, 18:59) *
Время исполнения NOP измеряю так: нажимаю кнопочку F11 (Step) и смотрю разницу в значении таймера до выполнения команды и после.

За такое измерение Вас следует подвергнуть страшному наказанию. Есть миллион причин, почему так делать не следует.
evil_laugh
ZiB, благодарю за информацию, документ весьма полезен. Буду изучать и сопоставлять его с даташитом.

scifi, я перепроверю код ещё раз. Но судя по частоте мигания диодиком, которую отсчитывает таймер (раз в секунду) тактовая похожа на указанную в ДШ.

Цитата
За такое измерение Вас следует подвергнуть страшному наказанию. Есть миллион причин, почему так делать не следует.


Спасибо за ценное указание! А не затруднит ли Вас коротко озвучить несколько самых распространённых причин того, почему такое измерение может быть ошибочно?.. Хотелось бы понять, в целях расширения познаний по предмету. Спасибо sm.gif
scifi
Цитата(evil_laugh @ Nov 4 2011, 20:33) *
А не затруднит ли Вас коротко озвучить несколько самых распространённых причин того, почему такое измерение может быть ошибочно?..

Такой способ измерения предполагает, что при остановке/запуске программы отладчиком процессор и таймер останавливаются/запускаются синхронно с точностью до последнего такта. Такое предположение скорее всего неверно. Хотя бы потому, что процессор и таймер тактируются от разных частот, а остановиться они могут только на границе такта (у каждого своей длительности). Да и вообще точная структура схемы этой синхронизации неизвестна и на самом деле никому не интересна.
evil_laugh
Мне казалось, что и таймер, и процессор тактируются одной и той же частотой, а именно SYSCLK от генератора, соответственно, должны быть синхроны...

Ну да ладно, впрочем, осциллограф покажет sm.gif Печально только то, что если мне, например, потребуется реализовать задержку NOP-ом, или подсчитать время выполнения подпрограммы - я не смогу без осциллографа понять, сколько оно будет составлять, ибо отладчик вкупе с таймером, как оказывается, могут показывать не совсем то, что нужно...
evil_laugh
Добрый день всем.

Руки снова дошли до изучения 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 здесь.

Вопрос номер один: чего я не понимаю? Может кто-нибудь объяснить доступным языком, где моя ошибка?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.