ボタンを押した後にブロックされたタスクに切り替えようとしています。基本的には、task_player1は、task_ctrlからセマフォを受け取るまで何もしません。私がセマフォを与える方法は、ボタンを押すことです。コードは怒鳴るです:FreeRTOS、Atmel Studio - バイナリセマフォを受信する前にタスクがブロックされていない
は#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);
}
}
}
問題は、それがportMAX_DELAYであるべきなtask_player1がブロックされることはありませんです。コードをマイクロチップにアップロードするとLEDが点灯し、ボタンを押してセマフォを入力するだけで点灯します。私はここで間違って何をしていますか?
Atmel Studioの制限により、私はFreeRTOS v7.3を使用しています。
編集:FreeRTOSで更新されたコード
セマフォはどのように作成されましたか? – jwdonahue
一般に、セマフォは共有リソースを保護するために使用され、フラグとしては使用されません。問題の説明に基づいて、関連するすべてのコードを表示していないようです。 [MCVE]を確認してください。 – jwdonahue
なぜ、セマフォがtask_ctrl()で通知されたら、task_player1()で再度通知しますか? –