-
2020-9-17
眼看他起朱楼,眼看他宴宾客,眼看他楼塌了。
– 孔尚任《桃花扇》 -
线程控制块是线程切换的核心,通过线程创建
rt_thread_create
/线程初始化rt_thread_init
函数将线程栈与线程入口函数绑定在线程控制块。 -
线程切换主要靠的是线程栈,切换时将当时线程运行的数据保存在线程栈,线程恢复时将线程栈的内容再恢复到线程栈中。
线程栈的内容如下,值得注意的是,运行过程中,R15存储的不一定是入口地址(由于入口函数运行到一半,此时切换的话,线程栈对应到pc寄存器的位置保存的是此时程序运行到的地址)
(图片来源于 野火书籍)
-
RTOS的局部变量如何加载到线程栈中?
在加载前,将psp寄存器改写成该线程栈指针,进入线程入口函数,局部变量都是由编译器分配在栈中,然后在运行的过程中变量改变,其实就是修改对应栈位置的内容。 -
为什么要手动保存寄存器的值呢?
因为此时寄存器有些值还没有更新到线程栈,所以需要手动更新。(其实保存当前寄存器的值,就是保护此时函数运行的状态) -
栈的高地址分配给寄存器,且位置固定(寄存器对应具体位置)是架构的安排吗?
是的,看rtt手册和m3权威指南 -
中断栈的变量存储在那里呢?
RT-thread的中断和不用rtos是一样的,由系统直接放入系统分配的栈中,使用的是msp.也是系统启动时用的那个(在启动文件定义的那个),跟跑裸机一样。
RT-Thread 的一些疑问和理解
最新推荐文章于 2024-06-29 19:22:33 发布