C 微控制器存储器分配

C 微控制器存储器分配,c,memory-management,microcontroller,C,Memory Management,Microcontroller,一天来,我一直在思考以下问题: 在一台普通电脑中,当你分配一些内存时,你会要求操作系统记录哪些内存段被占用,哪些内存段没有被占用,并且不会让你和其他程序内存混在一起。 但是微控制器呢,我的意思是微控制器没有运行的操作系统,所以当你需要一堆内存时,会发生什么?你不能简单地访问内存芯片和访问一个随机的地方,因为它可能被占用。。。谁会记录哪些部分的内存已经被占用,并给你一个自由的地方来存储一些东西 编辑: 我已经用C语言编写了微控制器程序。。。我想答案可能是“语言独立”。但让我更清楚一点:我有一个在微

一天来,我一直在思考以下问题:

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

编辑:

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

int i=0;
int d=3;

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

我认为注释已经涵盖了这一点

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

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

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

int i=0; int d=3

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

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


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

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

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

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

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

int i=0; int d=3

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

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


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

这是用汇编语言写的吗?是的,你需要计数器和堆栈,这样你就知道在哪里以及如何获得它。如果你能“要求一堆内存”,那么必须有足够的运行时环境来支持它。该运行时是否足够复杂,足以保证“操作系统”的名称,其实并不相关。你能澄清你的问题吗?这是用汇编语言写的?是的,你需要计数器和堆栈,这样你就知道在哪里以及如何获得它。如果你能“要求一堆内存”,那么必须有足够的运行时环境来支持它。该运行时是否足够复杂,足以保证“操作系统”的名称,其实并不相关。你能澄清你的问题吗?让我看看我是否理解:如果我使用编译时分配,链接器将为每个变量分配一部分内存,就是这样。如果在另一端,我使用运行时内存分配(用于