c-微控制器内存分配



我已经思考了一天以下问题:

在一台普通的电脑上,当你分配一些内存时,你会要求操作系统跟踪哪些内存段被占用,哪些没有,不要让你乱用其他程序的内存等。但是微控制器呢?我的意思是,微控制器没有运行操作系统,所以当你要求一堆内存时,会发生什么?你不能简单地访问内存芯片并访问一个随机的位置,因为它可能被占用。。。谁会跟踪记忆的哪些部分已经被占用,并给你一个空闲的地方来存储一些东西?

编辑:

我已经用C编写了微控制器的程序,我想答案可能是"独立于语言"。但让我更清楚一点:假设我有这个程序在微控制器上运行:

int i=0;
int d=3;

是什么确保我的i和d变量不会存储在内存中的同一位置?

我认为评论已经涵盖了这一点。。。

请求内存意味着您有一些操作系统在管理内存,而这些内存正是您所使用的(使用术语"操作系统"的松散含义)。首先,一般来说,你不应该在微控制器中破坏内存(我可能会因为这句话而大发雷霆)。在某些情况下可以这样做,但你可以控制你的内存,你拥有你的应用程序的系统,要求内存意味着要求你自己。

除非您有理由不能静态分配结构或数组,或者如果存在互斥的代码路径,并且两者都可能需要大部分或全部空闲内存,则不能使用并集,否则您可以尝试动态分配空闲内存,但这是一个更难解决的系统工程问题。

内存的运行时分配和编译时间之间存在差异。你的例子与问题的其余部分无关

int i=0;int d=3;

编译器在编译时在.data中分配两个位置,每个位置对应一个项。链接器和/或脚本管理.data的位置及其大小限制,如果.data大于可用值,则应收到链接器警告,如果不是,则需要修复链接器命令或脚本以匹配系统。

运行时分配是在运行时管理的,它在哪里以及如何管理内存由该库决定,即使你有足够的内存,一个糟糕或编写不当的库也可能会与.text、.data、.bss和/或堆栈重叠,并导致很多问题。

堆栈的过度使用也是一个相当严重的系统工程问题,来自非嵌入式系统的堆栈现在经常被忽视,因为内存太多了。在处理微控制器上的嵌入式代码时,这是一个非常现实的问题。您需要了解最坏情况下的堆栈使用情况,如果要动态分配堆,甚至静态分配堆,则至少要为那么多内存留出空间。

最新更新