SylixOS任务调度分析

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

猜你喜欢

转载自blog.51cto.com/13941677/2165099
今日推荐