OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 36343|回复: 19

KEIL编译综合实验,ZI-data那么大,超过stm32RAM容量,为什么还能运行

[复制链接]

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
发表于 2014-7-28 16:35:19 | 显示全部楼层 |阅读模式
5金钱
RT,综合实验的编译结果

Program Size: Code=191462 RO-data=87366 RW-data=5700 ZI-data=1104356  

可以看到ZI-data已经有1M的大小了。。。。

最佳答案

查看完整内容[请看2#楼]

用了外部SRAM。。。
我可以一辈子都呆在家里不出来么?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-7-28 16:35:20 | 显示全部楼层
站在巨人的肩膀上不断的前进。。。
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
 楼主| 发表于 2014-7-29 08:21:15 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
额,抱歉,问了弱智的问题,,,,主要是我自己的东西编译之后:
Program Size: Code=58880 RO-data=176552 RW-data=1048 ZI-data=260120  
我这个没有外扩RAM的,这个zi-data都已经260K了,居然也能用。。。以前一直能用就没注意这个东西。

后来又加了一些东西,编译后大了一点,直接进入hardfault了。。。在启动汇编那一段之后,直接进入hardfault了,怀疑是RAM不够的问题。
我自己的工程上面用了FATFS+USB+jpeg解码+一些基本外设,自己做的图形菜单界面。
我可以一辈子都呆在家里不出来么?
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
 楼主| 发表于 2014-7-29 08:32:21 | 显示全部楼层
驱动框架代码(可用)             rogram Size: Code=58880 RO-data=176552 RW-data=1048 ZI-data=260120  
加入上层应用代码(hardfault)Program Size: Code=80572 RO-data=184124 RW-data=1400 ZI-data=264888  

对比了一下,其实ZI-DATA增加的两不是很多,倒是FLASH,驱动框架代码大约480K,但是加入上层应用后的代码就超过512K了。
我找找原子的资料,吧FATFS的字库文件放到FLASH中去。

但是为什么驱动框架代码已经260K了还能用呢?我没有外扩RAM。    因为驱动框架用了USB+FATFS我刚才试了下,只要加入USB库,编译后的RAM占用已经超过64K了。  是不是keil显示的这个ZI-DATA是不准确的?
我可以一辈子都呆在家里不出来么?
回复

使用道具 举报

28

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-4-14
在线时间
1 小时
 楼主| 发表于 2014-7-29 08:42:58 | 显示全部楼层
仅仅是一个USB库,编译过后占用的RAM大小已经有200K左右了,就算超过64K,keil也不报错,我的RAM没有外扩,也没有设置外扩。
我可以一辈子都呆在家里不出来么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-7-29 10:50:06 | 显示全部楼层
回复【4楼】杨帆:
---------------------------------
你没外扩,只要你程序里面有类似这样的代码:
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //外部SRAM内存池

MDK就人为你外扩了。这就是定义在外部内存地址的数据。
和你外部外扩没关系,但是你下载到没外扩的板子,就可能死机了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-7-29 10:50:17 | 显示全部楼层
MDK只认代码,不认你硬件的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-7-29 10:50:59 | 显示全部楼层
可以用,有一种可能是你申定义了一个很大的外部数组,但是没有用到这个数组,自然就不会出问题。
但是只要你用到这个数组,问题就会出来了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-12-6
在线时间
11 小时
发表于 2015-4-9 16:25:29 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
那这个问题怎么解决呢??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-4-9 23:04:23 | 显示全部楼层
回复【9楼】在水一方:
---------------------------------
什么问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2014-12-6
在线时间
11 小时
发表于 2015-4-10 14:41:34 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
算法中用到很大的数组,在编译后SRAM空间占用太满,程序无法运行下去了,这个怎么解决合适??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-4-10 20:00:03 | 显示全部楼层
回复【11楼】在水一方:
---------------------------------
减少数组,或者用更大内存的芯片。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

133

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-12-21
在线时间
1 小时
发表于 2015-4-12 09:38:04 | 显示全部楼层
mcu操作了不存在的地址,自然会hardfault了。这就是所谓的越界操作,以前被这个搞得很蛋疼,把原子哥例程里的内存池改成4kb就好多了。虽然聊胜于无。。
流过汗水才能代表自己真的学会了如何不流汗。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-1-25
在线时间
0 小时
发表于 2019-1-25 17:56:41 | 显示全部楼层
正点原子 发表于 2014-7-29 10:50
回复【4楼】杨帆:
---------------------------------
你没外扩,只要你程序里面有类似这样的代码:
__alig ...

原子哥,那如果我没有使用外部RAM,内存管理的相关程序要怎么改啊?
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2019-1-25 18:26:04 | 显示全部楼层
哟吼吼 发表于 2019-1-25 17:56
原子哥,那如果我没有使用外部RAM,内存管理的相关程序要怎么改啊?

原子哥的内存管理。

开头部分有让用户确定使用外部地址或者内部地址的。

你把那里改成使用内部数组,然后更改使用内存的容量就好啦。

像这种   __align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));        //外部SRAM内存池

