0

我一直在思考以下问题:

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

编辑:

我已经用 C 编写了微控制器......我认为答案可能是“与语言无关的”。但让我更清楚一点:假设我有这个程序在微控制器上运行:

int i=0;
int d=3;

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

4

1 回答 1

3

我认为评论已经涵盖了这个......

请求内存意味着您有一些操作系统来管理您要从中分配的内存(使用术语操作系统的松散意义)。首先,作为一般规则,您不应该在微控制器中分配内存(我可能会因为这种说法而感到愤怒)。可以在某些情况下完成,但您可以控制自己的内存,您拥有应用程序的系统,要求内存意味着要求您自己。

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

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

诠释我=0;诠释d=3;

编译器在编译时在 .data 中为每个项目分配两个位置。链接器和/或脚本管理 .data 所在的位置以及它的大小限制,如果 .data 大于可用的,您应该收到链接器警告,如果没有,那么您需要修复链接器命令或脚本以匹配您的系统。

运行时分配是在运行时管理的,它管理内存的位置和方式由该库决定,即使您有足够的内存,一个错误或编写不当的库也可能与 .text、.data、.bss 和/或堆栈重叠并导致很多问题。

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

于 2013-02-19T20:37:16.077 回答