1. 任务的基础知识
1.1 前后台和多任务系统
- 在裸机程序中,一般方式是在main()函数的while(1)中循环执行所有的程序,有时,使用中断去执行一些紧急的功能,中断中执行的程序称为前台,main()函数中执行的程序称为后台。
- 对于前后台框架的程序,必须当前函数执行完,才会去执行下一个函数,其实时性比较差,但它耗用的资源少。
- 在实际项目中,main()中会有一个周期(如1ms)轮询去执行main()函数中所有函数,同时专门使用一个定时器以一定周期(如500us)执行比较重要的函数,对于实时性要求不是很精确的项目,这种框架还是可以满足。
- FreeRTOS是一个可剥夺性内核的多任务系统。在多任务系统中,高优先级可以打断低优先级,能让更高优先级的任务得到CPU资源,完成这种功能的是任务调度器,其任务调度器也是可剥夺性任务调度器。
1.2 协程(Co-routine)的特性
协程是为那些资源很少的MCU而做的,FreeRTOS 存在协程功能,但不再更新和维护。协程和任务在概念上是相似的,但有如下不同:
- 堆栈使用方面: 所有的协程使用同一个堆栈,这样消耗比较少的RAM,而使用FreeRTOS任务中,每个任务都有自己的堆栈。
- 调度器和优先级: 协程使用合作式的调度器,但是可以在使用抢占式的调度器中使用协程。
- 宏实现: 协程是通过宏定义来实现的。
- 使用限制: 为了降低对RAM 的消耗做了很多的限制。
1.3 任务和任务状态
在FreeRTOS中,可以将任务理解为进程。任务由FreeRTOS调度器调度,有优先级,有独立堆栈空间等。每个时间只能执行一个任务,具体执行那个任务,由FreeRTOS调度器决定,每个任务必须有一个任务状态,如下:
- 运行态: 当前正在运行的任务称为运行态,对于单核微控制器,运行态的任务有且仅有一个。
- 就绪态: 就绪态的任务在就绪列表中,表示当前无阻塞和挂起,只是有更高优先级的任务在执行,随时等待调度器调度。刚刚创建的任务处于就绪态。
- 阻塞态: 阻塞态的任务不在就绪列表中,不能被调度器调用。它表示正在等待一个外部事件,如队列