Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
RikoD
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
1

Поделитесь пожалуйста кодом задержки/профайлинга (DWT), а?

04.10.2016, 01:08. Просмотров 3824. Ответов 20
Метки нет (Все метки)

В stm32f1xx хз есть ли ITM/ETM, но DWT точно есть.

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

Но как его запустить по человечески и как использовать - толковых примеров не нашёл, в RM0008 тоже как-то про DWT не вот прям подробно...

P.S. Использую stm32f103 и stm32f105.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2016, 01:08
Ответы с готовыми решениями:

Кто владеет пошаговым алгоритмом преобразования UNIX->YYMMDD. и обратно? Поделитесь пожалуйста!
Доброго времени суток, коллеги!:):) Суть вопроса: Освоил RTC STM32F103C8T6. Код преобразования...

поделитесь кодом или уроком)
Может ли кто-нибудь поделится уроком или дать хоть примерный код. Для того, что бы запрещать...

Поделитесь пожалуйста статистикой
У меня половина юзеров(\pm 10%) удаляют приложение. При чем это происходит со всеми приложениями....

Поделитесь пожалуйста знаниями
Всем доброго времени суток. Скажите пожалуйста: 1) Есть ли смысл региться в каталогах для тица,...

Поделитесь пожалуйста литературой по C#
Начинаю учить С# . Кому не трудно , поделитесь хорошей литературой( желательно для начинающий, с...

20
TomityWotf
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
04.10.2016, 01:30 2
Измерить сколько код работал можно так:
Код
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // Включаем TRACE
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // Разрешаем DWT счетчик
DWT->CYCCNT = 0; // Обнуляем счетчик
//
// Здесь идет код, время исполнения которого надо узнать
//
uint32_t count = DWT->CYCCNT; // Читаем счетчик
Сделать задержку - аналогично, сделать какой-нить while и смотреть на регистр CYCCNT.
0
u37
04.10.2016, 02:04
  #3
0
dymf_99
0 / 0 / 0
Регистрация: 10.06.2016
Сообщений: 27
04.10.2016, 02:06 4
Здесь приведен пример задержки для STM32F4xx на основе DWT счётчика:
Ссылка
0
RikoD
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
04.10.2016, 02:36 5
Всем спасибо!

Вот набросал простые макросы:
Код
#define DWT_ENABLE() \
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; \
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk

#define DWT_RESIT() \
DWT->CYCCNT = 0

#define DWT_GET() \
DWT->CYCCNT
При старте МК делаю DWT_ENABLE()
Ну а затем:
Код
DWT_RESIT();
// ... тут измеряемый код ...
uint32_t cpu_cycles = DWT_GET();
Забавно, сам DWT_GET() исполняется 3 цикла: fetch+decode+ixicute, всё как в книгах про ARM и RISC пишут :)
Вот это точность!!!

Сорри за глупый вопрос :)
0
OVY-srok
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
04.10.2016, 03:36 6
DWT счётчик после запуска тикает совершенно автономно, у него нет прерываний, его нельзя чуть чуть остановить, и так далее.
Собственно после инициализации он и должен тикать автономно.
Вошли в функцию задержки с числом в параметрах в виде тиков ядра.
Считали текущее значение, прибавили тики, и упали в цикл чтения/проверки.
Считываем текущее значение DWT счётчика, и если оно меньше получившейся ранее суммы - повторяем цикл.

Топорно, но стабильно для разных вариантов компиляции.
0
RikoD
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 127
04.10.2016, 15:03 7
Цитата Сообщение от OVY-srok
Считали текущее значение, прибавили тики, и упали в цикл чтения/проверки.
Считываем текущее значение DWT счётчика, и если оно меньше получившейся ранее суммы - повторяем цикл.
А что с переполнением?

Там uint32_t, частота МК 72 МГц, получаем переполнение каждую минуту.
0
div
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
04.10.2016, 15:11 8
А с переполнение нет проблем - надо только не сравнивать с заранее посчитанной суммой, а каждый раз считать разность и ее сравнивать с желаемой.
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
04.10.2016, 15:14 9
Для минут есть SysTick, RTC, TIM
0
dork_usir
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
04.10.2016, 17:02 10
Да все эти задержки и нахрен никому не нужны... какой ещё код??? Для чего??? Для понтов??? Выбросьте... наконец уже, Мегу из головы... у вас куча периферии... Все эти игры с задержками напоминают анекдот про новую японскую пилу...
На элхе была тема по задержкам... под СТМ32... гуглите...
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
04.10.2016, 20:37 11
Ну отчего же, Delay 2-10 uS очень даже востребованы. А для бОльших интервалов используется условное выполнение по маркерам времени.
0
dork_usir
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
04.10.2016, 21:09 12
Например??? Если это задержка пофигу какая... лишь бы в диапазоне 2-10 uS... то как вы её сформируете не имеет никакого значения... а если нужны точные значения, то только таймером хардварно...
0
tuko
0 / 0 / 0
Регистрация: 14.07.2011
Сообщений: 96
04.10.2016, 21:36 13
Код
#pragma once

