2016-02-13 230 views
0

我正在學習freertos。我怎樣才能讓任務在運行2秒後進入睡眠狀態?我嘗試使用vTaskSuspend(),但立即停止任務 ,我也試圖把v taskDelay(2000)之前,它沒有多大的不同。 我想在被調用2秒後讓快速閃爍的任務進入休眠狀態,並運行正常的閃爍任務。freertos暫停任務

void resourse(const TickType_t xFrequency) 
{ 
    TickType_t xLastWakeTime; 
    xLastWakeTime = xTaskGetTickCount(); 
    while(1) 
    { 
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); 
    vTaskDelayUntil(&xLastWakeTime, xFrequency); 
    } 
} 
xSemaphoreHandle botton_one = 0; 
void botton(void* r) 
{ 

    while(1) 
     { 
     if(xSemaphoreTake(botton_one, 1)) 
     { 
     HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin); 
     xSemaphoreGive(botton_one); 
     } 
     vTaskDelay(1); 

     } 
} 
void normal_blinking(void* r) 
{ 
    while(1) 
     { 
     if(xSemaphoreTake(botton_one, 1)) 
     { 
      resourse(500); 
      xSemaphoreGive(botton_one); 
     } 

     } 
} 
void fast_blinking(void* s) 
{ 
    while(1){ 
     if((HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin))== 0) 
     { 
     xSemaphoreTake(botton_one, 1); 
     resourse(50); 
     xSemaphoreGive(botton_one); 
     } 
     vTaskDelay(2000); 
     vTaskSuspend(NULL); 
    } 
} 

int main(void) 
{ 
    TaskHandle_t xHandle; 
    botton_one = xSemaphoreCreateMutex(); 
    HAL_Init(); 
    SystemClock_Config(); 
    MX_GPIO_Init(); 

    xTaskCreate(botton, (const char*)"task_1", 1024, 0, 3, 0); 
    xTaskCreate(normal_blinking, (const char*)"task_2", 1024, 0, 2,0); 
    xTaskCreate(fast_blinking, (const char*)"task_3", 1024, 0, 1,0); 

    vTaskStartScheduler(); 

    while (1){ 
    } 
} 

回答

0

目前還不清楚你想要做什麼,或者什麼不按你想要的工作。您建議同時使用vTaskSuspend()vTaskDelay(),但它們用於不同的事情。

如果您調用vTaskDelay(),則任務會在您指定的任何時間段內進入阻塞狀態(停止作爲可以實際執行的任務),然後在該時間段後自動離開阻塞狀態。

如果調用vTaskSuspend(),則任務將進入掛起狀態,並且除非另一個任務或中斷調用vTaskResume(),否則將永不再運行。

你只是想讓任務運行兩秒鐘,然後再也不會呢?在這種情況下,你可以做一些簡單的事情,如:

void mytask(void *pv) 
{ 
TickType_t xTimeOnEntering = xTaskGetTickCount(); 

    while(xTaskGetTickCount() - xTimeOnEntering < pdMS_TO_TICKS(2000)) 
    { 
     /* Run your code here. */ 
    } 

    /* Two seconds of execution is up, delete the task. */ 
    <a href="http://www.freertos.org/a00126.html">vTaskDelete</a>(NULL); 
} 
+0

我需要任務運行兩秒鐘,然後進入睡眠狀態,並在被調用時重新開始。這是通過按下一個按鈕來完成的。 –