ESP32 синхронизация переменных при 2 ядерном режиме работы процессора

В качестве примера работы 2 ядер платы ESP32 обычно приводится пример работы двух независимых программ по одной на каждом ядре. Но я не встречал примера работы, когда программа на одном ядре передает значение переменных программе на другом ядре.
В общем у меня вопрос. Переменная С1 считается на 1 ядре. Переменная Т1 считается на втором ядре. Как на 2 ядре вывести одновременно значение переменных С1 и Т1? У меня Т1 выводится, а С1 =0.

TaskHandle_t Task0;                                                                   //
uint32_t c1;                                                                          //
uint64_t t1,led;                                                                      //
//------------------------------------------------------------------------------------//
void setup()                                                                          //
{                                                                                     //
  disableCore0WDT();                                                                  //
  Serial.begin(115200);                                                               //
  //create a task that will be executed in the Task0code() function                   //
  xTaskCreatePinnedToCore                                                             //
  (                                                                                   //
     Task0code,   //Функция для реализации задачи                                     //
     "Task0",     //Название задачи                                                   //
     10000,       //Размер стека                                                      //
     NULL,        //Входной параметр задачи                                           //
     1,           //Приоритет задачи                                                  //
     &Task0,      //Дескриптор задачи                                                 //
     0            //Ядро, в котором должна выполняться задача                         //
  );                                                                                  //
}                                                                                     //
//Task0code: -------------------------------------------------------------------------//
void Task0code( void * pvParameters )                                                 //
{                                                                                     //
  for(;;)                                                                             //
  {c1 = esp_cpu_get_cycle_count();}                                                   //
}                                                                                     //
//------------------------------------------------------------------------------------//
void loop()                                                                           //
{                                                                                     //
    t1 = esp_timer_get_time()/1000; //количество милисекунд                           //
  if ((t1-led)>=1000)                                                                 //
  {                                                                                   //
    led=t1;                                                                           //
    Serial.print(" t1= ");Serial.print(t1);Serial.print(" c1= ");Serial.println(c1);  //
    }                                                                                 //
}                                                                                     //

Т.е. одна глобальная переменная в функции видна, а вторая не видна? Чудно как.

Нет, ну можно через pvParameter передавать, через очередь сообщений…

Волатильной ее объявить, может?

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

вполне возможно, что компилятор намудрил: переменная напрямую нигде не меняется, функция ее использцющая напрямую не вызывается. скорее всего volatile поможет

с этими компиляторами так, вот буквально сегодня пришлось вписать if(i) i=true; )))

А так не помогает?
i = !!i;

1 лайк

Вопрос решен. Добавил volatile.
Вторая строка программы стала: volatile uint32_t c1; и все заработало.

Ну так и отметь соответствующий пост кнопкой “Вопрос решен”:

не знаю, не пробовал, по идее должно )))