2017-12-25 3 views
0

단추를 누른 후 차단 된 작업으로 전환하려고합니다. 기본적으로 task_player1task_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에서 업데이트 된 코드

+1

세마포는 어떻게 생성 되었습니까? – jwdonahue

+0

일반적으로 세마포어는 플래그로 사용되지 않고 공유 리소스를 보호하는 데 사용됩니다. 문제 설명을 기반으로 모든 관련 코드를 표시하지 않는 것 같습니다. [MCVE]를 검토하십시오. – jwdonahue

+0

세마포어가 task_ctrl()에서 신호를 받으면 task_player1()에서 다시 신호를 보냅니 까? –

답변

1

바이너리 세마포어는 즉, "주어진"상태로 만들어집니다. 따라서 task_player1()이 while 루프에 들어가면 세마포어에서 블로킹하지 않고 핀을 하이로 설정합니다. 당신은 xSemaphoreTake를 호출 할 수있다() 세마포어는이 작업 아닌 ISR 때문에, xSemaphoreGiveFromIsr()를 사용하지 않아야 0

task_ctrl()에 세마포어 카운트를 감소하기 위해 만든 직후.

+0

감사합니다! 간단한 질문 - xSemaphoreHandle player1_signal = 1; 똑같은 일을합니까? 지금은 0으로 설정되어 있습니다. – Tisa

+0

player1_signal은 세마포어 핸들입니다. 1로 설정할 수 없습니다. vSemaphoreCreateBinary를 호출 한 후 player1_signal의 xSemaphoreTake에 대한 호출을 추가하십시오. 그런 다음 ISR 버전의 함수를 호출하지 않도록 제어 작업을 수정하십시오. – stathisv

+0

예, 작동하고 ISR 기능을 수정했습니다. 다시 한 번 감사드립니다! – Tisa

관련 문제