打印

怎样获取映像中代码段和数据段的大小???

[复制链接]
3811|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zfm850722|  楼主 | 2009-11-26 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用 IAR EWARM 5.20 开发 STM32F103ZC(Cortex-M3内核)

在连接配置文件(.icf)中,我想分别获取 readonly 和 readwrite 块的大小,然后将指定的内存大小减去这两块的大小之后的剩余空间作为堆栈使用,这个要怎么实现呢?

举个例子:

memory     = 256k
readonly   = ?
readwrite  = ?
heap       = memory - readonly - readwrite


最好给个示例的连接配置文件(.icf)

谢谢了。
沙发
lxyppc| | 2009-11-26 10:45 | 只看该作者
IAR 5.20不知道
IAR 4.42中只要把HEAP的声明放在他们的后面就行了,大小指定为内存大小就行
编译器自己会去算的

使用特权

评论回复
板凳
zfm850722|  楼主 | 2009-11-26 15:38 | 只看该作者
IAR 5.20 的有人知道吗???

使用特权

评论回复
地板
byeyear| | 2009-11-26 18:10 | 只看该作者
同问!
翻遍help没有找到
搬4.42的用法说icf文件出错
我宁愿伺候gcc的link script
虽说有点脾气 功能强大啊

使用特权

评论回复
5
kiton_law| | 2009-11-27 01:42 | 只看该作者
同问!
翻遍help没有找到
搬4.42的用法说icf文件出错
我宁愿伺候gcc的link script
虽说有点脾气 功能强大啊
byeyear 发表于 2009-11-26 18:10


哎,同意,这点上就gcc做的最爽了。

使用特权

评论回复
6
zfm850722|  楼主 | 2009-12-2 12:25 | 只看该作者
请香主帮忙
实在没有办法了

使用特权

评论回复
7
vigia| | 2009-12-2 17:11 | 只看该作者
纠正一点:
readonly是指flash,这段区域不能用于做堆栈。

你这样做的目的是什么呢?

有个笨办法,在链接生成的map文件里,可以查到RAM区用了多少字节,然后再回过头去重写icf。。。。。。

使用特权

评论回复
8
zfm850722|  楼主 | 2009-12-4 08:50 | 只看该作者
楼上的,谢谢你的回复

我不是想让readonly段做为堆栈来用,我只是想获取readonly和readwrite段的大小,然后将他们之外的空间作为堆栈来用。
举个例子:

memory     = 256k
readonly   = ?
readwrite  = ?
heap       = memory - readonly - readwrite


最好给个示例的连接配置文件(.icf)

谢谢了。

使用特权

评论回复
9
vigia| | 2009-12-4 09:34 | 只看该作者
也许我没说清楚

READONLY段在FLASH中,READWRITE在RAM中。你所谓的MEMORY是指FLASH还是RAM还是FLASH+RAM的总大小阿?无论是什么,MEMORY-READONLY-READWRITE都没有任何意义。HEAP只能存在于RAM中。你要是说HEAP=RAM-READWRITE,那还有点意义。

目前,据我所知,IAR无法满足你的需求,但我在7楼说过了,如果你非要定义一个最大范围的HEAP,你可以在链接结束后的MAP文件中找到READWRITE的大小,然后重新回过头去写ICF文件。

使用特权

评论回复
10
again_gyf| | 2009-12-4 13:14 | 只看该作者
汗,自己写启动代码就可以实现,管他什么HEAP,还是STACK

使用特权

评论回复
11
again_gyf| | 2009-12-4 13:21 | 只看该作者
define block READONLY_BLOCK { readonly };
SFB(READONLY_BLOCK)
SFE(READONLY_BLOCK)

使用特权

评论回复
12
zfm850722|  楼主 | 2009-12-4 18:01 | 只看该作者
vigia:

非常谢谢你

那你能告诉我 HEAP=RAM-READWRITE 要怎么实现呢???

期待你的回复

使用特权

评论回复
13
zfm850722|  楼主 | 2009-12-4 18:05 | 只看该作者
again_gyf:

你好,如果自己写启动代码要怎么实现呢?  我不会啊,能不能教教我啊???

还有你写的:
define block READONLY_BLOCK { readonly };
SFB(READONLY_BLOCK)
SFE(READONLY_BLOCK)
这些都代表了什么含义啊???

使用特权

评论回复
14
lxyppc| | 2009-12-4 20:44 | 只看该作者
对了,楼上
你的这个要求是“运行时”的还是“编译时”的

使用特权

评论回复
15
voidx| | 2009-12-4 20:55 | 只看该作者
暂时用这个

//设置部分  
define symbol RAM_SIZE   =   1024*16;  
define symbol ROM_SIZE   =   1024*64;

define symbol CSTACK_SIZE =  1024*1;  
define symbol HEAP_SIZE   =  1024*1;

//非设置部分  
define symbol RAM_START  = 0x20000000;   
define symbol ROM_START  = 0x08000000;   

define symbol INTVEC_START = ROM_START;  

define memory mem with size = 4G;  

define region ROM_region   = mem:[from ROM_START  size  ROM_SIZE];  
define region RAM_region   = mem:[from RAM_START  size  RAM_SIZE];  

define block CSTACK    with alignment = 4, size = CSTACK_SIZE  { };  
define block HEAP      with alignment = 8, size = HEAP_SIZE    { };  

initialize by copy { rw };  
do not initialize  { section .noinit };  

place at address mem:INTVEC_START {ro section .intvec };  
place in ROM_region   {ro code,ro data};   

place at start of  RAM_region   {rw};   
place in RAM_region   {block HEAP};  
place at end of RAM_region {block CSTACK};

使用特权

评论回复
16
司徒老鹰| | 2009-12-4 22:12 | 只看该作者
都是好热心的人啊

使用特权

评论回复
17
gxgclg| | 2009-12-5 20:44 | 只看该作者
15楼的回复跟讨论的主题有关系吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

27

帖子

0

粉丝