Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C RAM&;ROM存储器段_C_Memory_Embedded_Ram_Rom - Fatal编程技术网

C RAM&;ROM存储器段

C RAM&;ROM存储器段,c,memory,embedded,ram,rom,C,Memory,Embedded,Ram,Rom,有不同的内存段,如.bss、.text、.data、.rodata等 我不知道它们中的哪一个位于RAM中,哪一个位于闪存中,很多资料都在(RAM和ROM)内存的两部分中提到了它们 请公平解释RAM和闪存的内存段 ATMEL studio编译器 ATMEGA 32平台它们位于项目链接器脚本定义的位置 一些目标在ROM中定位和执行代码,而另一些目标可能在启动时将代码从ROM复制到RAM,并从RAM执行-通常是出于更快处理器的性能原因。因此.text和.rodata可能位于R/W或R/O内存中。但是,

有不同的内存段,如.bss、.text、.data、.rodata等

我不知道它们中的哪一个位于RAM中,哪一个位于闪存中,很多资料都在(RAM和ROM)内存的两部分中提到了它们

请公平解释RAM和闪存的内存段

ATMEL studio编译器

ATMEGA 32平台

它们位于项目链接器脚本定义的位置


一些目标在ROM中定位和执行代码,而另一些目标可能在启动时将代码从ROM复制到RAM,并从RAM执行-通常是出于更快处理器的性能原因。因此.text和.rodata可能位于R/W或R/O内存中。但是,根据定义,.bss和.data不能位于R/O内存中。

希望您了解这些节名的典型用法。文本为代码、.rodata只读数据、.data为非零读/写数据(例如,在编译时已初始化的全局变量),.bss读/写数据假定为零,未初始化。(未初始化的全局变量)

因此.text和.rodata是只读的,因此它们可以在闪存或ram中使用。数据和.bss是读/写的,因此它们需要在ram中使用,但为了将该信息放入ram中,必须在断电时将其置于非易失性位置,然后复制到ram中。因此,在微控制器中,.数据信息将保存在闪存中,引导代码需要将该数据复制到ram中的主内存中,代码希望在那里找到它。对于.bss,您不需要所有这些零,您只需要起始地址和字节数,引导程序可以将内存归零


所以他们都可以/确实住在这两个地方。但典型的使用情况是只读的用于闪存,读/写的用于ram。

ROM不能写入,但ram可以写入。 ROM保存(BIOS)基本输入/输出系统,但RAM保存运行的程序和使用的数据。 ROM比RAM小得多。
ROM是非易失性的(永久性的),但RAM是易失性的。

ATMEL studio编译器ATMEGA 32平台如果我使用diff编译器或平台,会有什么不同吗?@MohamedMoustafa是的,会有很大的不同。某些平台根本不将任何ROM映射到进程内存空间。
Atmel Studio编译器
-它不存在。Atmel studio IDE和gcc编译器是。我认为目前这个话题对你来说太复杂了。数百篇文章都解释了这个问题——如果你不理解它们——这意味着现在还为时过早。如果您需要对C语言、链接器脚本、启动代码和目标硬件有深入的了解,则可以使用。现在请记住-未初始化的静态变量是零,而自动变量不是。这里有各种各样的问题,特别是哈佛架构垃圾。thx你的回答帮助我开始理解这个问题,是否有任何参考或文档可供阅读,以便更深入地理解此主题?@MohamedMoustafa:链接器/编译器的文档以及目标平台的参考手册/数据表。