Mintapélda a ccount használatára 64 biten

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.

letöltés C++ fájl

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);
}