我正在尝试使用Arduino上的压电蜂鸣器输出歌曲。运行没有RTOS功能的代码效果很好,但是,当我将代码放入RTOS任务中时,蜂鸣器不起作用。我对此感到困惑。
在没有RTOS任务功能的情况下运行代码是可行的,但是在使用RTOS实施时,它将无法工作。似乎tone()函数无法执行。
#include <Arduino.h>
#include <avr/io.h>
#include <FreeRTOS.h>
#include <task.h>
//Tones
#define d 294 // 294 Hz
#define e 329 // 329 Hz
#define fSharp 370 // 369.994 Hz
#define g 392 // 392 Hz
// Define a special note, 'R', to represent a rest
#define R 000
#define babySharkOutput 11
int babyShark[] = { //Note of the song, 0 is a rest/pulse
d, e, g, g, g, g, g, g,
d, e, g, g, g, g, g, g,
d, e, g, g, g, g, g, g,
g, g, fSharp, R
};
int babySharkDuration[] = {
400, 200, 50, 50, 75, 50, 50, 75,
400, 200, 50, 50, 75, 50, 50, 75,
400, 200, 50, 50, 75, 50, 50, 75,
75, 75, 250, 1000
};
int babySharkNotePause[] = {
50, 60, 25, 20, 25, 15, 25, 40,
50, 60, 25, 20, 25, 15, 25, 40,
50, 60, 25, 20, 25, 15, 25, 40,
30, 20, 50, 200
};
void songTask(void *p) {
TickType_t xLastWakeTime = 0 ;
const TickType_t xPeriod = pdMS_TO_TICKS(1000);
while(1) {
for (int i = 0; i < 28; i ++){
tone(babySharkOutput, babyShark[i], babySharkDuration[i]);
int songDelay = babySharkNotePause[i] * songSpeed;
vTaskDelay(songDelay);
}
vTaskDelayUntil( &xLastWakeTime, xPeriod);
}
}
void setup() {
pinMode(babySharkOutput, OUTPUT);
}
void loop() {
xTaskCreate(songTask, "songTask", STACK_SIZE, NULL, 1, NULL);
vTaskStartScheduler();
}
嗯,我希望它能很好地运行,因为它可以在没有RTOS功能的情况下运行,但是这里有些问题,我无法弄清。