RTOS原理与实现概述(详解)
| 2023-8-2
0  |  阅读时长 0 分钟
type
Post
status
password
date
slug
summary
category
URL
tags
icon

总结

任务切换

任务切换原理图
任务切换原理图
任务切换中——栈的变化细节
任务切换中——栈的变化细节

资源冲突

notion image
  • 临界区保护区:开关中断→控制PendSV_Handler函数运行→控制任务切换
  • 调度锁:tTaskSwitch函数中的schedLockCount是否大于0→控制tTaskSwitch函数运行
临界保护区与调度锁
临界保护区与调度锁

用户进程

notion image

TCB结构

任务的数据结构
任务的数据结构

任务优先级&延时函数&任务管理

  • 优先级链表(每一个任务优先级都有一个链表,使用任务节点)
  • 延时链表(使用延时节点)
  • 任务管理:包括任务挂起与任务唤醒
任务挂起:将任务从就绪队列移除。
任务挂起(不允许挂起延时任务)
任务挂起(不允许挂起延时任务)
任务唤醒:将挂起的任务加入就绪队列
任务唤醒
任务唤醒
任务优先级&延时任务的实现
任务优先级&延时任务的实现

事件控制块

将指定任务插入到事件控制块
将指定任务插入到事件控制块
将事件控制块等待链表中的首个任务
将事件控制块等待链表中的首个任务
 

📣
RTOS原理与实现02:基本任务切换

任务切换原理

任务切换原理图
任务切换原理图
任务切换中——栈的变化细节
任务切换中——栈的变化细节

资源冲突

notion image

临界区保护原理

通过开关中断解决资源冲突问题。

问题

💡
考虑到嵌套关中断的场景,如果只是简单的关闭 - 打开中断会导致临界区保护失败,因为内部的开中断操作会导致外部临界区失去保护。例如在函数调用的时候
notion image

解决方法

💡
解决方案则是在进入临界区时先保存当前的中断使能配置,然后在退出临界区时恢复先前保存的中断使能配置
notion image

调度锁

对于任务间共享资源的互斥,长时间关闭中断会影响系统实时性,因此可以只关闭调度功能确保任务在进入临界区后不被切换。
notion image

延时任务

目标:在任务延时过程中,暂停当前任务运行,释放CPU控制权给其他任务
延时任务的实现
延时任务的实现

任务优先级

任务优先级的实现
任务优先级的实现

任务管理器

唤醒与挂起

notion image

设计与实现

任务挂起:将任务从就绪队列移除。
任务挂起(不允许挂起延时任务)
任务挂起(不允许挂起延时任务)
任务唤醒:将挂起的任务加入就绪队列
任务唤醒
任务唤醒
notion image

任务删除

在删除任务时,还需要安全地释放任务所打开 / 占用的资源。例如:当任务A删除任务B时,必须确保任务B占用的资源被释放。然而只有任务自身最清楚自己使用的资源,所以在删除过程中应该让任务自行释放资源。
notion image

事件控制器

notion image

信号量

信号量简而言之就是一个带事件控制块的计数器
notion image

邮箱实现

引入邮箱机制的目的是为了实现多个任务之间的消息通信
  1. 任务A产生消息放入邮箱,由邮箱负责在任务间分发消息
  1. 如果邮箱中没有消息,等待消息的任务可以在邮箱上实现等待
  1. 如果没有任务在邮箱上等待消息,邮箱可以先缓存接收到的消息

设计与实现

notion image
notion image

邮箱的清空与删除

notion image

存储块

notion image

事件标志组

notion image

互斥信号量

notion image

软件定时器

在实际应用中,常常需要周期性或者在指定时间做一件事情。虽然可以使用任务 + tTaskDelay实现定时任务,但是如果为每个定时需求都启动一个任务的话,会导致任务数量过多,资源开销太大。
notion image

性能测试

栈使用量测量

当前为每个任务都配备了一个有限的任务栈,用于保存任务的运行状态。但是由于栈空间有限,所以存在越界使用的可能,而一旦任务栈越界就可能破坏其他任务的栈或内核数据。
notion image

设计

  1. 任务初始化时,将栈空间所有内容清零(初始分配栈时,任务栈空间内容是不确定的)
  1. 任务运行后,栈空间逐渐被其他数值覆盖
  1. 从栈空间统计0单元数,即为栈的最小剩余空间。(栈内空间中所有为零的单元数量)

CPU测试

notion image
  1. 首先设置特殊代码块,其中包含执行计数,每执行一次特殊代码块就将计数加1
  1. 在系统启动之初的单位时间内(e.g. 1s),仅运行特殊代码块,进而统计出单位时间内仅执行特殊代码块的运行次数Max
  1. 后续每个单位时间统计一次CPU使用率,假设正常运行期间单位时间内特殊代码块运行次数为Cnt,那么CPU使用率即为,
注意:此处先计算Cnt * 100.0是为了将整个计算过程转换为浮点数类型
notion image

内核剪裁

所谓裁剪,即用条件编译指令控制某些代码是否编译
Hooks扩展:Hooks即钩子函数,用于在某些内核代码中插入一个占位。当执行到该位置时,执行用户自定义的功能函数,从而避免直接修改原始的内核代码
Loading...
目录