1. 调度器初始化
调度器是操作系统的核心,主要功能是实现线程的切换,即从就绪列表中找到优先级最高的线程,然后执行该线程。关于调度器的代码,RT-Thread在scheduler.c文件中实现。
调度器初始化:调度器在使用前必须初始化,具体代码如下:
/* 初始化系统调度器 */
void rt_system_scheduler_init(void)
{
register rt_base_t offset;
/* 线程就绪列表初始化 */
for(offset =0; offset<RT_THREAD_PRIORITY_MAX;offset++)
{
rt_list_init(&rt_thread_priority_table[offset]);
}
/* 初始化当前线程控制块指针 */
rt_current_thread = RT_NULL;
}
代码中 register rt_base_t offset; 定义了一个局部变量,用 register修饰,防止编译器优化。初始化完后整个就绪列表为空。
rt_current_thread = RT_NULL; 初始化当前线程控制块为空,rt_current_thread 是在scheduler.c文件中定义的一个struct rt_thread 类型的全局指针,用于指向当前正在运行的线程控制块。
调度器的初始化放在硬件初始化之前,具体代码如下:
/*硬件初始化*/
/* 硬件初始化*/
/*调度器初始化*/
rt_system_scheduler_init();
2. 启动调度器
调度器的启动由函数rt_system_scheduler_start()来实现,具体代码如下:
/* 启动系统调度器 */
void rt_system_scheduler_start(void)
{
register struct rt_thread *to_thread;
/* 手动指定第一个运行的线程 */
to_thread = rt_list_entry(rt_thread_priority_table[0].next,
struct rt_thread,
tlist);
rt_current_thread = to_thread;
/*
切换到第一个线程,改函数在context_rvds.S中实现,
在rthw.h声明,用于实现第一次线程切换。
当一个汇编函数在C文件中调用的时候,如果有形参,
则执行的时候会将形参传入CPU寄存器r0
*/
rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);
}
调度器在启动的时候会从就绪列表中取出优先级最高的线程的线程控制块,然后切换到该线程。目前的线程还不支持优先级,可以手动指定第一个运行的线程为就绪列表下标为0这条链表里面挂着的线程。