调度器相关接口

调度器初始化

在系统启动时需要执行调度器的初始化,以初始化系统调度器用到的一些全局变量。调度器初始化可以调用下面的函数接口。

  1. void rt_system_scheduler_init(void);

线程安全

不安全

中断例程

不可调用

函数参数

函数返回

启动调度器

在系统完成初始化后切换到第一个线程,可以调用下面的函数接口。

  1. void rt_system_scheduler_start(void);

在调用这个函数时,它会查找系统中优先级最高的就绪态线程,然后切换过去执行。另外在调用这个函数前,必须先做idle线程的初始化,即保证系统至少能够找到一个就绪状态的线程执行。此函数是永远不会返回的。

线程安全

不安全

中断例程

不可调用

函数参数

函数返回

执行调度

让调度器执行一次线程的调度可通过下面的函数接口。

  1. void rt_schedule(void);

调用这个函数后,系统会计算一次系统中就绪态的线程,如果存在比当前线程更高优先级的线程时,系统将切换到高优先级的线程去。上层应用程序一般不需要调用这个函数。

线程安全

安全

中断例程

可调用

函数参数

函数返回

  • 注:在中断服务例程中也可以调用这个函数,如果满足任务切换的条件,它会记录下中断前的线程及需要切换到的更高优先级线程,在中断服务例程处理完毕后执行真正的线程上下文切换(即中断中的线程上下文切换),最终切换到目标线程去。

    设置调度器钩子

在整个系统的运行时,系统都处于线程运行、中断触发-响应中断、切换到其他线程,甚至是线程间的切换过程中,或者说系统的上下文切换是系统中最普遍的事件。有时用户可能会想知道在一个时刻发生了什么样的线程切换,可以通过调用下面的函数接口设置一个相应的钩子函数。在系统线程切换时,这个钩子函数将被调用:

  1. void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread* to));

这个函数用于把用户提供的hook函数设置到系统调度器钩子中,当系统进行上下文切换时,这个hook函数将会被系统调用。

线程安全

安全

中断例程

可调用

函数参数


  1. 参数 描述

  1. hook 表示用户定义的钩子函数指针;

这个hook函数的声明如下:

  1. void hook(struct rt_thread* from, struct rt_thread* to);

线程安全

安全

中断例程

可调用

函数参数


  1. 参数 描述

  1. from 表示系统所要切换出的线程控制块指针;
  2.  
  3. to 表示系统所要切换到的线程控制块指针。

函数返回

  • 注:请仔细编写你的钩子函数,稍有不慎将很可能导致整个系统运行不正常(在这个钩子函数中,基本上不允许调用系统API,更不应该导致当前运行的上下文挂起)。