FreeRTOS-任务基础

FreeRTOS-任务基础

  • 大多数时候,使用RTOS就是使用其多任务处理功能。所谓多任务处理,其实并不是我们移植了RTOS系统后,CPU就可以同时处理多个任务,而是CPU会有一定选择性的去处理当前最紧急的事,处理完最紧急的事再去处理其他事,单核CPU永远只处理一件事。

FreeRTOS任务系统

  • 在不使用操作系统编程的时候,一般都是在主函数中放一个while大循环,依次调用相应函数循环处理所有任务,这就是单任务系统。单任务系统也被称为前后台系统,因为大多数时候我们会使用中断完成一些任务,中断服务函数就作为前台程序,大循环中的函数作为后台程序。这种前后台系统关系如下图所示。
    在这里插入图片描述

  • 虽然这种前后台系统结构简单,而且占用的资源也少,但是实时性很差,因为大循环中所有任务都是排队等待执行,相当于所有任务优先级相同,无论该任务多么紧急,这样就会导致紧急任务难以迅速处理。所以,采用RTOS能够很好地解决该问题。在FreeRTOS中,有一个叫任务调度器的东西,它会根据任务抢占优先级来决定接下来执行哪个任务,抢占优先级高的任务总是会被最先执行。并且高优先级的任务可以打断低优先级的任务运行,这样就保证了重要任务执行的实时性。

RTOS任务特性

  • 因为FreeRTOS中的每个任务都有自己的一块存储区域(堆栈),所以任务和任务间是相互独立的,且不会依赖于任务调度器。任务调度器职责就是确保当一个任务开始的时候存储器值、堆栈内容等和上一次退出时相同,在上次任务退出时,需要保护现场环境(参数储存在任务自己的堆栈中),等调度器再次执行该任务时,现场环境再从堆栈中恢复出来。FreeRTOS的任务具有以下特性:
    • 简单
    • 没有使用限制
    • 支持抢占,但必须考虑重入问题
    • 支持优先级
    • 每个任务均有堆栈,相对独立,但RAM使用量增大

任务状态

FreeRTOS中的任务状态必处于运行态、就绪态、阻塞态、停止态中的一个。

运行态

  • 一个任务正在被执行即称为运行态,此时该任务占用CPU。

就绪态

  • 当一个任务已经准备就绪了,但是因为有一个高优先级或同优先级的任务正在执行导致该任务还没有被执行,此时就称该任务处于就绪态。如果一个任务正在执行,而一个更高优先级的任务刚进入就绪态,则该更高优先级的任务会直接打断正在执行的任务,抢占CPU使用权。

阻塞态

  • 当一个任务当前正在等待外部事件的话就称为阻塞态,外部事件可以是延时周期、队列、信号量、事件组、通知等。如果一个任务进入了阻塞态,就相当于把CPU使用权让出来了(该任务不一定已经执行完了),待到阻塞态过去(如延时周期结束等),如果此时没有比该任务更高优先级的任务正在执行,那么该任务将会被执行。任务进入阻塞态会有一个超时时间,当超过了这个超时时间任务就会退出阻塞态,即所等待的时间还没有到来。

停止态

  • 停止态也称挂起态,它与阻塞态不同,处于停止态的任务不能被执行,也没有超时限制,只能通过调用函数退出停止态。下图是任务之间状态的转换图。
    在这里插入图片描述

任务优先级

  • 正如前面所说,每个任务都有任务优先级,任务优先级决定了任务执行顺序,在之前文件系统配置这篇block已经讲述过,stm32支持计算前导零这种指令,优点是效率高,但优先级数目会受限。在stm32中,规定任务优先级最高为32个,即0~31,数字越大相应的优先级越高,这与stm32的中断优先级刚好相反,相同优先级下挂载的任务数量不限,所以理论上,FreeRTOS可以运行很多任务。一般来说,考虑RAM开销,通过配置FreeRTOSConfig.h文件合理选择最大优先级数量。

任务实现

  • FreeRTOS中,任务实现有静态和动态两种方法,具体实现过程后面的章节中会详细讲解。
  • 任务本身也是函数,而且FreeRTOS中的任务都是一个死循环,循环中是具体执行过程,而且一般来说不允许跳出循环,如果一定要跳出循环,则必须删除次任务。那么问题是?任务函数既然是一个死循环而且也不允许跳出,那么这样不就会导致一直只执行该任务吗?其实在RTOS中,有任务切换的函数,如请求信号量、队列、FreeRTOS延时函数等,当调用了这些任务切换函数,那么任务调度器就会根据任务优先级和任务状态来决定接下来执行哪个任务。这就是操作系统执行任务的基本过程。

任务控制块

  • 所谓任务控制块,就是专门用以存放任务状态和属性的一个结构体,在创建任务时,任务从总堆栈中获得一定空间,将这空间的一部分分配给任务控制块。任务控制块有点像单片机的状态寄存器和控制寄存器。

任务堆栈

  • FreeRTOS中,任务堆栈确保了人物之间的独立性和任务调度器能够随时切换不同优先级的任务。在任务创建时,系统会自动或用户亲自为该任务分配一定的堆栈空间,在任务切换时,会将当前任务现场保护起来,即CPU寄存器值等保存到堆栈中,等到再次执行时从堆栈中拿出来。这就是任务堆栈的重要作用。

到这里我们就将FreeRTOS的任务基础叙述完了,下一章讲解任务操作(动态创建、静态创建、删除、挂起、解挂)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值