Перейти к содержанию
    

Instruction pipelining, STM8

Доброго врем времени суток!

 

Ковыряю 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, не нашёл. Помогите, я мозг сломал...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эксперимент показал, что при разной тактовой частоте ядра команды исполняются за разное количество тактов (отсчитываю по таймеру1 без предделителя).

Это ещё ни о чём не говорит. Вот недавно у кого-то эксперимент показал, что нейтрино летает быстрее света. Потом разобрались, нашли ошибку. Вот и Вы поищите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Есть два предположения: либо это связано с отладчиком (т. е. он добавляет какие-то свои промежуточные инструкции в код), либо это связано с непониманием мной процессов декодирования команд и прочих тонкостей работу ЦПУ. Как выяснилось, мой даташит CPU Programming Manual был неполным, в Сети нашёл такой же, но с дополнительным обширным разделом "Instruction pipelining", где на добрый десяток страниц рассказано, как осуществляются все эти decode, fetch, execute и прочее. Причём в зависимости от порядка следования команд время на исполнение может быть разным. Предстоит всё это понять, может, и найду, где загвоздка. А пока послушаю, может, кто что посоветует... :)

Изменено пользователем evil_laugh

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Предположения есть.

Вопрос первый: откуда Вы знаете, что тактовая переключилась именно на 125 кГц? Требуется независимое подтверждение.

Вопрос второй: откуда Вы знаете частоту таймера для расчёта времени выполнения программы? Требуется независимое подтверждение.

Вопрос третий: как измеряем время выполнения NOP?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, это солидная пища для размышлений.

 

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

 

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

 

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

 

Про осциллограф идея хорошая, так я и поступлю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отладка - зло.

Оптимальнее сделать как предложил scifi, я так и делал :)

Вот документ по которому проще понять как работает конвейер команд

ziblog.ru/wp-content/plugins/download-monitor/download.php?id=48

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тактовая переключилась на 125 кГц исходя из даташита, по которому я её переключал.

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Спасибо за ценное указание! А не затруднит ли Вас коротко озвучить несколько самых распространённых причин того, почему такое измерение может быть ошибочно?.. Хотелось бы понять, в целях расширения познаний по предмету. Спасибо :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не затруднит ли Вас коротко озвучить несколько самых распространённых причин того, почему такое измерение может быть ошибочно?..

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне казалось, что и таймер, и процессор тактируются одной и той же частотой, а именно SYSCLK от генератора, соответственно, должны быть синхроны...

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день всем.

 

Руки снова дошли до изучения STM8, продолжил (а точнее, начал) читать документ CPU Programming Manual. Вот ссылка.

 

У меня сразу же возник миллион вопросов.

 

Рассмотрим самую первую страницу, рассказывающую о том, как работает конвеер команд. Вот она.

 

bcd3e40e368d.png

 

Для наглядности я выделил команды, о которых пойдёт речь, разными цветами.

 

Меня прежде всего заинтересовал вопрос: как производится подсчёт циклов на Decode и Execute? Откуда берутся эти цифры? Открываем описание первой команды LDW. И видим там следующее.

 

82e4f172b7ea.png

 

Написано, что команда занимает минимум 5 циклов. Это вполне соответствует сумме указанных на предыдущей картинке тактов для Decode и Execute: 4 + 1 = 5.

 

Смотрим следующую команду. ADDW, написано, что занимает 2 цикла на декодирование, и 2 на выполнение. Смотрим описание.

 

2a4618a3f3db.png

 

Что за притча? Почему написано, что команда занимает 2 цикла? Ведь 2 цикла на decode + 2 цикла на execute = 4, разве нет? Ничего не понятно.

 

Следующая команда - LD. Кажется, в ней есть ошибка, так как синтаксиса LD A,[30].w в описании не встречается. Квадратная скобка д. б. в другом месте, но это мелочи. Сказано, что занимает 3 цикла на decode и 1 на execute, всего 4. Проверяем.

 

567d87c9cd14.png

 

Всё верно, 4 цикла там, 4 здесь.

 

Вопрос номер один: чего я не понимаю? Может кто-нибудь объяснить доступным языком, где моя ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...