【RT-Thread读书笔记】(2)线程栈初始化、就绪列表及调度器
[复制链接]
一,线程栈初始化
在线程初始化中,其中有一步是进行线程栈的初始化,线程栈是单片机RAM中的一段连续的内存空间(全局数组),那么对线程栈的初始化显然就是对一段连续的内存空间赋初使值,线程栈的初始化是利用rt_hw_stack_init()来完成的,需要说明的是,线程栈中存放的数据并不是随机的杂乱无章的,而是按照严格的位置存放CPU各个寄存器的值,因为这些值在线程从非运行态恢复到运行态时,是要依次恢复给CPU的寄存器的,具体的存放方式是从栈顶开始,首先是异常发生时自动保存的8个寄存器(xPSR,R15,R14,R12,R3,R2,R1,R0),剩下的是8个需要手动加载到CPU寄存器的参数(R4-R11),书中写这几个寄存器的初始值被默认初始化为0xdeadbeef,至于为什么是这个值,书中没做解释,也暂时不做深究。另外就是xPSR寄存器的第24位必须设置成1(指示MCU是处于ARM状态还是Thumb状态)。
二,就绪列表
就绪列表实际是一个数组,里面的存放的数据是rt_list_t类型的,数组的大小由表示最大线程优先级的的宏RT_THREAD_PRIORITY_MAX决定,RT_THREAD_PRIORITY_MAX默认定义为32,数组下标与线程的优先级是想对应的。将线程插入到就绪列表是通过将线程控制块的tlist节点插入到就绪列表中,插入到就绪列表的线程系统随时可以调用。
三,调度器
调度器作为操作系统的核心,主要功能就是实现线程的切换,也就是从就绪列表中找到优先级最高的线程,线程的切换代码主要是用汇编语言编写的,主要原理就是保存当前线程的参数到线程栈中,然后将要运行的线程的参数从线程栈恢复到MCU的寄存器,然后继续运行。
此内容由EEWORLD论坛网友dong2213dong原创,如需转载或用于商业用途需征得作者同意并注明出处
|