社区
C语言
帖子详情
嵌入式系统内存分配的若干问题
yinchao163
2017-03-08 03:48:23
背景:本人需要在一块DSP上运行复杂的算法,算法需要分配大量数组,由于不能使用外部SDRAM用来缓存数据,导致程序运行时内存不够而崩溃。
疑问:
1. 程序能够编译通过并正常运行的情况下,(尤其是大的数组赋值时)为什么会篡改其他的全局变量?
2. 程序能够通过编译,运行时为什么会触发写到ROM的保护?
3. 被注释掉的代码会占用系统运行时内存吗?(考虑后续开发的兼容性,代码段比较大,有许多扩展模式)
4. 节省代码段的长度可以提高内存使用率吗?
...全文
253
5
打赏
收藏
嵌入式系统内存分配的若干问题
背景:本人需要在一块DSP上运行复杂的算法,算法需要分配大量数组,由于不能使用外部SDRAM用来缓存数据,导致程序运行时内存不够而崩溃。 疑问: 1. 程序能够编译通过并正常运行的情况下,(尤其是大的数组赋值时)为什么会篡改其他的全局变量? 2. 程序能够通过编译,运行时为什么会触发写到ROM的保护? 3. 被注释掉的代码会占用系统运行时内存吗?(考虑后续开发的兼容性,代码段比较大,有许多扩展模式) 4. 节省代码段的长度可以提高内存使用率吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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. 节省代码段的长度可以提高内存使用率吗? ——不可以,或者说意义非常有限,程序使用的内存与其大小无关(不考虑程序本身占用的内存)
嵌入式Linux内存管理
嵌入式内存管理 被欺骗的C进程 每一个C语言的程序被执行起来的时候系统为了更方便开发人员操作,会给每一个进程分配一个虚拟的内存空间,它实际上是从处理内存映射出来的。虚拟内存的起始地址结束地址都是固定的,因此虚拟内存的布局都是一样。比如有三个进程 P1 P2 P3 ,他们虽然得到的物理内存是完全不一样,但是从进程的角度来看他们三个得到的内存确实一模一样的。 假设你正在使用的计算机实际物理内存只有 1GB 大小,而当前系统运行了三个进程,Linux 会将 PM 中的某些内存映射为三个大小均为 4GB 的虚拟内
嵌入式linux
内存分配
,嵌入式linux内核中常见
内存分配
1.原理说明Linux内核中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示四级页表分别为:* 页全局目录(Page Global Directory)* 页上级目录(Page Upper Directory)* 页中间目录(Page Middle Directory)* 页表(Page Tab...
嵌入式linux
内存分配
,嵌入式开发教程之Linux内核中常见
内存分配
函数.pptx
嵌入式开发教程之Linux内核中常见
内存分配
函数,1.原理说明 多级分页目录结构 1.1.伙伴系统算法 1.2.slab分 配器 2.常用
内存分配
函数 2.1.__get_free_pages 2.2.kmem_cache_alloc 2.3.kmalloc 2.4.vmalloc Linux内核部分内存分布 2.5.dma_alloc_coherent 2.6.ioremap 2.7.Boot ...
嵌入式操作系统---内存管理
嵌入式系统
中的内存管理,主要用于实现内存的动态申请/释放;在嵌入式操作系统中,使用malloc/free这两个函数会产生内存碎片;并且这两个函数的执行时间存在不确定性;争取对以下嵌入式操作系统的内存管理机制有一定的认识:1、uc/os上使用的内存管理机制2、典型值的内存管理机制3、基于伙伴算法的内存管理机制一、uc/os上使用的内存管理机制(一)基本原理首先将一块大的内存堆分为
若干
个分区,每个分区...
嵌入式系统
开发设计---
嵌入式系统
开发设计
嵌入式系统
设计的主要任务是定义系统的功能、决定系统的架构,并将功能映射到系统实现架构上。这里,系统架构既包括软件系统架构也包括硬件系统架构。一种架构可以映射到各种不同的物理实现,每种实现表示不同的取舍,同时还要满足某些设计指标,并使其他的设计指标也同时达到最佳化。
嵌入式系统
的设计方法跟一般的硬件设计、软件开发的方法不同,是采用硬件和软件协同设计的方法,开发过程不仅涉及软件领域...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章