嵌入式技术william hill官网
直播中

发生的方式

8年用户 1223经验值
擅长:处理器/DSP
私信 关注
[问答]

RISC-V链接脚本中的_stack_size的作用是什么

使用的是CH32V103R8T6的开发板,代码是RT-Studio上下载的EVK的例程。

对于例程中的链接脚本中_stack_size变量的作用比较疑惑

我的理解是,编译器把栈内存放到RAM开头,剩余的RAM可以分配给堆。(定义了全局变量打印地址也确认了是在RAM开头)

但链接脚本里定义了一个2K的_stack_size变量,并且在RAM的结尾把这个2K分出来不允许分配成堆内存,那这个2K的内存具体作用是什么?

链接文件开头定义:

1.jpg

定义堆结尾地址时用RAM结尾减去了_stack_size

1.jpg

回帖(5)

张鹏

2022-11-16 11:29:32
谜底就在谜面上啊; 这 2k 用来放临时变量这些应该在栈的东西,malloc 不要来摸我
举报

发生的方式

2022-11-16 11:29:46
不对吧,RTT的临时变量都是在线程栈里出的啊
线程栈要么是静态的,是编译器分配的,在RAM开头,要么从堆里出,无论哪种都不会到RAM结尾这2K里来的

malloc用堆不用栈我明白,我的问题是:现在RAM开头和结尾分了两段栈,开头的是编译器分配的用来存放全局变量等,这个没疑问,结尾一段是链接脚本里分了2K,这2K是干什么用的?

我测试了全局变量、局部变量,打印的地址都不在这2K里,并不是你说的“存放应该在栈里的东西”
举报

张鹏

2022-11-16 11:29:59
哪里看到分配了2个stack?
只分配了一个stack; 前面的只是定义了一个变量而已;并不是section
举报

发生的方式

2022-11-16 11:30:17
实际现象就是被分成了两个部分啊
定义的变量地址被分配在了RAM开头,链接脚本在RAM结尾又分配了2K,前面已经说的很明确了啊
如果是你说的“ 前面的只是定义了一个变量而已”岂不是和你之前说的“这 2k 用来放临时变量这些应该在栈的东西”相矛盾吗?变量到底是在RAM前面还是后面的2K?
举报

刘芳

2022-11-16 11:30:27
这个是中断栈吧,一是在scheduler起来之前用,二是中断时用
举报

更多回帖

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