FreeRTOS,Atmel Studio - 任务在收到二进制信号量之前没有被阻止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeRTOS,Atmel Studio - 任务在收到二进制信号量之前没有被阻止相关的知识,希望对你有一定的参考价值。

按下按钮后,我正在尝试切换到被阻止的任务。基本上我希望task_player1在从task_ctrl接收到信号量之前什么都不做。我给出信号量的方式是按下按钮。代码如下:

#define B1 PIO_PB26_IDX

#define TASK_STACK_SIZE (2048/ sizeof(portSTACK_TYPE))

xTaskCreate(task_ctrl, (const signed char * const) "Control", TASK_STACK_SIZE, NULL, 1, NULL);

xTaskCreate(task_player1, (const signed char * const) "Player1", TASK_STACK_SIZE, NULL, 1, NULL);

void task_player1(void *pvParameters)
{
    vSemaphoreCreateBinary(player1_signal);

    while (1)
    {
        if( xSemaphoreTake( player1_signal, portMAX_DELAY ) == pdTRUE )
        {
            printf("Semaphore taken
");
            ioport_set_pin_level(L1, HIGH);
        }
    }
}

    void task_ctrl(void *pvParameters)
{
    static signed portBASE_TYPE xHigherPriorityTaskWoken;

    bool button1;
    while (1)
    {
        xHigherPriorityTaskWoken = pdFALSE;
        button1 = ioport_get_pin_level(B1);
        printf("TASK_CTRL RUNNING...
");
        ioport_set_pin_level(L1, LOW);

        if (button1)
        {
            xSemaphoreGiveFromISR(player1_signal, &xHigherPriorityTaskWoken);
            printf("Semaphore given
");

            vTaskDelay(1);
        }
    }
}

问题是task_player1永远不会被阻塞,因为它应该是portMAX_DELAY。一旦我将代码上传到微芯片,LED就会亮起,而我只想在按下按钮并显示信号量后点亮它。我在这做错了什么?

由于Atmel Studio的限制,我使用的是FreeRTOS v7.3。

编辑:更新的代码

答案

FreeRTOS中的二进制信号量以“给定”状态创建,即。因此当task_player1()进入while循环时,它会将引脚设置为高电平而不会阻塞信号量。您可以在创建信号量后立即调用xSemaphoreTake()以将信号量计数减少为0。

task_ctrl()不应该使用xSemaphoreGiveFromIsr(),因为它是一个任务而不是一个ISR。

以上是关于FreeRTOS,Atmel Studio - 任务在收到二进制信号量之前没有被阻止的主要内容,如果未能解决你的问题,请参考以下文章

Atmel Studio 7 如何编译和调试 Arduino 代码?

Atmel Studio 烧录 Atmega328P(Arduiono)

系统调用在 Atmel AVR Studio(使用 ASF)中不起作用

Atmel Studio 中的 Arduino 产量

Win7补丁更新失败导致Atmel studio软件安装失败,如何解决?

如何确定使用 FreeRTOS xTaskCreate 创建单个任务所需的 Stackdepth?