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

Как посчитать время выполнения ассемблерных инструкций?

Добрый день!
Имеется два кода на ассемблере, которые я запускаю на 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 ?

first.png

second.png

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


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

Гуглите про DWT - счетчик сисла машинных циклрв

Предсказателя ветвления в CM3 нету, есть только буфер предвыборки, читающий сразу несколько инструкций за раз, а так же есть тормознутая флеш, которая имеет предел быстродействия. 

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


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

On 10/13/2023 at 2:45 PM, EdgeAligned said:

Гуглите про DWT - счетчик сисла машинных циклрв

Спасибо за наводку на DWT. Погуглил - здесь про него написано весьма неплохо.
Однако я бы хотел узнать несколько другое - как узнать среднее и максимальное время исполнения участка кода? В DWT можно всматриваться N минут. И за это время найти максимальное и среднее число тактов, за которые выполняется участок кода. Но при работе устройства длительностью M минут (M >> N) данные значения могут оказаться иными. Нельзя ли узнать точно, за какое максимальное количество тактов выполняется тот или иной код и быть спокойным, что данный показатель (в отсутствие всяких там прерываний, разумеется) не будет превзойдён никогда?

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


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

19 минут назад, flammmable сказал:

возможно ли как-нибудь посчитать

Невозможно, если тактовая частота неизвестна, как в Вашем примере.

И в чём отличие этой темы от предыдущей? Вам там уже было сказано, что быстродействия памятей разных типов разные, и таблица дана.

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


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

On 10/13/2023 at 2:58 PM, Plain said:

Невозможно, если тактовая частота неизвестна, как в Вашем примере.

Чтобы вам было проще и понятнее, положим, частота - 8 МГц, от внутреннего HSI, все переключаемые делители в единице. PLL выключен. Температура корпуса микроконтроллера +20 градусов по Цельсию. Атмосферное давление - норма. Солнечная активность - на минимуме. Марс - в созвездии Девы. Вроде всё.

On 10/13/2023 at 2:58 PM, Plain said:

И в чём отличие этой темы от предыдущей? Вам там уже было сказано, что быстродействия памятей разных типов разные, и таблица дана.

Отличие, очевидно, в вопросе - возможно ли посчитать максимальное время исполнения участка кода в тактах?

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


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

А вот например если запустите исполнение кода из SRAM (внутренней), то инструкции начнут исполняться неравномерно - то быстрее, то медленнее. Из-за тормозов общей шины. Когда-то давно я интересовался этим и экспериментировал в различных вариациях условий. 

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


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

On 10/13/2023 at 3:20 PM, EdgeAligned said:

А вот например если запустите исполнение кода из SRAM (внутренней), то инструкции начнут исполняться неравномерно - то быстрее, то медленнее. Из-за тормозов общей шины. Когда-то давно я интересовался этим и экспериментировал в различных вариациях условий. 

Предположим, что условия запуска приведённого кода наименее экзотичны. В том числе, программа исполняется не из SRAM, а из памяти программ.

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


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

19 минут назад, flammmable сказал:

Отличие, очевидно, в вопросе - возможно ли посчитать максимальное время исполнения участка кода в тактах?

Очевидно, можно, при условии лабораторных наблюдений под микроскопом - т.е. для МК на указанном ядре это отсутствие вообще любых других мастеров на шине, выключенных prefetch и write buffer, при отсутствии прерываний.

И так же очевидно, что в условиях реального проекта все вышеозвученные требования соблюсти невозможно, так что в 10000000 раз: избавляйтесь от любого желания что-то детерминировать "в тактах" в CPU такого ранга.

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


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

On 10/13/2023 at 3:27 PM, Arlleex said:

избавляйтесь от любого желания что-то детерминировать "в тактах" в CPU такого ранга.

А, собственно, почему избавляться? Вот, к примеру, на определённую операцию, которая должна быть выполнена гарантированно и максимально быстро, периодически не хватает времени. Кто виноват в первую очередь: прерывание, другой мастер на шине или не оптимально скомпилированный код? Вы утверждаете, что нужно стать на позицию агностицизма. Но тогда решением остаётся либо повышение частоты, либо "урезание осетра" - ограничение скорости работы критического кода. Частоту не получится повышать до бесконечности. А "урезание"... Ну заявили вы заказчику, что данная операция не будет выполняться на N микросекунд, а будет выполняться за, скажем, 0,7*N микросекунд. А вероятность невыполнения критического кода взяла и не упала до нуля. И до скольки теперь откручивать N ?

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


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

1 час назад, flammmable сказал:

от или иной код и быть спокойным, что данный показатель <...> не будет превзойдён никогда?

Да, конечно. Код в 50 м.ц. не будет выполняться дольше 1000 м.ц. никогда, можно быть спокойным! 🙂

Таблицы и ссылки на доки ранее давали - садитесь и считайте на счетах каждую инструкцию. (извините, мы считать её не будем)

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


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

On 10/13/2023 at 4:02 PM, EdgeAligned said:

Код в 50 м.ц. не будет выполняться дольше 1000 м.ц. никогда, можно быть спокойным!

Нужно просто взять всего лишь 20-кратный запас по скорости - и всё будет гарантировано хорошо :)

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


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

3 часа назад, flammmable сказал:

Инструкции STR у первого кода выполняются с интервалами 2-2-2-4 такта. Соответственно,
минимальное время итерации цикла составляет 4 такта
среднее время итерации цикла составляет 5 тактов
максимальное время итерации цикла составляет 6 тактов

Инструкции STR у второго кода выполняются с интервалами 3-3-3-3 такта.
То есть минимальное, среднее и максимальное время итерации цикла равны 6 тактам.

Не очень понятно о каких тактах речь? Так как и в первом и во втором коде всего по 2 STR, а не 3 или 4.

И по идее - две последовательные STR должны исполниться за 2 такта (суммарно). При наличии буфера записи в МК и отсутствии мешающих условий. Есть ли буфер записи в вашем МК? - см. мануал на него.

 

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


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

1 час назад, flammmable сказал:

нужно стать на позицию

Что STM32 аналогичен коммунальной квартире, кухня и нужник в единственном числе на всех жильцов — тактовая частота лишь запас, а быстродействие в целом определяется загрузкой шины и прочих общих ресурсов.

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


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

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

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

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

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

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

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

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

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

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