标签:code pre 核心 ima c中 优化 下标 局部变量 文件中
线程创建好之后,我们需要把线程添加到就绪列表里面,表示线程已经就绪,系统随时可以调度。就绪列表在schedule.c中定义。
/* 线程就绪列表 */ rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];
就绪列表实际上就是一个rt_list_t 类型的数组,数组的大小由决定最大线程优先级的宏RT_THREAD_PRIORITY_MAX决定,RT_THREAD_PRIORITY_MAX在rtconfig中默认定义为32.数组的下标对应了线程的优先级,同一优先级的线程统一插入到就绪列表的同一链表中。一个空的就绪列表如下:
线程控制块里面有一个tlist成员,数据类型为rt_list_t,我们将线程插入到就绪列表里面,就是通过将线程控制块的tlist这个节点插入到就绪列表中来实现的。如果把就绪列表比作晾衣杆,线程就是衣服,那tlist就是晾衣架,就是为了把自己挂在各种不同的链表中。线程插入到就绪列表的示意图。
调度器是操作系统的核心,其主要功能就是实现线程的切换,即从就绪列表里面找到优先级最高的的线程,然后去执行该线程。从代码上来看,调度器无非也就是由几个全局变量和一些可以实现线程切换的函数组成,全部都在schedule.c文件中实现。
调度器在使用之前必须先初始化,具体如下:
/* 初始化系统调度器 */ void rt_system_scheduler_init(void) { register rt_base_t offset;// (1) /* 线程就绪列表初始化 */ for (offset = 0; offset < RT_THREAD_PRIORITY_MAX; offset ++) // (2) { rt_list_init(&rt_thread_priority_table[offset]); //(2) } /* 初始化当前线程控制块指针 */ rt_current_thread = RT_NULL;// (3) }
系统调度就是在就绪列表中寻找优先级最高的就绪线程,然后去执行该线程。系统调度函数rt_schedule()。
标签:code pre 核心 ima c中 优化 下标 局部变量 文件中
原文地址:https://www.cnblogs.com/tansuoxinweilai/p/14952230.html