MCU小型调度OS之三:任务调度机制

一、结构体类型:

        图1

          图2

        如上图1,task_list是任务节点的结构体,具体参数如下:

        1、task_id是任务ID,一般对某个任务操作时用来区分具体哪个任务;

        2、stat是任务的当前状态,状态类型如图2,三种状态依次为挂起休眠,就绪运行,超时;

        3、pointer是当前运行指针,一般当做状态机来用,区分当前运行到具体哪个位置;

        4、task_timer是任务定时器,上个篇章说过,每个任务都会挂在一个定时器的节点,该定时器的主要功能就是为了处理当前任务的信号量超时、队列超时、定时唤醒能业务功能;

        5、function是任务回调函数,一般当前任务状态就绪时,会调用;

        6、p_arg是运行任务回调函数时传入的参数;

        7、next是任务链表里的下一个任务节点。

二、初始化

         图3

          图4

         如上图3,每个任务创建的时候,做以下动作:

         1、该任务的stat赋值就绪运行状态,创建好之后就会进入任务回调函数;

         2、每个任务创建时候,会创建相应关联的定时器,该定时器ID改成任务ID+0xff00,跟硬定时器ID错开;

         3、该任务关联的定时器初始化时,超时函数都是同一个,TaskOverTimerCallback,该数据传入的参数是初始化时绑定的任务结构体(后面会有介绍),定时器超时时把所绑定任务结构体状态改成OS_STAT_TIMEOUT,这个主要作用就是为了实现后面的每个任务信号量超时、队列超时、定时唤醒能业务功能。

三、任务调度

         图5

         如上图5,主程序里面遍历任务节点链表,如果当前任务节点的stat不是OS_STAT_SUSPEND(可能是OS_STAT_RDY或者OS_STAT_TIMEOUT)都运行该任务函数,然后遍历下一个任务节点。

         图6

         如上图6,遍历每个任务节点链表,判断当前stat,如果非suspend就运行,在其他地方可以通过任务ID对任何一个任务的状态进行修改,假设信号量或者休眠定时唤醒某一个任务时,比如图4,把该ID的任务状态改成OS_STAT_SUSPEND,并开启定时器,如果这段时间没有其他打断,在超时函数里对该任务stat进行修改,修改为超时,下一次轮询任务stat时就会运行。如果在超时期间,有其他工作打断,比如信号量或者突然唤醒等,会停止该定时器。如下图7:

         图7

         这样我们就可以任意挂起与唤醒任意任务,并且有超时阻塞的功能。至于具体的信号量与队列的使用和原理,下面会进行详解。

        调度系统下载链接如下: https://download.csdn.net/download/moonlinux20704/12073629

        

猜你喜欢

转载自blog.csdn.net/moonlinux20704/article/details/103959982