嵌入式系统内存分配的若干问题

yinchao163 2017-03-08 03:48:23
背景:本人需要在一块DSP上运行复杂的算法,算法需要分配大量数组,由于不能使用外部SDRAM用来缓存数据,导致程序运行时内存不够而崩溃。
疑问:
1. 程序能够编译通过并正常运行的情况下,(尤其是大的数组赋值时)为什么会篡改其他的全局变量?
2. 程序能够通过编译,运行时为什么会触发写到ROM的保护?
3. 被注释掉的代码会占用系统运行时内存吗?(考虑后续开发的兼容性,代码段比较大,有许多扩展模式)
4. 节省代码段的长度可以提高内存使用率吗?
...全文
253 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinchao163 2017-03-08
  • 打赏
  • 举报
回复
代码烧录在ROM里没错,但是程序运行时,是不是需要加载到RAM里面才能运行呀?没听说过直接在ROM里面跑程序的
赵4老师 2017-03-08
  • 打赏
  • 举报
回复
代码可以烧到ROM中,变量才需要RAM
yinchao163 2017-03-08
  • 打赏
  • 举报
回复
感谢大侠的解答。关于1-3点的解答和我设想的是一致的。 关于第四点:深入一点讨论,在最初的内存规划时,系统应该是设定了几块固定好的区域分别用来作为存储代码段、静态和全局变量段、堆栈段的。而系统在上电运行时,代码必须拷贝到内存中并且使指针指向代码的第一条指令,程序才可以正确运行。 如果是被注释的代码,有可能由于链接的关系,最终不会被放入内存,这个没问题。但是...真正要运行的代码段毫无疑问是要放入内存的,所以,严格意义上来说,精简代码,然后手动缩小代码空间,是可以节约运行时内存的,当然了,这是我想当然,仅仅是推断,我自己没有这么做过。 恳请各位有经验的人士来不吝赐教。
自信男孩 2017-03-08
  • 打赏
  • 举报
回复
1. 程序能够编译通过并正常运行的情况下,(尤其是大的数组赋值时)为什么会篡改其他的全局变量? 答:应该是嵌入式的内存不足,申请大的空间,导致变量空间重叠; 2. 程序能够通过编译,运行时为什么会触发写到ROM的保护? 答:编译通过,只是用来检查语法,简单的逻辑问题,不会检查申请空间过大的问题,编译器也不会去做这些事情; 3. 被注释掉的代码会占用系统运行时内存吗?(考虑后续开发的兼容性,代码段比较大,有许多扩展模式) 答:被注释掉的代码,在编译时就不会进入目标文件和可执行程序里,所以也不会占用内存; 4. 节省代码段的长度可以提高内存使用率吗? 答:代码段长度与内存使用率没关系,建议申请大内存时,要小心,根据需要来,如果数据用不了那么大的空间,反而会降低内存使用率; 嵌入式对内存的使用是宝贵的,所以在定义数据结构时就应该注意
heronism 2017-03-08
  • 打赏
  • 举报
回复
按自己的理解答复下,请参考: 1. 程序能够编译通过并正常运行的情况下,(尤其是大的数组赋值时)为什么会篡改其他的全局变量? ——数组应该是全局的,可能是数组越界,检查下下标 2. 程序能够通过编译,运行时为什么会触发写到ROM的保护? ——运行和编译没关系,触发到写rom保护可能是使用了非法指针(指向保护内存) 3. 被注释掉的代码会占用系统运行时内存吗?(考虑后续开发的兼容性,代码段比较大,有许多扩展模式) ——注释掉无影响 4. 节省代码段的长度可以提高内存使用率吗? ——不可以,或者说意义非常有限,程序使用的内存与其大小无关(不考虑程序本身占用的内存)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