c++ - 为什么 arduino 的音调功能在 RTOS 中不起作用?
问题描述
我正在尝试使用我的 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 功能的情况下运行,但这里有问题,我无法弄清楚。
解决方案
推荐阅读
- python - 为什么我不能从我的串口读取数据?
- mysql - 按 ID 过滤 TOP 事物组
- security - 我在哪里可以找到 Quarkus security-ldap-quickstart?
- c++ - 返回对绑定到临时的引用参数的引用时悬空引用
- java - 在java中使用axis2分块soap Web服务?
- swift - 如何快速更改日期格式 2021-30-06T05:00:00+07:00?
- java - Spring(引导)URL 冲突(由于包含)
- java - Netty Eventloop 在“keventWait”上被阻止
- .net-core - 使用启动配置文件运行的 Dotnet 不转发 commandLineArgs
- flutter - 如何使用 Paint() 在颤振中创建圆角矩形?