用贵公司的3687开发产品有一段时间了,可是有一个简单的问题(堆和栈)没有弄明白:
开始新建工程师,一般采用的都是默认设置,只是在工程中会根据需要改变一下Section 设置,在生成向导中有Heap 和stacksize 两个选项。
请问:1. 选不选Heap 对程序会有影响吗? 我的程序并没有new,malloc 等关键字。我程序里设置#define HEAPSIZE 0x004,我试着将sbrk.c 删除掉,就会出现Undefined external symbol "_sbrk" referenced in "malloc" 错误。不知道为什么?
2. 据我了解,程序的中函数参数,临时变量等都会存放到栈(stack)中,可是我试着改变stack大小到很小,例如#pragma stacksize 0x10时候,程序仍然没有问题,运行正常,不知道是怎么回事?
.map 文件如下:
.。。。 。。。
PResetPRG
00000400 0000041b 1c 2
PIntPRG
0000041c 00000443 28 2
P
00000800 00007d0f 7510 2
C
00007d10 000083e5 6d6 2
C$DSEC
000083e6 000083eb 6 2
C$BSEC
000083ec 000083ef 4 2
D
000083f0 00008433 44 2
CDataB
0000a000 0000b757 1758 2
B
0000e800 0000ec69 46a 2
R
0000ec6a 0000ecad 44 2
S
0000ef00 0000efff 100 2
BBEXT
0000fd00 0000ff0f 210 2
C$INIT
0000ff10 0000ff11 2 2
共7条
1/1 1 跳转至页
第一个问题,如果程序中不用到new,malloc等功能,建议不选Heap。对程序没影响。还能省资源。另外,如果不选Heap,自动生成的启动文件里面也没有sbrk.c这个函数。所以,建议不选。
第二个问题,
B 0000e800 0000ec69 46a 2
R 0000ec6a 0000ecad 44 2
S 0000ef00 0000efff 100 2
E800 RAM首地址(低地址)
EFFF RAM尾地址(高地址)
初始化后,栈指针在EFFF,栈递减生长
EFFF - 栈大小 = 栈底(即您上边的ef00)
不管栈大小定义了多少,栈照常运行,栈指针照常递减。
您定义的栈大小,用于编译器检查,如果S段与R段内容冲突了,就报错。如果没冲突,栈运行到S段之外是有可能的,但是也可能会有冲突危险。
总之,设定一个合适的堆栈大小“确保值”,还是很必要的。
共7条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |