这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请教Renesas工程师一个问题

共7条 1/1 1 跳转至

请教Renesas工程师一个问题

菜鸟
2008-05-26 19:56:39     打赏
用贵公司的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



关键词: 请教     Renesas     工程师     一个     问题    

助工
2008-05-27 09:34:42     打赏
2楼

请稍等......


菜鸟
2008-05-27 11:54:30     打赏
3楼

第一个问题,如果程序中不用到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段之外是有可能的,但是也可能会有冲突危险。

总之,设定一个合适的堆栈大小“确保值”,还是很必要的。


菜鸟
2008-05-27 19:50:00     打赏
4楼
多谢楼上的详细的分析。
对于第一个问题,我还是有一点不明白:我起初新建工程时候选了Heap,并设置了大小,但后来我发现这个对我应该没有用,所以我就试着将sbrk.c和sbrk.h删除,但删除后就会出现:Undefined external symbol "_sbrk" referenced in "malloc"  错误。很是不解。我的程序里没有malloc 函数啊。
盼回复。

菜鸟
2008-05-27 21:31:11     打赏
5楼
我还是觉得您的程序里不知什么地方可能用到了malloc这个关键字。

我没有您那款单片机,但是用另外一款试验了一下,发现按您所说,删掉sbrk.c和sbrk.h也不会编译报错。但是如果在程序里任何地方调用malloc,就出现您所说的错误。

因此,如果是为了消除错误,建议您再正确地建立一个工程,然后再把您的源代码加进去。
为了弄清这个问题的根源,也请您把那个出错的工程打包发给我(整个目录及子目录)。

我已经给您发了消息,写明了我的邮件。找到错误原因之后,我会给您答复。

菜鸟
2008-05-28 16:55:17     打赏
6楼
我仔细查了下程序,程序用C++做的,有的类中写了构造函数,我试着把所有的类的构造函数屏蔽掉就好了,我估计可能是构造函数调用了库函数malloc的原因,但不确定。

菜鸟
2008-05-30 08:35:45     打赏
7楼

  还是不行,硬件上是不是有特别的要求


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]