• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 МГц может идти только для синтетического пикового исполнения кода.
 
Последнее редактирование:
Сверху Снизу