SylixOS任务调度分析

1. 任务调度相关链表
SylixOS将任务控制块加入到不同的任务调度链表进行管理,创建一个任务就会把新创建的任务加入到优先级就绪表,等待被调度执行。根据不同的任务阻塞原因会被加入到不同的阻塞表中。
1.1    优先级就绪表
 SylixOS任务调度分析_第1张图片
图 1.1 任务优先级就绪表
SylixOS系统启动的过程会初始化一个任务优先级就绪表,当创建新任务时,根据任务的优先级加入到对应的优先级就绪表中,如图 1.1所示。系统启动过程创建一个优先级最低的IDLE任务。
1.2    任务控制块地址表
 
图 1.2 任务TCB地址表
创建新任务添加到就绪表的同时加入到任务控制块地址表。当调用任务挂起函数API_ThreadSuspend时,把任务控制块从优先级队列中取出,更新TCB地址表中的任务状态。当调用任务恢复函数API_ThreadResume时,从TCB地址表中获取到任务控制块更新到优先级就绪表,等待执行。
1.3    延时阻塞表
 SylixOS任务调度分析_第2张图片
图 1.3 任务延时阻塞表
调用任务休眠函数API_TimeSleep时,任务被加入到延时阻塞表,等待任务延时时间到,从延时阻塞表中取出加入到就绪表中。
1.4    事件阻塞表
 SylixOS任务调度分析_第3张图片
图 1.4 事件阻塞表
如图 1.4所示,以信号量阻塞为例,创建信号量时获取一个事件控制块,当获取信号量被阻塞就被加入到事件控制块的阻塞表中,如果设置了等待时间同时会被加入到延时阻塞表。当获取到信号量或是等待超时,任务会被重新加入到就绪表中。
2. 任务调度
引起任务调度的主要原因有以下几个:
1)    时间片耗尽、任务执行完毕。
2)    任务进入睡眠等待。
3)    获取资源被阻塞。
4)    任务主动挂起。
2.1    任务调度流程分析
 SylixOS任务调度分析_第4张图片
图 2.1 任务调度流程
SylixOS任务调度流程如图 2.1所示,创建的任务加入优先级就绪表,等待被调度执行。在任务运行过程中,如果调用延时函数,任务被调出加入到延时阻塞表,等待延时时间到;如果因获取信号量等资源被阻塞,任务被调出加入到事件阻塞表,等待事件到来或超时时间到;如果任务被挂起加入任务控制块地址表,等待被唤醒。每个任务都有占用CPU执行的时间片,当时间片耗尽时,系统会重新调度高优先级任务执行。

转载于:https://my.oschina.net/u/3954478/blog/1941549

你可能感兴趣的:(数据结构与算法)