Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
FinSH
线程栈stack
关于在单片机资源有限的情况下不能使用FinSH的情况下获取线程栈使用量的疑问
发布于 2021-11-09 13:15:37 浏览:848
订阅该版
最近在开发一款产品,用到了RTT Nano,由于资源有限串口无法分配给FinSH,Ram空间也有限,所以要斤斤计较,无奈只能裁减掉FinSH,但这样一来就无法优化线程栈,没有办法求助万能的API和论坛,基本无果,还好代码是开源的,先从FinSH下手 ```c ptr = (rt_uint8_t *)thread->stack_addr; while (*ptr == '#')ptr ++; rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n", thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp), thread->stack_size, (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 / thread->stack_size, thread->remaining_tick, thread->error); ``` 百思不得其解,为何要搜索栈空间的'#',难道里面有机关? 于是继续阅读代码,找到了线程初始化的相关代码。 ```c /* stack init */ thread->stack_addr = stack_start; thread->stack_size = stack_size; /* init thread stack */ rt_memset(thread->stack_addr, '#', thread->stack_size); ``` 在线程栈分配完之后,会对栈内成员全部赋值成'#'。 难怪FinSH会查找第一个'#',但这也会带来另外一个问题,如果程序内有赋值操作对变量赋值成了'#',那么计算结果是否就会出错。 我就在想,是否可以从栈尾查找第一个非'#'的内存单元,这样相对来说是否更可靠一些。欢迎交流和指正。
查看更多
李肯陪你玩赚嵌入式
认证专家
2021-11-09
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
可以参考freertos,使用0xA5这种幻数来进行; 至于为何采用0xA5,是因为A5使用16进制表示是:10100101;它的0/1分布是规律的,所以冲突率会比较低,当然也是不能杜绝用户数据就是A5的情况。 详细代码:[tasks.c](https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/tasks.c) ![image.png](https://oss-club.rt-thread.org/uploads/20211109/1da08e7363a3966fd84c7e853ff041db.png) ![image.png](https://oss-club.rt-thread.org/uploads/20211109/54468dab50175751a0b5e653b9c8fa85.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20211109/4727a79711ed6a20d0172c40a2e7b226.png.webp)
4
个回答
默认排序
按发布时间排序
静静流淌的柯溪
2021-11-09
这家伙很懒,什么也没写!
一般情况下,没有那么巧就命中了# 你也可以改一下 比如连续搜索到了三个# 再结束
aozima
2021-11-09
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>如果程序内有赋值操作对变量赋值成了'#',那么计算结果是否就会出错。 统计结果略偏小几字节而已,没什么实际影响。 实际应用中,栈里又不可能全是`'#'`
RTT_晓风
2021-11-10
这家伙很懒,什么也没写!
rt thread 这样设计是正常的,在程序运行正常的情况下,很难产生误判,原因有: * rt thread 这种是找到曾经用到过的最大的栈,方便工程师根据实际栈的大小修改申请的栈。 * 栈的增长是有方向的,你这里的代码,栈是向下增长的,所以从小地址往大地址,找到第一个非#的地址为剩余的栈的大小,除非特别巧,栈底部的几个字节为#,否则不会出错,就算出错,也只会错几个字节,毕竟连续的#号的使用在程序不多,如果你这个程序使用的较多,可以换个字符,如果从栈顶(也就是文主的尾部)往下查非#的,那么第一个字节可能就是非#的,程序都实现不了。 * 至于变量被赋值成#,要满足几个条件,这个#号才会被保存到栈上,这个变量是局部变量,且被赋值后,被中断或task抢占,这个变量才会被保存到栈上,但是,这个#号有没有保存到正好影响判断的地方,需要根据具体平台分析。
撰写答案
登录
注册新账号
关注者
0
被浏览
848
关于作者
zwm
这家伙很懒,什么也没写!
提问
2
回答
2
被采纳
0
关注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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部