- 任务调度相关链表 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.1 任务调度流程 SylixOS任务调度流程如图 2.1所示,创建的任务加入优先级就绪表,等待被调度执行。在任务运行过程中,如果调用延时函数,任务被调出加入到延时阻塞表,等待延时时间到;如果因获取信号量等资源被阻塞,任务被调出加入到事件阻塞表,等待事件到来或超时时间到;如果任务被挂起加入任务控制块地址表,等待被唤醒。每个任务都有占用CPU执行的时间片,当时间片耗尽时,系统会重新调度高优先级任务执行。