1. 任务调度相关链表
SylixOS将任务控制块加入到不同的任务调度链表进行管理,创建一个任务就会把新创建的任务加入到优先级就绪表,等待被调度执行。根据不同的任务阻塞原因会被加入到不同的阻塞表中。
1.1 优先级就绪表
图 1.1 任务优先级就绪表
SylixOS系统启动的过程会初始化一个任务优先级就绪表,当创建新任务时,根据任务的优先级加入到对应的优先级就绪表中,如图 1.1所示。系统启动过程创建一个优先级最低的IDLE任务。
1.2 任务控制块地址表
图 1.2 任务TCB地址表
创建新任务添加到就绪表的同时加入到任务控制块地址表。当调用任务挂起函数API_ThreadSuspend时,把任务控制块从优先级队列中取出,更新TCB地址表中的任务状态。当调用任务恢复函数API_ThreadResume时,从TCB地址表中获取到任务控制块更新到优先级就绪表,等待执行。
1.3 延时阻塞表
图 1.3 任务延时阻塞表
调用任务休眠函数API_TimeSleep时,任务被加入到延时阻塞表,等待任务延时时间到,从延时阻塞表中取出加入到就绪表中。
1.4 事件阻塞表
图 1.4 事件阻塞表
如图 1.4所示,以信号量阻塞为例,创建信号量时获取一个事件控制块,当获取信号量被阻塞就被加入到事件控制块的阻塞表中,如果设置了等待时间同时会被加入到延时阻塞表。当获取到信号量或是等待超时,任务会被重新加入到就绪表中。
2. 任务调度
引起任务调度的主要原因有以下几个:
1) 时间片耗尽、任务执行完毕。
2) 任务进入睡眠等待。
3) 获取资源被阻塞。
4) 任务主动挂起。
2.1 任务调度流程分析
图 2.1 任务调度流程
SylixOS任务调度流程如图 2.1所示,创建的任务加入优先级就绪表,等待被调度执行。在任务运行过程中,如果调用延时函数,任务被调出加入到延时阻塞表,等待延时时间到;如果因获取信号量等资源被阻塞,任务被调出加入到事件阻塞表,等待事件到来或超时时间到;如果任务被挂起加入任务控制块地址表,等待被唤醒。每个任务都有占用CPU执行的时间片,当时间片耗尽时,系统会重新调度高优先级任务执行。
————————————————
版权声明:本文为CSDN博主「sylixos-cainiao」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gufuguang/article/details/82117523
来源:CSDN
作者:mr lirongjun
链接:https://blog.csdn.net/li5830/article/details/103808808