gpt4 book ai didi

c - FreeRTOS、Atmel Studio - 任务在接收二进制信号量之前不会被阻止

转载 作者:行者123 更新时间:2023-11-30 14:51:50 27 4
gpt4 key购买 nike

我试图在按下按钮后切换到被阻止的任务。基本上我希望 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\n");
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...\n");
ioport_set_pin_level(L1, LOW);

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

vTaskDelay(1);
}
}
}

问题是 task_player1 从未被 portMAX_DELAY 阻止,而它应该被阻止。一旦我将代码上传到微芯片,LED 就会亮起,而我只想在按下按钮并给出信号量时它才会亮起。我在这里做错了什么?

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

编辑:更新代码

最佳答案

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

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

关于c - FreeRTOS、Atmel Studio - 任务在接收二进制信号量之前不会被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971419/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com