type
Post
status
password
date
slug
summary
category
URL
tags
icon
总结任务切换资源冲突用户进程TCB结构任务优先级&延时函数&任务管理事件控制块 任务切换原理资源冲突临界区保护原理调度锁延时任务任务优先级任务管理器唤醒与挂起设计与实现任务删除事件控制器信号量邮箱实现邮箱的清空与删除存储块事件标志组互斥信号量软件定时器性能测试栈使用量测量设计CPU测试内核剪裁
总结
任务切换
资源冲突
- 临界区保护区:开关中断→控制
PendSV_Handler
函数运行→控制任务切换
- 调度锁:
tTaskSwitch
函数中的schedLockCount
是否大于0→控制tTaskSwitch函数运行
用户进程
TCB结构
任务优先级&延时函数&任务管理
- 优先级链表(每一个任务优先级都有一个链表,使用任务节点)
- 延时链表(使用延时节点)
- 任务管理:包括任务挂起与任务唤醒
任务挂起:将任务从就绪队列移除。
任务唤醒:将挂起的任务加入就绪队列
事件控制块
RTOS原理与实现02:基本任务切换
任务切换原理
资源冲突
临界区保护原理
通过开关中断解决资源冲突问题。
调度锁
对于任务间共享资源的互斥,长时间关闭中断会影响系统实时性,因此可以只关闭调度功能确保任务在进入临界区后不被切换。
延时任务
目标:在任务延时过程中,暂停当前任务运行,释放CPU控制权给其他任务
任务优先级
任务管理器
唤醒与挂起
设计与实现
任务挂起:将任务从就绪队列移除。
任务唤醒:将挂起的任务加入就绪队列
任务删除
在删除任务时,还需要安全地释放任务所打开 / 占用的资源。例如:当任务A删除任务B时,必须确保任务B占用的资源被释放。然而只有任务自身最清楚自己使用的资源,所以在删除过程中应该让任务自行释放资源。
事件控制器
信号量
信号量简而言之就是一个带事件控制块的计数器
邮箱实现
引入邮箱机制的目的是为了实现多个任务之间的消息通信
- 任务A产生消息放入邮箱,由邮箱负责在任务间分发消息
- 如果邮箱中没有消息,等待消息的任务可以在邮箱上实现等待
- 如果没有任务在邮箱上等待消息,邮箱可以先缓存接收到的消息
设计与实现
邮箱的清空与删除
存储块
事件标志组
互斥信号量
软件定时器
在实际应用中,常常需要周期性或者在指定时间做一件事情。虽然可以使用任务 + tTaskDelay实现定时任务,但是如果为每个定时需求都启动一个任务的话,会导致任务数量过多,资源开销太大。
性能测试
栈使用量测量
当前为每个任务都配备了一个有限的任务栈,用于保存任务的运行状态。但是由于栈空间有限,所以存在越界使用的可能,而一旦任务栈越界就可能破坏其他任务的栈或内核数据。
设计
- 任务初始化时,将栈空间所有内容清零(初始分配栈时,任务栈空间内容是不确定的)
- 任务运行后,栈空间逐渐被其他数值覆盖
- 从栈空间统计0单元数,即为栈的最小剩余空间。(栈内空间中所有为零的单元数量)
CPU测试
- 首先设置特殊代码块,其中包含执行计数,每执行一次特殊代码块就将计数加1
- 在系统启动之初的单位时间内(e.g. 1s),仅运行特殊代码块,进而统计出单位时间内仅执行特殊代码块的运行次数Max
- 后续每个单位时间统计一次CPU使用率,假设正常运行期间单位时间内特殊代码块运行次数为Cnt,那么CPU使用率即为,
注意:此处先计算Cnt * 100.0是为了将整个计算过程转换为浮点数类型