evil_laugh 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Доброго врем времени суток! Ковыряю 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 1 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Эксперимент показал, что при разной тактовой частоте ядра команды исполняются за разное количество тактов (отсчитываю по таймеру1 без предделителя). Это ещё ни о чём не говорит. Вот недавно у кого-то эксперимент показал, что нейтрино летает быстрее света. Потом разобрались, нашли ошибку. Вот и Вы поищите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evil_laugh 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 (изменено) · Жалоба scifi, я бы и рад поискать, да я с этими контроллерами общаюсь сравнительно недавно и толком не знаю, где могла вкрасться ошибка. Казалось бы, ничего необычного - есть код, циклически выполняющий команду NOP. Если перед ним поставить переключение тактовой на 125 кГц - таймер считает по 2 такта на команду. Если оставить как есть, 2 МГц (после ресета) - считает по 1 такту на ноп. Чудеса :) У Вас есть какие-нибудь предположения? Есть два предположения: либо это связано с отладчиком (т. е. он добавляет какие-то свои промежуточные инструкции в код), либо это связано с непониманием мной процессов декодирования команд и прочих тонкостей работу ЦПУ. Как выяснилось, мой даташит CPU Programming Manual был неполным, в Сети нашёл такой же, но с дополнительным обширным разделом "Instruction pipelining", где на добрый десяток страниц рассказано, как осуществляются все эти decode, fetch, execute и прочее. Причём в зависимости от порядка следования команд время на исполнение может быть разным. Предстоит всё это понять, может, и найду, где загвоздка. А пока послушаю, может, кто что посоветует... :) Изменено 4 ноября, 2011 пользователем evil_laugh Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Казалось бы, ничего необычного - есть код, циклически выполняющий команду NOP. Если перед ним поставить переключение тактовой на 125 кГц - таймер считает по 2 такта на команду. Если оставить как есть, 2 МГц (после ресета) - считает по 1 такту на ноп. Чудеса :) У Вас есть какие-нибудь предположения? Предположения есть. Вопрос первый: откуда Вы знаете, что тактовая переключилась именно на 125 кГц? Требуется независимое подтверждение. Вопрос второй: откуда Вы знаете частоту таймера для расчёта времени выполнения программы? Требуется независимое подтверждение. Вопрос третий: как измеряем время выполнения NOP? Я бы сделал так: цикл с большим числом итераций, в теле цикла - 100 NOP подряд. В начале и конце цикла дёргаем ножку. Тогда время выполнения цикла можно измерить осциллографом, а не таймером (насчёт рабочей частоты которого, как сказано выше, есть сомнения). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evil_laugh 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Спасибо, это солидная пища для размышлений. Тактовая переключилась на 125 кГц исходя из даташита, по которому я её переключал. Да ведь по идее неважно, какая тактовая, хоть 1 Гц. Выполнение инструкции по ДШ всё равно будет занимать 1 такт. Нет? У меня подозрения, что вполне возможно, что это не так, ведь исходя из мельком прочитанного мной в ДШ, выполнение инструкции может занимать разное число тактов в зависимости от их порядка и положения во флэш-памяти. Это стоит изучить, я мог неправильно всё понять... С таймером всё то же самое: посмотрел даташит и выставил битики соответственно. :) частота у него равна подаваемой на ядро - SYSCLK. Время исполнения NOP измеряю так: нажимаю кнопочку F11 (Step) и смотрю разницу в значении таймера до выполнения команды и после. Про осциллограф идея хорошая, так я и поступлю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZiB 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Отладка - зло. Оптимальнее сделать как предложил scifi, я так и делал :) Вот документ по которому проще понять как работает конвейер команд ziblog.ru/wp-content/plugins/download-monitor/download.php?id=48 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Тактовая переключилась на 125 кГц исходя из даташита, по которому я её переключал. С точностью до ошибок в коде. Мы все люди. Время исполнения NOP измеряю так: нажимаю кнопочку F11 (Step) и смотрю разницу в значении таймера до выполнения команды и после. За такое измерение Вас следует подвергнуть страшному наказанию. Есть миллион причин, почему так делать не следует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evil_laugh 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба ZiB, благодарю за информацию, документ весьма полезен. Буду изучать и сопоставлять его с даташитом. scifi, я перепроверю код ещё раз. Но судя по частоте мигания диодиком, которую отсчитывает таймер (раз в секунду) тактовая похожа на указанную в ДШ. За такое измерение Вас следует подвергнуть страшному наказанию. Есть миллион причин, почему так делать не следует. Спасибо за ценное указание! А не затруднит ли Вас коротко озвучить несколько самых распространённых причин того, почему такое измерение может быть ошибочно?.. Хотелось бы понять, в целях расширения познаний по предмету. Спасибо :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба А не затруднит ли Вас коротко озвучить несколько самых распространённых причин того, почему такое измерение может быть ошибочно?.. Такой способ измерения предполагает, что при остановке/запуске программы отладчиком процессор и таймер останавливаются/запускаются синхронно с точностью до последнего такта. Такое предположение скорее всего неверно. Хотя бы потому, что процессор и таймер тактируются от разных частот, а остановиться они могут только на границе такта (у каждого своей длительности). Да и вообще точная структура схемы этой синхронизации неизвестна и на самом деле никому не интересна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evil_laugh 0 4 ноября, 2011 Опубликовано 4 ноября, 2011 · Жалоба Мне казалось, что и таймер, и процессор тактируются одной и той же частотой, а именно SYSCLK от генератора, соответственно, должны быть синхроны... Ну да ладно, впрочем, осциллограф покажет :) Печально только то, что если мне, например, потребуется реализовать задержку NOP-ом, или подсчитать время выполнения подпрограммы - я не смогу без осциллографа понять, сколько оно будет составлять, ибо отладчик вкупе с таймером, как оказывается, могут показывать не совсем то, что нужно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evil_laugh 0 16 ноября, 2011 Опубликовано 16 ноября, 2011 · Жалоба Добрый день всем. Руки снова дошли до изучения 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 здесь. Вопрос номер один: чего я не понимаю? Может кто-нибудь объяснить доступным языком, где моя ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться