flammmable 0 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба Добрый день! Имеется два кода на ассемблере, которые я запускаю на Nucleo-F103RB. Первый: LDR R0, =0x00000000 LDR R1, =0x0000FFFF LDR R2, =GPIOA_ODR turnON: STR R1, [R2] turnOFF: STR R0, [R2] delayDone: B turnON Второй: LDR R0, =0x00000000 LDR R1, =0x0000FFFF LDR R2, =GPIOA_ODR turnON: STR R1, [R2] B turnOFF turnOFF: STR R0, [R2] delayDone: B turnON Я вывел SYSCLK на MCO и подключил один щуп осциллографа к порту А, а другой к MCO. Графики я прилагаю. Инструкции STR у первого кода выполняются с интервалами 2-2-2-4 такта. Соответственно, минимальное время итерации цикла составляет 4 такта среднее время итерации цикла составляет 5 тактов максимальное время итерации цикла составляет 6 тактов Инструкции STR у второго кода выполняются с интервалами 3-3-3-3 такта. То есть минимальное, среднее и максимальное время итерации цикла равны 6 тактам. Видимо, подобное поведение происходит из-за работы системы предсказания ветвления. Документации по детальному алгоритму работы данной системы я не нашёл. Хотелось бы понять, возможно ли как-нибудь посчитать или просимулировать среднее и максимальное время исполнения участка кода (вроде макроса или процедуры) на ассемблере у STM32F103 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба Гуглите про DWT - счетчик сисла машинных циклрв Предсказателя ветвления в CM3 нету, есть только буфер предвыборки, читающий сразу несколько инструкций за раз, а так же есть тормознутая флеш, которая имеет предел быстродействия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба On 10/13/2023 at 2:45 PM, EdgeAligned said: Гуглите про DWT - счетчик сисла машинных циклрв Спасибо за наводку на DWT. Погуглил - здесь про него написано весьма неплохо. Однако я бы хотел узнать несколько другое - как узнать среднее и максимальное время исполнения участка кода? В DWT можно всматриваться N минут. И за это время найти максимальное и среднее число тактов, за которые выполняется участок кода. Но при работе устройства длительностью M минут (M >> N) данные значения могут оказаться иными. Нельзя ли узнать точно, за какое максимальное количество тактов выполняется тот или иной код и быть спокойным, что данный показатель (в отсутствие всяких там прерываний, разумеется) не будет превзойдён никогда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба 19 минут назад, flammmable сказал: возможно ли как-нибудь посчитать Невозможно, если тактовая частота неизвестна, как в Вашем примере. И в чём отличие этой темы от предыдущей? Вам там уже было сказано, что быстродействия памятей разных типов разные, и таблица дана. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба On 10/13/2023 at 2:58 PM, Plain said: Невозможно, если тактовая частота неизвестна, как в Вашем примере. Чтобы вам было проще и понятнее, положим, частота - 8 МГц, от внутреннего HSI, все переключаемые делители в единице. PLL выключен. Температура корпуса микроконтроллера +20 градусов по Цельсию. Атмосферное давление - норма. Солнечная активность - на минимуме. Марс - в созвездии Девы. Вроде всё. On 10/13/2023 at 2:58 PM, Plain said: И в чём отличие этой темы от предыдущей? Вам там уже было сказано, что быстродействия памятей разных типов разные, и таблица дана. Отличие, очевидно, в вопросе - возможно ли посчитать максимальное время исполнения участка кода в тактах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба А вот например если запустите исполнение кода из SRAM (внутренней), то инструкции начнут исполняться неравномерно - то быстрее, то медленнее. Из-за тормозов общей шины. Когда-то давно я интересовался этим и экспериментировал в различных вариациях условий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба On 10/13/2023 at 3:20 PM, EdgeAligned said: А вот например если запустите исполнение кода из SRAM (внутренней), то инструкции начнут исполняться неравномерно - то быстрее, то медленнее. Из-за тормозов общей шины. Когда-то давно я интересовался этим и экспериментировал в различных вариациях условий. Предположим, что условия запуска приведённого кода наименее экзотичны. В том числе, программа исполняется не из SRAM, а из памяти программ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба 19 минут назад, flammmable сказал: Отличие, очевидно, в вопросе - возможно ли посчитать максимальное время исполнения участка кода в тактах? Очевидно, можно, при условии лабораторных наблюдений под микроскопом - т.е. для МК на указанном ядре это отсутствие вообще любых других мастеров на шине, выключенных prefetch и write buffer, при отсутствии прерываний. И так же очевидно, что в условиях реального проекта все вышеозвученные требования соблюсти невозможно, так что в 10000000 раз: избавляйтесь от любого желания что-то детерминировать "в тактах" в CPU такого ранга. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба On 10/13/2023 at 3:27 PM, Arlleex said: избавляйтесь от любого желания что-то детерминировать "в тактах" в CPU такого ранга. А, собственно, почему избавляться? Вот, к примеру, на определённую операцию, которая должна быть выполнена гарантированно и максимально быстро, периодически не хватает времени. Кто виноват в первую очередь: прерывание, другой мастер на шине или не оптимально скомпилированный код? Вы утверждаете, что нужно стать на позицию агностицизма. Но тогда решением остаётся либо повышение частоты, либо "урезание осетра" - ограничение скорости работы критического кода. Частоту не получится повышать до бесконечности. А "урезание"... Ну заявили вы заказчику, что данная операция не будет выполняться на N микросекунд, а будет выполняться за, скажем, 0,7*N микросекунд. А вероятность невыполнения критического кода взяла и не упала до нуля. И до скольки теперь откручивать N ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба 1 час назад, flammmable сказал: от или иной код и быть спокойным, что данный показатель <...> не будет превзойдён никогда? Да, конечно. Код в 50 м.ц. не будет выполняться дольше 1000 м.ц. никогда, можно быть спокойным! 🙂 Таблицы и ссылки на доки ранее давали - садитесь и считайте на счетах каждую инструкцию. (извините, мы считать её не будем) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flammmable 0 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба On 10/13/2023 at 4:02 PM, EdgeAligned said: Код в 50 м.ц. не будет выполняться дольше 1000 м.ц. никогда, можно быть спокойным! Нужно просто взять всего лишь 20-кратный запас по скорости - и всё будет гарантировано хорошо :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба 3 часа назад, flammmable сказал: Инструкции STR у первого кода выполняются с интервалами 2-2-2-4 такта. Соответственно, минимальное время итерации цикла составляет 4 такта среднее время итерации цикла составляет 5 тактов максимальное время итерации цикла составляет 6 тактов Инструкции STR у второго кода выполняются с интервалами 3-3-3-3 такта. То есть минимальное, среднее и максимальное время итерации цикла равны 6 тактам. Не очень понятно о каких тактах речь? Так как и в первом и во втором коде всего по 2 STR, а не 3 или 4. И по идее - две последовательные STR должны исполниться за 2 такта (суммарно). При наличии буфера записи в МК и отсутствии мешающих условий. Есть ли буфер записи в вашем МК? - см. мануал на него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 13 октября, 2023 Опубликовано 13 октября, 2023 · Жалоба 1 час назад, flammmable сказал: нужно стать на позицию Что STM32 аналогичен коммунальной квартире, кухня и нужник в единственном числе на всех жильцов — тактовая частота лишь запас, а быстродействие в целом определяется загрузкой шины и прочих общих ресурсов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться