Az alábbi mintaprogram egy nagyfelbontású számláló használatát mutatja ESP32-n.
Van az ESP32-nem egy számlálója, ami az ESP32 80 MHz-es órajeleit számlálja.
Ez használható a felhasználók által is, de regiszter címről nem érhető el.
A mikroprocesszor speciális utasítása olvassa, ezért csak gépi kódú programmal olvasható.
A baj az, hogy ez csak 32 bites, és elég gyorsan túlcsordul, ezért én egy kiegészítéssel használom, ami lekezeli a túlcsordulást, és így már 64 bites lesz.
typedef union konv {
uint64_t v64bit = 0 ;
struct {
uint32_t low32bit ;
uint32_t hi32bit ;
} s32bit;
struct {
uint16_t low32bit_low16bit ;
uint16_t low32bit_hi16bit ;
uint16_t hi32bit_low16bit ;
uint16_t hi32bit_hi16bit ;
} s16bit;
uint8_t v8bit[8];
};
uint64_t getCycleCount64() {
static uint32_t CycleCount32 = 0 ;
static konv CycleCount64 ;
// 3 sor irodalmi
static uint32_t ccount;
__asm__ __volatile__("esync; rsr %0,ccount":"=a" (ccount));
CycleCount32 = ccount ;
if (CycleCount64.s32bit.low32bit > CycleCount32 ) {
CycleCount64.s32bit.hi32bit++ ;
};
CycleCount64.s32bit.low32bit = CycleCount32 ;
return CycleCount64.v64bit ;
} ;
static konv myccount ;
void setup() {
delay(1000);
Serial.begin(115200) ;
delay(1000);
Serial.print("CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ = ");
Serial.println(CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ);
Serial.println();
}
void loop() {
myccount.v64bit = getCycleCount64() ;
//Serial.println(getCycleCount64()) ;
Serial.print("getCycleCount64() = ");
Serial.print(myccount.s32bit.hi32bit);
Serial.print("*(0xFFFFFFFF)+");
Serial.println(myccount.s32bit.low32bit);
Serial.print(" xthal_get_ccount = ");
Serial.println(xthal_get_ccount());
Serial.print("portGET_RUN_TIME_COUNTER_VALUE() = ");
Serial.println(portGET_RUN_TIME_COUNTER_VALUE());
Serial.println();
delay(1000);
}