16383|0

361

帖子

5

TA的资源

一粒金砂(高级)

楼主
 

【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原创,如需转载或用于商业用途需征得作者同意并注明出处





点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表