本文是《ALIENTEK STM32F429 FreeRTOS 开发教程》第五章学习笔记
第一章笔记–FreeRTOS简介与源码下载
第二章笔记–FreeRTOS在STM32F4上移植
第三章笔记-FreeRTOS系统配置
第四章笔记-FreeRTOS中断分析
第四章笔记补充-FreeRTOS临界段代码
1. 多任务系统
未加操作系统时,单片机跑裸板程序,一般是在main函数中用以个While(1)的大循环来完成所有操作。即应用程序是一个无限的循环,循环中调用相应的函数完成所需的操作。有时也需要中断中完成一些操作。
相对于多任务系统,这样的while(1)做一个大循环完成所有操作称为前后台系统(单任务系统),中断服务函数作为前台程序,大循环while(1)作为后台程序。
前后台系统实时性差。各个任务排队等待着轮流执行,但是前后台系统简单。消耗资源少,但在稍微大一些的嵌入式应用中前后台系统显得力不从心
多任务系统把一个大问题,划分成许多小问题,这些小问题单独作为一个小任务来处理。这些小任务是并发处理的,但并不是同一时刻一起执行很多任务,而是由于每个任务执行的时间很短,导致看起来同一时刻执行了很多任务。
多任务系统中的任务调度器,使操作系统永远执行高优先级的任务,高优先级的任务可以打断低优先级任务而取得CPU的使用权,高优先级的任务执行完成以后重新把CPU的使用权还给低优先级的任务。
2. 任务
2.1 任务特性
- 简单
- 没有使用限制
- 支持抢占(低优先级可以被高优先级打断)
- 支持优先级(CPU永远执行优先级最高的任务)
- 每个任务都拥有堆栈 (任务切换需要把上下文环境保存在堆栈中,这样当任务再次执行可以从堆栈中取出上下文环境,任务恢复运行)
- 如果使用抢占则必须仔细考虑充入的问题
2.2 任务状态
运行态
正在使用CPU的任务,即正在运行的任务,称这个任务处于运行态。如果是单核处理器,不论任何时刻,永远只有一个任务处于运行态
就绪态
当任务已经准备就绪(没有被阻塞或者挂起),可以运行的任务,但是还没有运行(因为有一个同优先级或者更高优先级任务正在运行)称为就绪态任务
阻塞态
如果一个任务当前正在等待某个外部事件则称为阻塞态任务,比如某个任务调用了函数vTaskDelay()便会进入阻塞态,直到延时周期完成
任务在等待队列、信号量、事件组、通知或互斥信号量时也会进入阻塞态。
任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没来临
挂起态
跟阻塞态一样,任务进入挂起态以后不能被任务调度器调用进入运行态,但是进入挂起态的任务没有超时时间。
任务进入和退出挂起态通过调用函数vTaskSuspend()和xTaskResume()
任务间的状态转换
2.3 任务优先级
每个任务都可以分