首页 > 编程知识 正文

为什么keil5无法编译(mdk编译后的HTML,Keil编译过程及程序在Flash和SRAM的空间分配)

时间:2023-05-05 07:52:37 阅读:123304 作者:3814

1. keil编译介绍

使用keil开发单片机时,运行程序时,output输出框中将显示下图的结果。

图1 keil输出框

其中,Compiler编译器使用的是V5.06版本。 程序首先编译、链接和链接,生成可执行代码。 要下载到单片机Flash,必须将其转换为二进制(csdss )或十六进制(hex )文件。 具体流程如下:

图2 keil编译过程

值得注意的是,编译后不会给变量分配地址。 o文件。 只有在通过链接器链接后才会为变量分配地址,链接角色被认为很容易管理。 链接的代码分为代码、RO-data、RW-data、阳光冷面-data部分。 从这里开始,这是很久以前就成为话题的问题,每个区都在做什么呢?

代码区域是指程序中的代码,即函数体的大小。 请注意,代码中也包含程序中未使用的函数。 也就是说,由于会占用FLASH空间,因此请删除未使用的函数,以避免占用过多的FLASH空间。

RO-DATA:RO是只读的意思,程序内的只读变量(即带Const的)和初始化的字符串等

RW-DATA :特别是初始化的可写全局/静态变量;

阳光凉面-DATA :未初始化的可写全局/静态变量。 请注意,初始化为0也会被视为未初始化,其中还计算使用的堆空间和堆栈空间。

我以前考虑的问题之一是我的局部变量存储在哪里。 其实是的。 局部变量只在程序运行时生成。 程序未运行时,在即将关闭单片机电源之前,没有局部变量。 这与程序的两种状态记忆状态和运行状态有关。

图3程序的存储状态和执行状态

存储状态:将程序下载到Flash时,实际上只下载了代码ro-data rw-data的内容。 也就是说,如果断电,闪存中的内存只包含三张代码ro-data rw-data。

运行状态:接通电源后,程序运行时,首先从特定地址启动程序,启动时RW-data的数据加载到SRAM中。 (启动文件中有正在做这件事的代码。 keil帮我做了这件事。 )单片机的RO区域不需要加载到SRAM中,内核直接从FLASH读取指令并执行。 阳光冷面-data的数据怎么办? 对于初始值为0的全局变量,必须将其编写,因为它将在代码区域中调用该全局变量。 正如运行程序时看到的那样,你是初始值为0的全局变量。 然后在SRAM区域分配了固定区域的地址。 对于局部变量,大小是自动分配的,不需要我们管理。 我忍不住想问一下,阳光凉面-data没什么用。 那其实有统计作用。 SRAM的特定区域是运行日光的凉面-data数据,RW-DATA日光的凉面-data程序的执行全部占用SRAM的长度,生成局部变量的堆栈空间包含在日光的凉面-data区域的范围内。

图4程序的结构

计算机系统的APP应用程序的执行过程类似,但计算机系统的程序以存储状态在硬盘上,运行时将上述RO区域(代码、只读数据)加载到存储器中以加快执行速度,或比物理存储器由于单芯片没有MMU,无法支持Linux或Windows系统。 在这里

2 .了解2. Flash和Sram

内存是计算机结构的重要组成部分,内存是存储程序代码和数据的部件,有内存计算机就具有存储功能。 根据存储介质的特性,可以分为“易失性存储器”和“非易失性存储器”两种。 易失性和非易失性是指内存断电后,其中存储的内容是否会丢失。 换句话说,易失性存储器的速度比非易失性存储器快。

2.1易失性存储器

根据RAM的物理存储机制,可以分为dRAM (动态)和ram (静态)两种。 首先,对现在使用的DRAM进行说明,由于其通信定时是利用时钟进行同步通信,所以被命名为Synchronous DRAM。 那么,为了后期进一步提高SDRAM的通信速度,设计了DDR SDRAM存储器(Double Data Rate SDRAM ),然后开发了2、3、4代的SDRAM,另外,静态随机存储器SRAM的存储单元是锁存器

2.2非易失性存储器

半导体类的非易失性存储器有ROM和FLASH,但现在感觉ROM的使用少了。 很多似乎都被FLASH取代了。 之前学单片机时,用的外置EEPROM是一种ROM,很少介绍。 FLASH的容量一般远大于EEPROM,擦除时通常以多个字节为单位。 部分闪存以4096字节为扇区,最小擦除单位为1扇区。 根据存储单元电

路的不同,FLASH存储器又分为NOR FLASH和NAND FLASH。

NOR与NAND的共性是在数据写入前都需要有擦除操作,而擦除操作一般是以“扇区/块”为单位,而NOR与NAND特性的差别,主要是其内部“地址/数据线”是否分开导致的。

由于NOR的地址线和数据线分开,它可以按“字节”读写数据,符合CPU的指令译码执行要求,所以假如NOR上存储了代码指令,CPU给NOR一个地址,NOR就能向CPU返回一个数据让CPU执行,中间不需要额外的处理操作。所以,在功能上可以认为NOR是一种断电后数据不丢失的RAM,但它的擦除单位与RAM有区别,且读写速度比RAM要慢得多。

由于NAND的数据和地址线共用,只能按“块”来读写数据,假如NAND上存储了代码指令,CPU给NAND地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。若代码存储在NAND上,可以把它先加载到RAM存储器上,再由CPU执行。

目前,单片机SOC内部普遍使用的是SRAM和NorFlash。

Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内,可访问的存储器空间被分成8个主要块,每个块为512MB。存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,如果给存储器再分配一个地址就叫存储器重映射。NRF52832的内存映射如下图所示,

在nordic芯片中FLASH存储编译后下载的程序,SRAM是存储在程序运行中的临时创建数据(ARMv7,哈弗结构),故只要你不外扩存储器,写完的程序中只要在芯片上运行起来,所有数据也就会出现在这两个存储器中。Flsah或者Ram内部又会根据不同的功能把他们分为多个模块。

在网上看到一张图,感觉很有意思。这张图是STM32程序下载到Flash上的存储结构。如果你知道了这些具体地址,及地址块的作用,就可以做BootLoader以便产品后期升级。

原文:https://www.cnblogs.com/39950436-myqq/p/11387179.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。