Подсчитайте такты блока кода во Embedded C - PullRequest
1 голос
/ 19 февраля 2012

Я программирую на Keil Board и пытаюсь подсчитать количество тактов, которые берут для выполнения блок кода внутри функции C.

Есть ли способ получить время с точностью до микросекунд до и после кодового блока, чтобы я мог получить разность и разделить ее на количество тактов в микросекунде для вычисления тактов, потребляемыхblock?

Функция clock () в time.h дает время в секундах, которое даст diff как 0, так как это небольшой кодовый блок, для которого я пытаюсь получить такты.

Если это не хороший способ решить эту проблему, есть ли альтернативы?

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Ознакомьтесь с таймерами в чипе, найдите одну операционную систему / среду, которую вы не использовали, и используйте ее напрямую. Это требует некоторой практики, вам нужно использовать volatiles, чтобы компилятор не переупорядочивал ваш код или не перечитывал таймер. И вам нужно настроить прескалер на таймере, чтобы он получал наиболее практичное разрешение без переворачивания. Итак, начните с большого делителя шкалы, убедитесь, что он не переворачивается, затем сделайте этот делитель короче, пока не достигнете деления на единицу или не достигнете желаемой точности. Если деление на единицу не дает вам достаточно, вы должны вызывать функцию много раз в цикле и время вокруг этого цикла. Помните, что каждый раз, когда вы изменяете свой код для добавления этих измерений, вы можете и будете изменять производительность своего кода, иногда достаточно маленького, чтобы этого не замечать, иногда 10% - 20% или больше. если вы используете кеш, то любая добавляемая или удаляемая строка кода может изменить производительность на двузначные проценты, и вам нужно больше узнать о синхронизации вашего кода на этом этапе.

3 голосов
/ 19 февраля 2012

Лучший способ подсчитать количество тактов во встроенном мире - это использовать осциллограф. Переключите вывод GPIO до и после вашего кодового блока и измерьте время с помощью осциллографа. Измеренное время, умноженное на частоту ЦП, является числом затраченных тактовых циклов ЦП.

1 голос
/ 20 февраля 2012

Вы не указали, какой процессор находится на плате (гораздо важнее, чем марка платы!), Если процессор включает в себя ETM, и у вас есть ULINK-Pro или другой отладчик с поддержкой трассировки, тогда uVision может незаметно профилировать выполнение кода непосредственно на уровне цикла инструкций.

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

Даже без возможности трассировки функция «секундомера» в uVision может напрямую выполнять синхронизацию между двумя точками останова. Секундомер находится в нижней части IDE в строке состояния. Вам необходимо установить тактовую частоту в конфигурации трассировки отладчика, чтобы получать «в реальном времени» от секундомера.

Простой подход, который не требует специальных возможностей отладки или симулятора, заключается в использовании доступного периферийного устройства таймера (или в случае устройств Cortex-M sysclk) для отметки времени начала и конца выполнения раздела кода, или если вы у вас нет доступного ресурса синхронизации, вы можете переключать вывод GPIO и отслеживать его на осциллографе. Эти методы имеют некоторый уровень программных издержек, которых нет в трассировке аппаратного обеспечения или симулятора, что может сделать их непригодными для очень коротких участков кода.

...