Free RTOS学习之任务基础

Free RTOS是一个抢占式的实时多任务系统,任务的执行顺序由任务调度器决定。

在Free RTOS中应用既可以使用任务也可以使用协程,或两者混合使用。但是任务和协程使用不同的API函数,因此不能通过队列(或信号量)将数据从任务发送到协程,反之亦然。协程式为了那些资源很少的MCU准备的,其开销小,但是Free RTOS官方已经不再更新协程,因此协程仅作了解。

Free RTOS的调度器的职责是确保当一个任务开始执行的时候其上下文环境(寄存器值,堆栈内容等)和上一次退出任务时相同。为了做到这一点,每个任务都有一个堆栈,任务切换时将上下文环境保存到堆栈中。

任务状态:
运行态:正在使用处理器的任务所在的状态
就绪态:已经准备就绪可以执行的任务,还没有执行是因为有一个同一优先级或者更高优先级的任务正在执行
阻塞态:任务正在等待某个外部事件,比如调用了vTaskDelay()、等待队列、信号量、事件组、通知或者互斥信号量的时候任务就进入了阻塞态,任务进入阻塞态会有一个超时时间,当超过这个时间,即使所等待的事件没有来临任务也会退出阻塞态。
挂起态:像阻塞态一样,任务进入挂起态以后任务调度器不能让他进入运行态,但是阻塞态任务有超时时间,而挂起态没有超时时间

任务状态切换如图所示:在这里插入图片描述
任务优先级
和中断优先级不同,任务优先级的优先级数月小,优先级别越低,0的优先级最低。当宏configUSE_TIME_SLICING定义为1时,多个任务可以共用一个优先级,数量不限,此时处于就绪态的任务就会使用时间片轮转调度器获取运行时间。

任务控制块
任务控制块就是存储任务属性的结构体TCB_t,在任务创建时就会自动给每一个任务分配任务控制块

任务相关的API函数
在这里插入图片描述
用xTaskCreate()创建任务,那么任务的堆栈和任务控制块都会自动从Free RTOS的堆中分配,因此必须提供内存管理文件,正点原子历程默认使用heap_4.c这个内存管理文件,而且宏configSUPPORT_DYNAMIC_ALLOCATION必须为1.
使用xTaskCreateStatic()创建任务时,任务所需的内存由用户来提供,同时宏configSUPPORT_STATIC_ALLOCATION定义为1
用xTaskCreateRestricted()创建任务要求所使用的MCU有MPU(内存保护单元),用此函数创建的任务会受到MPU的保护。其他同xTaskCreate()

任务挂起和恢复API函数
在这里插入图片描述
vTaskSuspend()的参数为要挂起任务的任务句柄。如果使用函数xTaskCreateStatic()创建任务的话那么函数的返回值就是此任务的任务句柄。也可以通过函数xTaskGetHandle()来根据任务名字来获取某个任务的任务句柄。如果vTaskToSuspend()参数为NULL的话表示挂起任务自己

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值