我正在使用 ESP32 Arduino IDE。我的每个核心都有一项任务。在 core0 任务中,我设置了一个定时器中断,该中断向任务发出信号(通过 interruptCounter 变量)以每 100 us 切换一个引脚。在 core1 上,我有一个任务,它使用 SerialBT.println("1") 函数在蓝牙上发送一些乱码。
我用示波器测量了引脚。如果我删除 SerialBT.println("1") 函数,或者使用 Serial.println("1"),或者不在 Arduino IDE 上打开蓝牙串行监视器,它工作正常,我得到一个不错的 5 kHz 方波信号。但是,如果我在与蓝牙关联的端口上打开串行监视器,引脚会以非常随机的间隔切换,因此频率一直在变化。
我尝试了很多东西,但我仍然不知道代码中一个核心如何影响另一个核心。
编辑:在示波器上找到运行/停止按钮后,我意识到它仍然以常规的 100us 间隔切换,但每隔几次切换后它通常会忘记切换几毫秒。这些毛刺之间的间隔和脉冲似乎不规则。所以问题仍然存在,但我只是添加了这个信息。
EDIT1:我还注意到在这些停止期间,interruptCounter 会像预期的那样上升。所以它只是核心 0 功能以某种方式没有响应。
#include "BluetoothSerial.h"
#include "esp_task_wdt.h"
volatile int interruptCounter = 0;
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
BluetoothSerial SerialBT;
//interrupt routine
void IRAM_ATTR onTimer() {
portENTER_CRITICAL_ISR(&timerMux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&timerMux);
}
void setup() {
Serial.begin(2000000);
SerialBT.begin("ESP32"); //Bluetooth device name
Serial.println("The device started, now you can pair it with bluetooth!");
pinMode(26, OUTPUT);
disableCore0WDT();
disableCore1WDT();
xTaskCreatePinnedToCore(
adc_read, /* Function to implement the task */
"adc_read_task", /* Name of the task */
1024, /* Stack size in words */
NULL, /* Task input parameter */
1, /* Priority of the task */
NULL, /* Task handle. */
0); /* Core where the task should run */
xTaskCreatePinnedToCore(
bl_send, /* Function to implement the task */
"bl_send_task", /* Name of the task */
1024, /* Stack size in words */
NULL, /* Task input parameter */
2, /* Priority of the task */
NULL, /* Task handle. */
1); /* Core where the task should run */
}
void loop() {vTaskDelete(NULL); }
static void adc_read (void *pvParameters )
{
//launch the interrupt on core 0
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 100, true);
timerAlarmEnable(timer);
for(;;) {
if (interruptCounter > 0) {
portENTER_CRITICAL(&timerMux);
interruptCounter=0;
portEXIT_CRITICAL(&timerMux);
digitalWrite(26, !digitalRead(26));
}
}
}
static void bl_send (void *pvParameters )
{
for( ;; )
{
SerialBT.println("1");
}
}