首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >freertos挂起任务

freertos挂起任务
EN

Stack Overflow用户
提问于 2016-02-13 19:44:36
回答 1查看 4.8K关注 1票数 0

我正在尝试学习免费的实时操作系统。如何让任务在运行2秒后进入睡眠状态。我试着使用vTaskSuspend(),但是我想立即停止任务,我也试着把v taskDelay(2000)放在它之前,这并没有太大的不同。我想让快速闪烁任务在被调用2秒后进入睡眠状态,然后运行正常的闪烁任务。

代码语言:javascript
复制
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){
  }
}
EN

回答 1

Stack Overflow用户

发布于 2016-02-14 05:23:47

不清楚你想要做什么,或者什么不能像你想要的那样工作。您建议同时使用vTaskSuspend()vTaskDelay(),但它们用于不同的用途。

如果调用vTaskDelay(),则任务将在您指定的任何时间段内进入阻塞状态(停止作为可实际执行的任务),然后在该期间后自动退出阻塞状态。

如果调用vTaskSuspend(),则任务将进入挂起状态,并且永远不会再次运行,除非另一个任务或中断调用vTaskResume()

您是否只想让任务运行两秒钟,然后再也不运行?在这种情况下,你可以做一些简单的事情,比如:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35379424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档