嵌入式技术论坛
直播中

kasdlak

8年用户 1180经验值
擅长:光电显示
私信 关注
[问答]

rt_vsnprintf函数内部数组分配为什么不在栈内?

环境 Rt-thread studio ,at32F437程序中使用了软件包rt_vsnprintf,使用jlink下载程序后,程序运行总会出现莫名的逻辑故障。
分析锁定问题后,发现rt_vsnprintf包的函数print_integer,buf的地址是 0x20000a68 为何没有分配在栈内?怀疑是此处的问题
1.png

map文件的栈设置如下

.stack 0x20000f68 0x800 load address 0x0809becc
0x20000f68 . = ALIGN (0x4)
0x20000f68 _sstack = .
0x20001768 . = (. + _system_stack_size)
fill 0x20000f68 0x800
0x20001768 . = ALIGN (0x4)
0x20001768 _estack = .
0x20001768 __bss_start = .
本来默认的栈大小是0x400,更改为0x800后,buf的地址依然不在栈内。

对照另外一个at32F437工程内,也使用的软件包rt_vsnprintf,buf的分配就是在栈内的。

问题:为何此工程的函数内部数组buf分配不在栈内呢?程序才刚刚跑起来,0x800大小的栈不可能这么快用完

回帖(1)

笑过就走

2023-10-11 11:36:19
在rt_vsnprintf函数内部数组分配栈内还是堆内并不是固定的,具体实现视编译器、操作系统和代码本身的设计而定。在你的代码中,栈区定义了一个起始地址为0x20000f68、大小为0x800的区域作为程序的栈空间。而在函数print_integer中,buf的地址被分配在了0x20000a68处,相对于栈区的起始位置偏移较大,因此可以猜测buf是被分配在堆区或者静态数据区。

至于为什么会出现莫名其妙的逻辑故障,需要具体分析代码和程序运行环境才能确定。你可以尝试使用调试器跟踪程序运行过程,查看变量的值和函数调用情况,找出具体的错误原因。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分