初始化
OSInit()函数先建立最初的任务就绪表,然后建立4个空白的数据链表:任务控制块链表、事件控制块链表、标志链表和内存控制块链表。
-
初始化ISR堆栈
-
清除中断嵌套计数器
-
设置多任务未运行
-
清除调度锁计数器
-
初始化任务控制块指针
-
初始化就绪任务控制块指针
-
设置当前任务运行优先级
-
设置当前最高任务运行优先级
-
保存post任务优先级
-
设置测量调度时间参数
-
设置时间片轮转调度参数
-
清除任务钩子函数指针
-
初始化就绪任务优先级列表
-
初始化就绪任务列表
-
初始化内存管理模块
-
初始化free list of OS_MSGs
-
初始化互斥量管理模块
-
初始化消息队列管理模块
-
初始化信号量管理模块
-
初始化任务管理
- 清除任务计数
- 清除上下文转换计数
-
初始化系统内部任务
- 空闲任务(必须创建)
- 优先级最低OS_CFG_PRIO_MAX-1
- 空闲任务不能调用任何使其进入等待态的服务函数
- 空闲任务所作的事情
- 对空闲任务计数器不断累加,表示空闲任务的活跃度
- 由统计任务控制的计数器,用来表征统计任务运行时CPU的利用情况
- 空闲任务的钩子函数
- 该函数可以在运行电池供电的任务时,用来进入低功耗模式
- 或作其他的事情
- 时钟节拍任务(必须创建)
- 任务优先级为1
- 用来跟踪任务延时以及任务等待超时
- 该任务为一个周期任务,等待时钟节拍ISR发来的信号
- ISR中断调用OSTimeTick发送一个信号给时钟节拍任务,使时钟节拍任务处于就绪态
- 时钟节拍任务执行时,会遍历所有在等待延时结束或在指定时间内等待某个内核对象的任务
- 这些任务构成的列表称为时钟节拍列表(tick list)
- 时钟节拍任务会使时钟节拍列表中的那些延时已经结束或等待已经超时的任务进入就绪态
- 时钟节拍任务按照任务调用延时时OSTickCtr的值与延迟时间的总和与时钟节拍列表的大小取模进行插入
- 被插入的任务的控制块会记录OSTickCtr的值与延迟时间的总和,每当到达表时,都会比较,相同则从表中删除
- 如果该任务在等待延时结束,会将它放入任务就绪列表
- 如果在等待某个事件,还需从该事件的任务等待表中删除
- 统计任务
- 任务优先级为OS_CFG_PRIO_MAX-2
- 统计总的CPU利用率(0.00%~100.00%)
- 各任务的CPU利用率(0.00~100.00%)
- 各任务的堆栈使用量
- 如果需要使用统计任务则需要main()创建的第一个也是唯一一个用用任务中调用OSStatTaskCPUUsageInit()函数
- 通常,μC/OS-III允许用户在调用OSStart()创建任意数目的任务,但是,在需要使用统计任务来计算总的CPU利用率时,必须只创建一个任务。
- 系统会将每个人的运行统计结果存入每个任务的控制块中
- 定时任务
- 定时器是一个递减的计数器,当计数器为0时,可执行一个操作,该操作由用户在创建定时器时的回调函数设定。
- 该任务的优先级在os_cfg_app.h中的OS_CFG_TMR_TASK_PRIO设定,一般设置为中等优先级
- 与时钟节拍任务使用相同的中断源,定时器的更新频率一般会慢一些
- 中断服务管理任务
- 最高优先级
- 该任务负责“延迟”(deferring)在ISR中调用的系统post服务函数(OS post service)的行为
- 空闲任务(必须创建)