如何使用 FreeRTOS 暂停任务



我正在尝试学习freeRTOS。如何让任务跑完 2 秒就睡觉了?我尝试使用vTaskSuspend()立即停止任务,我也尝试v taskDelay(2000),但它也不起作用。

我想在调用快速闪烁任务 2 秒后使其休眠并运行正常的闪烁任务。

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){
  }
}

不清楚你想做什么,或者什么没有按照你想要的方式工作。 您建议同时使用 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. */
    vTaskDelete( NULL );
}

相关内容

  • 没有找到相关文章

最新更新