FreeRTOS 任务挂起和恢复

在使用RTOS的时候一个实时应用可以作为一个独立的任务。每个任务都有自己的运行环境, 不依赖于系统中其他的任务或者RTOS调度器。 任何一个时间点只能有一个任务运行,具体运行哪个任务是由RTOS调度器来决定的, RTOS调度器因此就会重复的开启、关闭每个任务

任务状态
运行态
当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在
使用处理器的任务

就绪态
可以运行的任务。有一个同优先级或者更高优先级的任务正在运行

阻塞态
一个任务当前正在等待某个外部事件

挂起态
进入挂起态以后也不能被调度器调用。任务进入和退出挂起态通过调用函数vTaskSuspend()和xTaskResume()

任务状态转换
1

任务创建

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //函数指针
                            const char * const pcName,
                            const uint16_t usStackDepth, //堆栈大小
                            void * const pvParameters, //给任务传递参数
                            UBaseType_t uxPriority, //任务的优先级
                            TaskHandle_t * const pxCreatedTask /*任务句柄*/) PRIVILEGED_FUNCTION;

pxTaskCode:任务函数
pcName:任务名字
usStackDepth:任务堆栈大小
pvParameters:传递给任务函数的参数
uxPriority:任务优先级
pxCreatedTask:任务句柄

TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
                                    const char * const pcName,
                                    const uint32_t ulStackDepth,
                                    void * const pvParameters,
                                    UBaseType_t uxPriority,
                                    StackType_t * const puxStackBuffer,
                                    StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION;

puxStackBuffer:任务堆栈。一般为数组
pxTaskBuffer:任务控制块

任务删除

void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;

xTaskToDelete:任务句柄

挂起任务

void vTaskSuspend( TaskHandle_t xTaskToSuspend )

恢复任务

void vTaskResume( TaskHandle_t xTaskToResume )

中断服务函数中恢复任务运行

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )

举例

TaskHandle_t pxCreatedTask;

void TIM4_IRQHandler()
{
    if(TIM_GetITStatus(TIM4, TIM_IT_Update) == 1)
    {
        xTaskResumeFromISR(pxCreatedTask); //中断服务函数中恢复任务运行
    }

    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
} 

void key()
{
    static u8 flag = 1;

    if(flag == 1 && key_up == 1)
    {
        vTaskDelay(10);
        if(key_up == 1)
        {
            flag = 0;
            vTaskSuspend(pxCreatedTask); //挂起任务
        }
    }
    else if(key_up == 0)
    {
        vTaskDelay(10);
        if(key_up == 0)
        {
            flag = 1;
        }
    }
}

void vTask_key(void *t)
{
    while(1)
    {
        key();
    }
}

int main(void)
{
    TIM4_init(10000, 36000-1); //初始化定时器(详见定时器章节)

    xTaskCreate(vTask, "vTask", 50, NULL, 1, &pxCreatedTask);  
    xTaskCreate(vTask_key, "vTask_key", 50, NULL, 2, NULL); 
    vTaskStartScheduler(); 
}

实验现象:当按键按下,挂起任务。当定时器中断产生,恢复任务运行

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值