首页 > 解决方案 > 我的 FreeRTOS 实施未完成其任务

问题描述

我的项目有一个 Atmega328p 微控制器(与 Arduino Uno 相同)所以我实现了一个 Arduino Uno 移植的 FreeRTOS v10 项目。

一些规格: - F_CPU = 1 MHz - 在定时器 0 上运行 - 抢占模式 - 时间片 = 开启

我的两个简单任务表现得很奇怪。任务 1 是一个 LED 开关,任务 2 是一个三音梯

我最初的警报实现是一个alarm_on()函数,它产生三种音调,_delay_ms()中间有函数。但这并没有按预期工作,所以我尝试了这些vTaskDelayUntil()功能。

我制作了运行以下代码片段的行为视频 https://www.youtube.com/watch?v=XnYaELsW1d0

所以 LED 闪烁是有效的,但这是一项非常简单且简短的任务。声音任务只产生 2 种音调,有时只产生一种。

我的任务安排:

xTaskCreate( TaskBlinkLED,  
             (const portCHAR *)"LED", 
             256, 
             NULL, 
             1,  
             NULL );

xTaskCreate( TaskSoundAlarm,  
             (const portCHAR *)"SOUND", 
             512, 
             NULL, 
             4,  
             NULL );

vTaskStartScheduler();

实际任务代码

static void TaskBlinkLED(void *pvParameters) // Main Green LED Flash
{
    (void) pvParameters;
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 800;
    /* The xLastWakeTime variable needs to be initialized with the current tick
    count.  Note that this is the only time we access this variable.  From this
    point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
    API function. */
    xLastWakeTime = xTaskGetTickCount();

    for(;;)
    {
        led_toggle();
        vTaskDelayUntil( &xLastWakeTime, ( xFrequency / portTICK_PERIOD_MS ) );
    }
}

static void TaskSoundAlarm(void *pvParameters) 
{
    (void) pvParameters;
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 3000;
    xLastWakeTime = xTaskGetTickCount();

    for(;;)
    {
        alarm_on(300);
        vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_PERIOD_MS )  );
        alarm_on(400);
        vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_PERIOD_MS )  );
        alarm_on(500);
        vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_PERIOD_MS )  );
        alarm_off();

        vTaskDelayUntil( &xLastWakeTime, ( xFrequency / portTICK_PERIOD_MS ) );
    }
}

我的闹钟功能

void alarm_on(unsigned long hz)
{
    ALARM_PORT_DDR |= (1<<ALARM_PIN);
    t1_set_ctc_a(hz, timer_freq);
}

为什么它不通过产生 3 个音来完成这里的完整声音任务?

标签: cfreertospreemptive

解决方案


推荐阅读