完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
详解 sp 含义
最近使用 RT-Thread 的 Finsh 输入 list_thread 命令查看线程状态时,突然注意到多个线程在 sp 这一项内容上竟然是相同的,如下所示: thread pri status sp stack size max used left tick error -------- --- ------- ---------- ---------- ------ ---------- --- tidle 31 ready 0x00000040 0x00000100 25% 0x00000020 000 timer 4 suspend 0x00000044 0x00000200 29% 0x00000009 000 main 10 running 0x00000040 0x00000800 03% 0x00000014 000 可以看到 tidle 和 main 线程的 sp 这一项是相同的,再来看看官方对于这一项的描述: 所以就有些疑惑了,RT-Thread 的线程是拥有自己独立的线程栈的,这就意味着不应该出现上文的栈地址相同的情况,既然这样,我们一探源码看看,老实的代码可不会骗人。 在 cmd.c 文件中的 list_thread 函数中找到 sp 选项对应的实现如下(仅保留相关代码): #if defined(ARCH_CPU_STACK_GROWS_UPWARD)//向上增长的栈 ((rt_ubase_t)thread->sp - (rt_ubase_t)thread->stack_addr), //sp的值 #else //向下增长的栈,Cortex-M 系列属于这种 thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp), //sp的值 #endif 首先需要说明的是,对于 thread->stack_size 和 thread->stack_addr 一旦初始化后是不变的。 再看看上述代码,我们可以知道此处的 sp 并不是指的是线程栈指针(应是 thread->sp),而是指的是相对于栈底的位置的距离。 这里假设所有线程的栈底地址都是 0x00000000,则对于上文中的 main 线程的 sp(0x00000040)的值则是相对于栈顶值的距离为 0x00000040。 总结来说 Finsh 打印出的 sp 值代表的是一个相对于栈底的值,含义是线程指针 thread->sp 距离栈底的距离。由于是相对的,所以会出现很多线程在这一项上相同也是正常的,并不是出现了什么异常? sp 这一项内容之所以没有选择使用绝对地址其实是合理的,因为假设显示的是绝对地址,你从这个地址得到的信息量非常少,这一串地址无法推出当前堆栈的使用情况(除非你查看栈底位置,那么你就需要找到代码,还要查看map文件找到其具体地址,如果是动态初始化的线程更麻烦),而使用相对地址,则很好地展现了当前栈的使用量情况。 |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AI模型部署边缘设备的奇妙之旅:边缘端设备的局域网视频流传输方案
1650 浏览 0 评论
1515 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
6754 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1881 浏览 0 评论
4099 浏览 0 评论
78784 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-3 02:57 , Processed in 0.332272 second(s), Total 34, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号