首页 > 解决方案 > 为什么 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 功能的情况下运行,但这里有问题,我无法弄清楚。

标签: c++arduinortos

解决方案


推荐阅读