UCOS-III 任务管理

01. 分配任务优先级与RMS调度

1.1. RMS调度算法

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

 

113dc4b6b9f0a013bfbbda14c3b26b6e.png

基于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可实时调度率为:

 

bdf921cf4ccc7cc80a2c0d39aa6d52d3.png

实例结论: 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

 

a495a1f112f1e9655b097511541352c1.png

2) 堆栈溢出检测: OSRedzoneHitHook

 

d7c8f5789e14d95cdf8524a6933d53b3.png

03. 任务状态切换图

 

84d6b7d795c5def96269307a8aba3e65.png

04. 任务抢占式调度

 

 

任务抢占式调度过程分析:

(1) 低优先级任务正在执行,发生中断。

(2) 如果开启了中断,则CPU跳转到中断服务ISR中。

(3) ISR处理数据,向更高优先级的任务发出信号或消息,高优先级任务就绪

(4) 当 ISR 完成后, 触发任务调度

(6) 执行较高优先级的任务

(8) 较高优先级的任务执行完成后, 进入阻塞状态并触发任务调度

(10)切换回原始任务(被中断的任务)

(11) 被中断的任务在它被中断的地方恢复执行。

05. 任务时间片轮调度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIoT@突破自我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值