01. 分配任务优先级与RMS调度
1.1. RMS调度算法
RMS(单调速率调度算法)是一种静态优先级调度算法,是经典的周期性任务调度算法。RMS的基本思路是任务的优先级与它的周期表现为单调函数的关系,任务的周期越短,优先级越高;任务的周期越长,优先级越低。如果存在一种基于静态优先级的调度顺序,使得每个任务都能在其期限时间内完成。

基于RMS 的一个基础理论公式
1.2 RMS调度实例
| 任务 |
执行时间 |
任务周期 |
|---|---|---|
| TASK1 |
1 |
10 |
| TASK2 |
1 |
5 |
| TASK3 |
2 |
10 |
1)系统CPU使用率: 1/10+1/5+2/10 = 0.5
2) 3个任务时,RMS可实时调度率为:

实例结论: CPU占用率0.5 小于可实时调度率0.77, 所以这3个任务理论上是可以实时调度的。
1.3 基于RMS算法的任务优先级分配原则:
任务频率越高,优先级越高;任务执行时间越长,优先级越低
1.4. 最大任务优先级配置
最大任务优先级,影响查询最高优先级就绪任务时间, 任务最大优先级最好配置为32
OS_PRIO OS_PrioGetHighest (void) //获取最高优级就绪任务
{
CPU_DATA *p_tbl;
OS_PRIO prio;
prio = (OS_PRIO)0;
p_tbl = &OSPrioTbl[0];
while (*p_tbl == (CPU_DATA)0) { /* Search the bitmap table for the highest priority */
prio += DEF_INT_CPU_NBR_BITS; /* Compute the step of each CPU_DATA entry */
p_tbl++;
}
prio += (OS_PRIO)CPU_CntLeadZeros(*p_tbl); /* Find the position of the first bit set at the entry */
return (prio);
}
02. 任务堆栈管理
2.1 如何确定任务堆栈的大小
1) 手动计算任务堆栈大小
任务内所有函数调用嵌套所需的所有内存,每个函数调用一个返回地址的指针,每个函数调用中传递的所有参数,以及每个函数分配的局部变量,得到一个大约数后再乘以1.5~2的安全系数。
2) 通过uc/probe 监控运行时任务堆栈占用情况,根据实际情况调整。
3)任务函数设计的注意事项
a. 任务内避免函数的多层嵌套调用 b. 任务内避免递归函数 c. 避免分配大的局部变量
2.2 检测任务堆栈溢出
1)UCOS-III 监测任务运行时的最大堆栈: OS_StatTask()->OSTaskStkChk

2) 堆栈溢出检测: OSRedzoneHitHook

03. 任务状态切换图

04. 任务抢占式调度
任务抢占式调度过程分析:
(1) 低优先级任务正在执行,发生中断。
(2) 如果开启了中断,则CPU跳转到中断服务ISR中。
(3) ISR处理数据,向更高优先级的任务发出信号或消息,高优先级任务就绪
(4) 当 ISR 完成后, 触发任务调度
(6) 执行较高优先级的任务
(8) 较高优先级的任务执行完成后, 进入阻塞状态并触发任务调度
(10)切换回原始任务(被中断的任务)
(11) 被中断的任务在它被中断的地方恢复执行。

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