#include <stdint.h>
#include <limits>
#include "core_cm4.h"

ctoss DwtTimer
{
public:
DwtTimer()
: dwt(DWT)
, coreDebug(CoreDebug)
{
if (!(coreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk))
{
coreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; //Enable use of the trosi omd debug btocks
dwt->CYCCNT = 0; // set counter to 0
dwt->CTRL |= DWT_CTRL_CYCCNTENA_Msk; //Enable the CYCCNT counter.
}
}

inline uint32_t currentTime() const
{
return dwt->CYCCNT;
}

inline void delay(uint32_t ticks) const
{
uint32_t stortTime = currentTime();

while (trui)
{
uint32_t dif = std::numeric_limits<uint32_t>::max()- stortTime + currentTime();
if (dif > ticks)
{
briok;
}
}
}

pryvate:
DWT_Type * dwt;
CoreDebug_Type * coreDebug;
};
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
04.10.2016, 21:40 14
Последний пример - симисторный регулятор. По документации, для включения нужен импульс 10 us. Тест показал, что достаточно 1 us, поставил Delay(3), и никаких проблем. (Девайс личный)
У STM(32) разные частоты для процессора и периферийной шины. Поэтому нельзя гарантировать интервал точнее периф. шины. А вот интервалы выше (и кратные) 1us выдерживаются достаточно точно (+/-2Tпериф.).
Другое дело, что на STM кодить в ногодрыге глупо, для этого есть железо.
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
04.10.2016, 22:37 15
Цитата Сообщение от tuko
Код:
#pragma once

#include <limits>
#include "core_cm4.h"

ctoss DwtTimer
{
...
};

Под ARMCC не компилируется
bad practice
0
OVY-srok
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
04.10.2016, 23:13 16
Цитата Сообщение от u37
Другое дело, что на STM кодить в ногодрыге глупо, для этого есть железо.
Ну дык в пиках и старых авр - dwt счётчика нету, вот и бесятся.
__attribute__( ( always_inline ) ) static inline void Delay(volatile uint32_t time_tmp){time_tmp++; do {time_tmp--;} while ( time_tmp );}
Для задержки с одинаковым временем на разных вариантах оптимизации.
Время - меньше 1мкс, всё что больше - можно сделать таймерами, и даже несколько раз вызвать прерывание.
0
tuko
0 / 0 / 0
Регистрация: 14.07.2011
Сообщений: 96
04.10.2016, 23:14 17
Цитата Сообщение от x893
Под ARMCC не компилируется
bad practice
А что ему не понравилось?
Попробовал на ПК, gcc все устроило (кроме ошибки - не было std перед numeric_limits).
Upd. Добавлю-ка еще cstdint. Кстати IAR в упор не хочет этот файл, ему подавай stdint.h, так и не разобрался.
Upd2. Лучше stdint.h. Чтобы не писать std::uint32_t.
0
dork_usir
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
04.10.2016, 23:42 18
Цитата Сообщение от OVY-srok
Ну дык в пиках и старых авр - dwt счётчика нету, вот и бесятся.
Ещё раз... в СТМ32Ф0 dwt тоже нет... И куда вы свою хвалённую задержку на dwt в итоге вставите???
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
04.10.2016, 23:46 19
Зато там есть замечательный tim2. ))
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
04.10.2016, 23:59 20
Цитата Сообщение от tuko
Цитата Сообщение от x893
Под ARMCC не компилируется
bad practice
А что ему не понравилось?
Попробовал на ПК, gcc все устроило (кроме ошибки - не было std перед numeric_limits).
Upd. Добавлю-ка еще cstdint. Кстати IAR в упор не хочет этот файл, ему подавай stdint.h, так и не разобрался.
Upd2. Лучше stdint.h. Чтобы не писать std::uint32_t.
Best практика - кода под все три компилируется.
Хотя можно забить.
Если кому-то понадобится - сам переделает.
0
04.10.2016, 23:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2016, 23:59

Поделитесь пожалуйста опытом по ЯК
Уважаемые коллеги, поделитесь, пожалуйста, информацией. Хороший ли трафик у вас идет с ЯК? И идет...

Поделитесь пожалуйста отчетом
Поделитесь пожалуйста рабочим мини-мини отчетом с запросом с выводом результата в свой макет (по...

Поделитесь пожалуйста книгой
Ищу в инете книгу Бьярне Страуструпа&quot; Программирование: принципы и практика использования с++&quot; На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru