嵌入式技术论坛
直播中

张敏

8年用户 1664经验值
私信 关注
[经验]

介绍一下RT-Thread实时操作系统调度器的相关接口

调度器初始化

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

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,更不应该导致当前运行的上下文挂起)。

原作者:书栈网

更多回帖

发帖
×
20
完善资料,
赚取积分