C++ 为什么arduino的音调功能在RTOS中不起作用?

C++ 为什么arduino的音调功能在RTOS中不起作用?,c++,arduino,rtos,C++,Arduino,Rtos,我试图用我的Arduino上的压电蜂鸣器输出一首歌。在没有RTOS功能的情况下运行代码效果很好,但是,当我将代码放入RTOS任务时,蜂鸣器不起作用。我被这件事弄得头晕目眩 在没有RTOS任务功能的情况下运行代码是可行的,但是在使用RTOS实现时,它就不起作用了。似乎tone()函数不执行 #include <Arduino.h> #include <avr/io.h> #include <FreeRTOS.h> #include <task.h>

我试图用我的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();
}
#包括
#包括
#包括
#包括
//音调
#定义d 294//294 Hz
#定义e 329//329 Hz
#定义fSharp 370//369.994 Hz
#定义g 392//392 Hz
//定义一个特殊注释“R”,以表示休息
#定义R 000
#定义babySharkOutput 11
int babyShark[]={//这首歌的音符,0是一个休息/脉冲
d、 g,g,g,g,g,g,g,
d、 g,g,g,g,g,g,g,
d、 g,g,g,g,g,g,g,
g、 g,fSharp,R
};
婴儿期内[]={
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 BabyShareKnotePause[]={
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任务(void*p){
TickType_t xLastWakeTime=0;
常数TickType\u t xPeriod=pdMS\u到\u TICKS(1000);
而(1){
对于(int i=0;i<28;i++){
音调(babySharkOutput、babyShark[i]、babySharkDuration[i]);
int songDelay=babysharkonepause[i]*songSpeed;
vTaskDelay(歌曲延迟);
}
vTaskDelayUntil(&xLastWakeTime,xPeriod);
}
}
无效设置(){
引脚模式(babySharkOutput,输出);
}
void循环(){
xTaskCreate(songTask,“songTask”,堆栈大小,NULL,1,NULL);
vTaskStartScheduler();
}

嗯,我原以为这会运行得很好,因为它可以在没有RTOS功能的情况下运行,但这里有些问题,我无法解决。

您在什么硬件上运行它?我打赌它不是AVR Arduino,而且您平台的Arduino兼容层也不打算与RTO一起使用:使用一个或另一个,而不是两个都使用。您必须重新实现tone函数,也许可以从您使用的Arduino库的源代码开始——它应该包含在您使用的开发工具包中。我想你是对的,因为我混合了Arduino库音调函数和FreeRTOS代码。我想我必须看一下音调函数的源代码。谢斯弗里特斯在联合国办事处的资源极其有限。您必须执行广泛的错误检查,因为API调用可能会由于资源耗尽而失败:它们可能会在任何大小的系统上执行此操作,并且您无论如何都应该执行错误检查,因此请确保检查所有API返回值的错误!您不进行错误检查:您甚至不知道您的任务正在运行!!LOL CG2271HAHAHA@MiDaa哈哈哈!是的,你在什么硬件上运行它?我打赌它不是AVR Arduino,而且您平台的Arduino兼容层也不打算与RTO一起使用:使用一个或另一个,而不是两个都使用。您必须重新实现tone函数,也许可以从您使用的Arduino库的源代码开始——它应该包含在您使用的开发工具包中。我想你是对的,因为我混合了Arduino库音调函数和FreeRTOS代码。我想我必须看一下音调函数的源代码。谢斯弗里特斯在联合国办事处的资源极其有限。您必须执行广泛的错误检查,因为API调用可能会由于资源耗尽而失败:它们可能会在任何大小的系统上执行此操作,并且您无论如何都应该执行错误检查,因此请确保检查所有API返回值的错误!您不进行错误检查:您甚至不知道您的任务正在运行!!LOL CG2271HAHAHA@MiDaa哈哈哈!对