Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
FinSH
list_thread
使用 Finsh 查看线程状态中的 sp 代表什么意思
发布于 2022-04-19 21:55:39 浏览:1529
订阅该版
[tocm] >佛说:“一切有为法,如梦幻泡影,如露亦如电,应作如是观。” >--《金刚经》 # 详解 sp 含义 最近使用 `RT-Thread` 的 `Finsh` 输入 `list_thread` 命令查看线程状态时,突然注意到多个线程在 `sp` 这一项内容上竟然是相同的,如下所示: ```c 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` 这一项是相同的,再来看看官方对于这一项的描述: ![在这里插入图片描述](https://img-blog.csdnimg.cn/43d05758c97f43268c0cabc5c766e280.png) 所以就有些疑惑了,RT-Thread 的线程是拥有自己独立的线程栈的,这就意味着不应该出现上文的栈地址相同的情况,既然这样,我们一探源码看看,老实的代码可不会骗人。 在 `cmd.c` 文件中的 `list_thread` 函数中找到 sp 选项对应的实现如下(仅保留相关代码): ```c #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文件找到其具体地址,如果是动态初始化的线程更麻烦),而使用相对地址,则很好地展现了当前栈的使用量情况。 # 参考资料 - [《main线程和tidle0线程 sp相同》:https://club.rt-thread.org/ask/question/435137.html](https://club.rt-thread.org/ask/question/435137.html) - [《求助:Finsh查看线程状态,两个线程的SP指针地址相同,且都显示错误号2?》:https://club.rt-thread.org/ask/question/5539.html](https://club.rt-thread.org/ask/question/5539.html) **更多精彩内容,更多惊喜,请点击 CSDN 博客地址 [http://eureka1024.blog.csdn.net/](http://eureka1024.blog.csdn.net/)**。 **更多精彩内容,更多惊喜,请关注公众号《嵌入式小散修》**。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/25bd55b9327845d989b2ea5d201eaeca.png)
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Eureka1024
嵌入式软件开发工程师一枚
文章
8
回答
94
被采纳
14
关注TA
发私信
相关文章
1
RT-THREAD shell无反应呢?
2
RT-thread2.0beta下用类似linux风格MSH,参数如何输入和导出
3
rt-thread finsh windows下的那个终端软件叫什么来着
4
板子上只有485接口,能把FINSH改造成485的么?
5
finsh最大字符问题
6
finsh命令个数是不是有限制啊
7
finsh支持转义字符吗
8
不用finsh如何知道堆栈使用量
9
强烈建议 RT-Thread下finsh原理深入分析
10
finsh输入命令全部返回null node
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部