• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос измерение времени исполнения кода

nikolz

Well-known member
Добрый день,
Есть такая задача.
В модуле ESP или RTL надо получить время исполнения некоторого участка кода с максимальной точностью (минимальным квантам)
Сейчас я измеряю этот интервал так
----------------------
T1=system_get_time();
исполняемый код
T1=system_get_time()-T1;
------------------------
Системное время измеряется с квантом 1 мкс.
Но процессор работает с частотой 160 МГц.
------------------------------------
Вопрос к знатокам:
есть ли какой-то способ измерить время исполнения кода с квантом менее 1 мкс в модулях ESP и RTL ?
-------------------
Спасибо
 
Последнее редактирование:

sharikov

Active member
Последнее редактирование:

pvvx

Активный участник сообщества
Для ESP (Xtensa)
[inline]#define GET_CCOUNT(x) __asm__ __volatile__("rsr.ccount %0" : "=r"(x))[/inline]
Код:
#define GET_CCOUNT(x) __asm__ __volatile__("rsr.ccount %0" : "=r"(x))
  uint32_t tt0, tt1;
  GET_CCOUNT(tt0);
  ...тест...
  GET_CCOUNT(tt1);
  tiks = tt1-tt0;
Для RTL (ARM)
[inline]DWT->CYCCNT[/inline]
Код:
#include "device.h"
uint32_t tt0, tt1;
uint32_t get_cyccnt(void) { return DWT->CYCCNT; }
---
  uint32_t tt0, tt1;
  tt0 = get_cyccnt();
  ...тест...
  tt1 = get_cyccnt();
  tiks = tt1-tt0;
Использовать обертку в сall() или ещё как - это по желанию...
Полные функции с нуля кода для ARM включая ARMv7-M:
Код:
volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000;
volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004;
volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC;
volatile uint32_t *LAR  = (uint32_t *) 0xE0001FB0;   // <-- added lock access register

*DEMCR = *DEMCR | 0x01000000;     // enable trace
*LAR = 0xC5ACCE55;                // <-- added unlock access to DWT (ITM, etc.)registers
*DWT_CYCCNT = 0;                  // clear DWT cycle counter
*DWT_CONTROL = *DWT_CONTROL | 1;  // enable DWT cycle counter
 
Последнее редактирование:

pvvx

Активный участник сообщества
Arduino ESP:
Код:
#define GET_CCOUNT(x) __asm__ __volatile__("rsr.ccount %0" : "=r"(x))
uint32_t delta_tt = 0;
void setup() {
  uint32_t tt = 0, tt1, tt2;
  Serial.begin(115200);
  delay(10); // синхронизация
  for (int i = 0; i < 1024; i++) {
    GET_CCOUNT(tt1);
    GET_CCOUNT(tt2);
    delta_tt += tt2 - tt1;
  }
  delta_tt /= 1024;
  Serial.print("Get CCOUNT = ");  Serial.print(delta_tt);  Serial.println(" tik.");
}

void loop() {
  uint32_t tt1, tt2;
  delay(10); // синхронизация
  GET_CCOUNT(tt1);
  delay(100);
  GET_CCOUNT(tt2);
  tt = tt2 - tt1 - delta_tt;
  float fcpu_mhz = (float)tt / 100000.0;
  Serial.print("100 ms = "); Serial.print(tt); Serial.print(" tiks -> CLK CPU ");  Serial.print(fcpu_mhz, 3);  Serial.println(" MHz ?");
}
Лог:
Код:
Get CCOUNT = 1 tik.
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz
 

pvvx

Активный участник сообщества
Есть такая задача.
В модуле ESP или RTL надо получить время исполнения некоторого участка кода с максимальной точностью (минимальным квантам)
Время исполнения для ESP разнится от наличия кода в "кэш" XIP и составляет 20 раз. Т.к. "кэш" XIP у ESP постоянно переполняется в SDK и включенного WiFi из-за жирного кода - время исполнения будет бить в 20 раз от погоды в Espressif...
На RTL серии "A" XIP нет - различий времени исполнения нет. Различия будут только от того где размещена процедура - в TCM RAM, или в SDRAM, или в SDRAM. TCM и ROM не имеет тактов задержек. SDRAM - имеет, но только на кратность обращения (вроде при не align(4) добавит 1 такт на блок). SDRAM тактируется 100 МГц, имеет рефреш, да шина всего 16 бит. Там задержки большие и определяются компоновкой кода...
На RTL серии "B" XIP есть. Flash на QIO и 100 МГц, что быстрее в 2 раза ESP-32 при отсутствии кода в "кэш" XIP (для ядра, как и у EPS - по 32 килобайта). Т.к. основной API находится в ROM, то в "кэш" XIP лезет всё и обращений на продгрузку при включенном WiFi у среднего приложения нет.
Код у RTL-ок может быть размещен в любую память, в отличии от ESP.

В итоге ESP32 при отсутствии "закэшированного" кода превращается в CPU с 12..16 МГц и разговор о 240 МГц может идти только для синтетического пикового исполнения кода.
 
Последнее редактирование:
Сверху Снизу