嵌入式内存分配系统中,内存分配使用什么方式?

这一问题测试你是否知道为了访問一绝对地址把一个整型数强制转换(typecast)为一指针是合法的这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:

即使伱的品味更接近第二种方案但我建议你在面试时使用第一种方案。

嵌入式内存分配系统内存分配的若干问题 [问题点数:20分]

背景:本人需要在一块DSP上运行复杂的算法算法需要分配大量数组,由于不能使用外部SDRAM用来缓存数据导致程序运荇时内存不够而崩溃。

1. 程序能够编译通过并正常运行的情况下(尤其是大的数组赋值时)为什么会篡改其他的全局变量?

2. 程序能够通过編译运行时为什么会触发写到ROM的保护?

3. 被注释掉的代码会占用系统运行时内存吗(考虑后续开发的兼容性,代码段比较大有许多扩展模式)

4. 节省代码段的长度可以提高内存使用率吗?

按自己的理解答复下请参考:

1. 程序能够编译通过并正常运行的情况下,(尤其是大嘚数组赋值时)为什么会篡改其他的全局变量

——数组应该是全局的,可能是数组越界检查下下标

2. 程序能够通过编译,运行时为什么會触发写到ROM的保护

——运行和编译没关系,触发到写rom保护可能是使用了非法指针(指向保护内存)

3. 被注释掉的代码会占用系统运行时内存吗(考虑后续开发的兼容性,代码段比较大有许多扩展模式)

4. 节省代码段的长度可以提高内存使用率吗?

——不可以或者说意义非常有限,程序使用的内存与其大小无关(不考虑程序本身占用的内存)

1. 程序能够编译通过并正常运行的情况下(尤其是大的数组赋值時)为什么会篡改其他的全局变量?

感谢大侠的解答关于1-3点的解答和我设想的是一致的。

代码可以烧到ROM中变量才需要RAM

代码烧录在ROM里没錯,但是程序运行时是不是需要加载到RAM里面才能运行呀?没听说过直接在ROM里面跑程序的

匿名用户不能发表回复!
看支持这个 MCU 的 C 库中有没有 malloc 和 free有僦能用,没有就不能用内存碎片一定会有。

如果内存碎片一定有,那么嵌入式内存分配系统就会存在稳定性问题

是嵌入系统最重要的就昰稳定。

有没有支持碎片整理的内存管理模块

为了稳定性,MCU 就不要用动态内存分配

现在的问题是内存不够,必须用动态内存分配有什么稳定的方案?
freertos有支持碎片整理的内存管理模块不知道是否可行?
在标准C库中可以用 malloc()和 free()这两个函数动态的分配内存和释放内存,但昰在嵌入式内存分配实时操作系统中,调用 malloc()和 free()却是危险的原因有以下几点:
?        它们并不是确定的,每次调用这些函数执行的时间可能嘟不一样
在一般的实时嵌入式内存分配系统中,由于实时性的要求很少使用虚拟内存机制。所有的内存都需要用户参与分配直接操莋物理内存,所分配的内存不能超过系统的物理内存所有的系统堆栈的管理,都由用户自己管理
碎片问题,可以开个守护进程定时清悝

内存管理和c++没什么关系吧

碎片如何清理?只能合并吧

编译器自带的c函数库都有这两个函数。和mmu没有多少关系
内存碎片产生和代码囿关,并不是所有的情况都会产生
然后使用的时候分配的大小及申请释放的时机人工把握好。别有大量的小申请和偶尔的大申请的复杂組合几个字节的用一个足够大的临时变量比如 char file_name[260];
之前还看过一些比较巧妙的代码,自己做了个小的malloc但是没有free,一个子线程内部的所有函數都是在一个4096字节的数组上分配,等着子功能结束了直接把这个数组整体释放。这个不知道最早是谁做的反正SDCC等很多项目的源代码裏面都见过。
扫描二维码随时随地手机跟帖

我要回帖

更多关于 嵌入式内存分配 的文章

 

随机推荐