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

时间:2019-03-31 14:50:49

标签: 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功能的情况下运行,但是这里有些问题,我无法弄清。

0 个答案:

没有答案