RTOS培训
任务
四种状态的转换
在实时操作系统(RTOS)中,任务通常会在以下四种状态之间相互转换:就绪态(Ready)、运行态(Running)、阻塞态(Blocked)和挂起态(Suspended)。这些状态转换的过程可以用以下图示和解释来表示:
- 就绪态(Ready):任务准备好可以执行,但是目前没有获得CPU时间片。
- 运行态(Running):任务正在执行,正在使用CPU。
- 阻塞态(Blocked):任务在等待某个事件(如I/O操作完成、信号量可用等)。
- 挂起态(Suspended):任务被挂起,不会被调度执行,通常是因为系统管理原因或用户请求。
状态转换图示:
+-----------+ +----------+ +-----------+
| | | | | |
| Ready +---------->+ Running +---------->+ Blocked |
| | | | | |
+-----------+ +----+-----+ +-----+-----+
^ | |
| | |
| v v
+-------------------+ 任务切换 事件触发
^ | |
| | |
+-----------+ +----+-----+ +-----+-----+
| | | | | |
| Suspended +<----------+ Running |<----------+ Blocked |
| | | | | |
+-----------+ +----------+ +-----------+
状态转换解释:
-
就绪态 → 运行态:当调度器选择某个就绪态的任务并分配CPU时间片时,该任务从就绪态转换到运行态。
-
运行态 → 就绪态:当任务运行时间片耗尽或被抢占时,该任务从运行态转换到就绪态。
-
运行态 → 阻塞态:当任务等待某个事件(如等待信号量、消息队列或I/O操作等)时,该任务从运行态转换到阻塞态。
-
阻塞态 → 就绪态:当任务等待的事件发生(如信号量可用、消息到达或I/O操作完成等)时,该任务从阻塞态转换到就绪态。
-
运行态 → 挂起态:当任务被挂起(通常是由系统或用户请求)时,该任务从运行态转换到挂起态。
-
挂起态 → 就绪态:当任务被恢复(解除挂起)时,该任务从挂起态转换到就绪态。
-
阻塞态 → 挂起态:当一个阻塞的任务被挂起时,它会从阻塞态转换到挂起态。
-
挂起态 → 阻塞态:当一个挂起的任务被恢复时,如果它仍在等待事件,它会从挂起态转换到阻塞态。
挂起和阻塞态必须先进入就绪态才能进入运行态
优先级
-
数值越小优先级越低,在 FreeRTOSConfig.h 中将 configUSE_PORT_OPTIMISED_TASK_SELECTION 设置为 1,则 configMAX_PRIORITIES 不得大于 32。一般最大数值按照需要进行配置, RAM 使用效率的原因,应保持在 实际需要的最小值。
-
对同等优先级的任务执行时间片轮询调度
-
配置抢占式优先级,则高优先级直接抢占cpu。若未配置抢占式优先级,则高优先级必须等待低优先级主动释放cpu。
任务启动到调用到终止的过程描述
在实时操作系统(RTOS)中,任务的生命周期从创建、启动、运行、等待、被中断、恢复到最终终止,是一个复杂且系统化的过程。以下是任务从启动到终止的典型过程描述:
-
任务创建(Task Creation) 任务在系统启动之前或在运行时动态创建。RTOS提供API来创建任务。
-
任务就绪(Task Ready) 任务创建后,进入就绪状态,等待调度器将其切换到运行状态。就绪状态的任务已经准备好执行,但由于CPU正在处理其他任务,它们暂时被挂起。
-
任务调度(Task Scheduling) RTOS调度器决定哪个任务在特定时间运行。调度器通常基于任务优先级、时间片轮转或其他调度算法。
-
任务运行(Task Running) 调度器将CPU控制权转移给任务,任务进入运行状态。任务的代码开始执行。
-
任务等待(Task Waiting/Blocked) 任务可能需要等待某些事件(如信号、消息、时间到期)才能继续执行。在等待这些事件时,任务进入等待(阻塞)状态。
-
任务恢复(Task Resumed) 当任务等待的事件发生后(如信号量被释放、消息队列中有新消息、延时到期),任务从等待状态恢复到就绪状态,等待调度器再次调度。
-
任务中断(Task Interrupted) 任务在运行时可能会被高优先级任务或中断服务程序(ISR)中断。中断后,RTOS保存当前任务的上下文,并切换到高优先级任务或处理中断。
-
任务终止(Task Termination) 任务可以主动终止,也可以被其他任务终止。任务终止后,RTOS释放其占用的资源,如堆栈和任务控制块(TCB)。
软件定时器
带ISR的函数是