就是内存按照4字节对齐,然后这个数组起始地址在0X68000000属于外部SRAM
使用内部RAM不需要 __attribute__((at(0X68000000)));
回复

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1857
金钱
1857
注册时间
2012-5-19
在线时间
285 小时
发表于 2020-3-4 15:09:15 | 显示全部楼层
本帖最后由 zhcj66 于 2020-3-4 15:10 编辑
正点原子 发表于 2015-4-10 20:00
回复【11楼】在水一方:
---------------------------------
减少数组,或者用更大内存的芯片。

原子
程序在未添加 USB读卡器的时候,编译正常
未添加前占用空间是
,Program Size: Code=39452 RO-data=1316 RW-data=372 ZI-data=1231108  
USBD_Init(&USB_OTG_dev,USB_OTG_FS_CORE_ID,&USR_desc,&USBD_MSC_cb,&USR_cb);
添加后报错,怎么回事?

.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f40_41xxx.o(STACK).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching sdio_sdcard.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching uart1.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching dguslcd.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching modbus.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching dmaget.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching main.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching exfuns.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_msc_core.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_req.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching portregistered.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_desc.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_core.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_storage_msd.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching dguslcdupdate.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching malloc.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_msc_scsi.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_msc_scsi.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbh_usr.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching workprompt.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching exfuns.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching buzzer.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching sdio_sdcard.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f4xx_rcc.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_req.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching ff.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching dguslcdupdate.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching ds3231.o(.bss).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching delays.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching tim_x.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching usbd_msc_bot.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching stdout.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching errno.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching collectdata.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching w25qxx.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching diskio.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6406E: No space in execution regions with .ANY selector matching ff.o(.data).
.\Obj\103ZE_MDK5.axf: Error: L6407E: Sections of aggregate size 0xf34 bytes could not fit into .ANY selector(s).
1.png
回复

使用道具 举报

14

主题

164

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1857
金钱
1857
注册时间
2012-5-19
在线时间
285 小时
发表于 2020-3-4 15:24:50 | 显示全部楼层
正点原子 发表于 2014-7-29 10:50
回复【4楼】杨帆:
---------------------------------
你没外扩,只要你程序里面有类似这样的代码:
__alig ...

RW-data=372 ZI-data=1231108  
占用ram1231480B=1.2M  用IS62WV51216芯片可以吗?
IS62WV51216芯片容量是怎么计算的?
19条地址线2的19次方=524288,数据线是16位宽,是不是524288*2=1048576B=1024KB=1MB,
那么 占用ram1231480B=1.2M 是不是这个芯片就搞不定了?
回复

使用道具 举报

6

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2013-3-9
在线时间
9 小时
发表于 2020-6-7 10:14:16 | 显示全部楼层
代码大小的统计错误解决办法,转https://blog.csdn.net/tinianyou/article/details/106597843
回复

使用道具 举报

7

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-9-18
在线时间
46 小时
发表于 2022-7-23 11:11:17 | 显示全部楼层
正点原子 发表于 2014-7-29 10:50
回复【4楼】杨帆:
---------------------------------
你没外扩,只要你程序里面有类似这样的代码:
__alig ...

原子哥,精英板子没有外扩SRAM呀,但是我看我的精英综合例程代码确实是给外扩了960 *1024 的SRAM,但是为啥还可以正常运行呀,,,我不能理解呀,超出了这么多都没事,是有啥特殊处理吗
回复

使用道具 举报

7

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2017-9-18
在线时间
46 小时
发表于 2022-7-23 11:11:50 | 显示全部楼层
正点原子 发表于 2014-7-29 10:50
回复【4楼】杨帆:
---------------------------------
你没外扩,只要你程序里面有类似这样的代码:
__alig ...

超出了大约1M
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-26 18:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表