[英]ESP32 not updating the variable when multiple cores are used
我的计划是从 ESP32 的CORE-1
收集数据,并将 ESP32 的CORE-0
用于所有其他任务。 但是,我发现使用多个内核时变量没有正确更新。 在此示例中,我看到getAllData
的值仅更新一次。
const TickType_t xDelay = 1000 / portTICK_PERIOD_MS;
TaskHandle_t collectData;
bool volatile getAllData;
bool volatile dataReadyToSend;
void setup() {
Serial.begin(115200);
Serial.print("setup() is running on core ");
Serial.println(xPortGetCoreID());
xTaskCreatePinnedToCore(collectDataCode,"collectData",10000,NULL,1,&collectData,0);
delay(500);
}
void loop() {
if (Serial.available()) {
Serial.flush();
getAllData = true;
}
Serial.print("From loop: ");
Serial.println(getAllData);
if (dataReadyToSend) {
dataReadyToSend = false;
}
delay(1000);
}
void collectDataCode(void * params) {
while (1) {
Serial.print("From collectData: ");
Serial.println(getAllData);
if (getAllData) {
getAllData=0;
}
vTaskDelay( xDelay );
}
}
上面代码的输出如下。 我在哪里输入xxx
。 据观察,变量getAllData
在此实例中已更新,但稍后未更改。
From collectData: 0
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
xxx
From loop: 1
From collectData: 1
From loop: 1
From collectData: 1
From loop: 1
From collectData: 1
From loop: 1
From collectData: 1
更新
根据建议,我将atomic
与以下代码一起使用。 我仍然看不到成功。
#ifdef __cplusplus
#include <atomic>
using namespace std;
#else
#include <stdatomic.h>
#endif
TaskHandle_t collectData;
atomic<bool> getAllData;
atomic<bool> dataReadyToSend;
#include "collectData.h"
void setup() {
Serial.begin(115200);
Serial.print("setup() is running on core ");
Serial.println(xPortGetCoreID());
xTaskCreatePinnedToCore(collectDataCode,"collectData",10000,NULL,1,&collectData,0);
delay(500);
}
void loop() {
if (Serial.available()) {
Serial.flush();
atomic_store (&getAllData, true);
}
Serial.print("From loop: ");
Serial.println(atomic_load(&getAllData));
if (dataReadyToSend) {
dataReadyToSend = false;
}
delay(1000);
}
void collectDataCode(void * params) {
while (1) {
Serial.print("From collectData: ");
Serial.println(atomic_load(&getAllData));
if (atomic_load(&getAllData)) {
atomic_store (&getAllData, false);
}
vTaskDelay( xDelay );
}
}
我找到了答案。 问题不在于变量本身,而在于 Arduino 的Serial.flush()
。 出于某种原因, Serial.flush()
没有清除Serial.available()
。 我用以下代码替换了Serial.flush()
。
while(Serial.available()) {
Serial.read();
}
通过此更新,我的代码运行良好。 感谢@PeteBecker 的评论,我正在使用原子。 最终代码和结果如下。
#ifdef __cplusplus
#include <atomic>
using namespace std;
#else
#include <stdatomic.h>
#endif
TaskHandle_t collectData;
atomic<bool> getAllData;
atomic<bool> dataReadyToSend;
#include "collectData.h"
void setup() {
Serial.begin(115200);
Serial.print("setup() is running on core ");
Serial.println(xPortGetCoreID());
xTaskCreatePinnedToCore(collectDataCode,"collectData",10000,NULL,1,&collectData,0);
delay(500);
}
void loop() {
if (Serial.available()) {
while(Serial.available()) {
Serial.read();
}
getAllData.store(true);
Serial.println("Received data request");
}
Serial.print("From loop: ");
Serial.println(getAllData.load());
if (dataReadyToSend) {
dataReadyToSend = false;
}
delay(1000);
}
void collectDataCode(void * params) {
while (1) {
Serial.print("From collectData: ");
Serial.println(atomic_load(&getAllData));
if (getAllData.load()) {
getAllData.store(false);
}
vTaskDelay( xDelay );
}
}
结果
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
.
From loop: 0
From collectData: 0
Received data request
From loop: 1
From collectData: 1
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
From loop: 0
From collectData: 0
From loop: 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.