단추를 누른 후 차단 된 작업으로 전환하려고합니다. 기본적으로 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()에서 다시 신호를 보냅니 까? –