调度器相关接口
调度器初始化
在系统启动时需要执行调度器的初始化,以初始化系统调度器用到的一些全局变量。调度器初始化可以调用下面的函数接口。
- void rt_system_scheduler_init(void);
线程安全
不安全
中断例程
不可调用
函数参数
无
函数返回
无
启动调度器
在系统完成初始化后切换到第一个线程,可以调用下面的函数接口。
- void rt_system_scheduler_start(void);
在调用这个函数时,它会查找系统中优先级最高的就绪态线程,然后切换过去执行。另外在调用这个函数前,必须先做idle线程的初始化,即保证系统至少能够找到一个就绪状态的线程执行。此函数是永远不会返回的。
线程安全
不安全
中断例程
不可调用
函数参数
无
函数返回
无
执行调度
让调度器执行一次线程的调度可通过下面的函数接口。
- void rt_schedule(void);
调用这个函数后,系统会计算一次系统中就绪态的线程,如果存在比当前线程更高优先级的线程时,系统将切换到高优先级的线程去。上层应用程序一般不需要调用这个函数。
线程安全
安全
中断例程
可调用
函数参数
无
函数返回
无
- 注:在中断服务例程中也可以调用这个函数,如果满足任务切换的条件,它会记录下中断前的线程及需要切换到的更高优先级线程,在中断服务例程处理完毕后执行真正的线程上下文切换(即中断中的线程上下文切换),最终切换到目标线程去。
设置调度器钩子
在整个系统的运行时,系统都处于线程运行、中断触发-响应中断、切换到其他线程,甚至是线程间的切换过程中,或者说系统的上下文切换是系统中最普遍的事件。有时用户可能会想知道在一个时刻发生了什么样的线程切换,可以通过调用下面的函数接口设置一个相应的钩子函数。在系统线程切换时,这个钩子函数将被调用:
- void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread* to));
这个函数用于把用户提供的hook函数设置到系统调度器钩子中,当系统进行上下文切换时,这个hook函数将会被系统调用。
线程安全
安全
中断例程
可调用
函数参数
- 参数 描述
- hook 表示用户定义的钩子函数指针;
这个hook函数的声明如下:
- void hook(struct rt_thread* from, struct rt_thread* to);
线程安全
安全
中断例程
可调用
函数参数
- 参数 描述
- from 表示系统所要切换出的线程控制块指针;
- to 表示系统所要切换到的线程控制块指针。
函数返回
无
- 注:请仔细编写你的钩子函数,稍有不慎将很可能导致整个系统运行不正常(在这个钩子函数中,基本上不允许调用系统API,更不应该导致当前运行的上下文挂起)。