Преобразование переменной uint_32 в uint_64

Плата ESP32. Переменная uint32_t c1 показывает сколько тактов процессора прошло с момента включения. При частоте процессора 240 мГц данная переменная переполняется раз в 17 секунд. Как получить новую переменную uint64_t , которая бы отображала количество тактов процессора без переполнения?

void setup()                                 
{ Serial.begin(115200); }                     
uint32_t c1;                                  
//--------------------------------------------
void loop()                                   
{                                             
c1 = esp_cpu_get_cycle_count();               
Serial.print( "T1 = ");Serial.print(micros());
Serial.print(" F1 = ");Serial.println(c1/240);
delay(1000);                                  
}                                             

Обьявление переменой в одной фунции, а использование в другой?

В есп32 свой чистый С?

Извиняюсь не заметил скобочку😊

А если сразу объявить
uint64_t c1;

А в чем смысл, если esp_cpu_get_cycle_count
возвращает uint32_t?

@Buldakov в чем задача состоит?

При каждом переполнении с1 инкрементировать другую переменную uint32_t слишком сложно?

Самое сложное узнать что переменная С1 переполнилась. Например ее значение в предыдущий момент времени было 4 000 000 000 , а теперь значение переменной 25 000 000. Ясно дело, что переменная переполнилась. Вопрос только сколько раз. Может быть один, а может быть два.

Это не может быть сложным.
Никак!
Просто есть условия, при которых это сделать очень просто, и есть условия, при которых это сделать невозможно.
Очевидно, наличие альтернативного счетчика с меньшей частотой изменения (например, millis) относится к первому случаю, хотя этот вариант тоже не гарантирован от переполнения (той же самое millis).

То есть есть мысль поставить 2 переменные. Одна считает такты процессора. А вторая считает микросекунды. Примерно так?

Это зависит от того, что имеется и что хочется получить.
Озвучте условия и попытаемся подобрать оптимальный вариант.
Но микросекунды ни в каком варианте оптимальными не будут.

Надо получить переменную С2. Примерно набросал условия.Вроде работает и даже правильно считает. Но только одно условие, чтобы с1 вызывалось хотябы несколько раз в 17 секунд.

void setup()                                   //
{ Serial.begin(115200); }                      //
uint32_t c1;                                   //
uint32_t c1_old;                               //
uint64_t t1;                                   //
uint64_t c2;                                   //
//---------------------------------------------//
void loop()                                    //
{                                              //
t1 = esp_timer_get_time();                     //
c1 = esp_cpu_get_cycle_count();                //
if (c1>c1_old) c2=c2+c1-c1_old;                //
if (c1<c1_old) c2=c2+c1-c1_old+4294967296;     //
c1_old=c1;                                     //
Serial.print( "Time = ");Serial.print (t1);    //
Serial.print(" F = ");Serial.print    (c2);    //
Serial.print(" FRQ = ");Serial.println(c1);    //
delay(1000);                                   //
}                                              //

Что за контроллер? У него случайно, нет прерывания по переполнению этого счетчика?

Че хочет человек?
millis/micros через такты получить, так там есть функция где все проще.

@Buldakov
имейте в виду, что

действительна только для конкретного ядра, а не для всего МК в целом

Вот ещё ваиант

Спойлер
void setup()                                   //
{ Serial.begin(115200); }                      //
uint32_t c1;                                   //
uint32_t c1_old = 0;                               //
uint64_t t1 = 0;                                   //
uint64_t c2;                                   //
//---------------------------------------------//
void loop()                                    //
{                                              //
                     //
c1 = esp_cpu_get_cycle_count(); 
t1 += (c1 - c1_old);              //
c1_old=c1; 
                                    //
Serial.print( "Time = ");Serial.print (t1);    //
Serial.print(" c1 = ");Serial.println    (c1);    //
//Serial.print(" FRQ = ");Serial.println(c1);    //
delay(1000);                                   //
}                                              //

И что будет когда
c1_old = 0xfffffffe например, а c1 стало 0x000000ff ??

Нормально будет, ведь unsigned. Вот первые два значения пока не продумал, отбросить надо. Сейчас уже занят буду, может позже

Спойлер
void setup()                                   //
{ Serial.begin(115200); }                      //
uint32_t c1;                                   //
uint32_t c1_old = 0;                               //
uint64_t t1 = 0;                                   //
uint64_t t1_old = 0;                                   //
//---------------------------------------------//
void loop()                                    //
{                                              //
                     //
c1 = esp_cpu_get_cycle_count(); 
t1 += (c1 - c1_old);              //
c1_old=c1; 
                                    //
Serial.print( "Time = ");Serial.print (t1);    //
Serial.print(" c1 = ");Serial.print  (c1);    //
Serial.print("  check  = ");Serial.println(t1 - t1_old);    //
delay(3000);  
t1_old = t1;                                 //
}                                              //
Спойлер

Ок, завтра тоже посмотрю.
Думаю там потуги совершено в другом…
И такты считать совсем не обязательно.

Первое надо отбросить, т.к вычитать пока нечего.
А почему второе немного больше “натикивает” - не могу понять, уже засыпаю… Будет время, может завтра разберусь.
Но в любом случае к подсчёту это не относится, подсчёт верный.

Спойлер
void setup()                                   //
{
  Serial.begin(115200);  //
}
                                  //
//---------------------------------------------//
void loop()                                    //
{ //
  static uint32_t c1;
  static uint64_t t1_old = 0;
  static uint64_t t1 = 0;
  static bool start = true;
  static uint32_t num = 0;
  static uint32_t  c1_old = 0;

  c1 = esp_cpu_get_cycle_count();
  t1 += (c1 - c1_old);              //
  c1_old = c1;
  
    Serial.print(num);                                   //
    Serial.print( ".Time = "); Serial.print (t1);   //
    Serial.print("  c1 = "); Serial.print(c1);   //

   if (!start)
  { 
    Serial.print("  Time-Time_Old  = "); Serial.println(t1 - t1_old);   //
  }
  else
  {
    Serial.println();
  }
  delay(3000);
  num++;
  t1_old = t1;
  start = false;                               //
}                                              //
Спойлер

Переполнение с1

Спойлер

Тут код упрощенный. Такты я считаю для конкретного ядра. А почему считаю такты - поскольку они работают с максимальной частотой, а другие таймеры вроде с частотой не больше 40 мГц. Ну и второе для работы с обычными таймерами у меня не ставится ни одна библиотека. На настройку таймера выдает ошибки. Пытаюсь читать значение тактов таймера командой esp_err_t timer_get_counter_value(). Поэтому такты процессора единственный таймер, который получилось запустить.