嵌入式开发之程序烧写
Q1: 嵌入式开发中程序下载后存储在什么地方?
嵌入式开发范围较广,根据系统处理器的处理能力以及资源分配情况,又有许多不同处理器。常说的有MCU、MPU等,两者有着不同的处理计算能力。以下内容主要来谈谈关于MCU的相关内容。
一般MCU 包含的存储空间有:片内Flash 与片内RAM,相比个人电脑(PC)来说,RAM 相当于内存,Flash 相当于硬盘。编译器会将一个程序分类为好几个部分,分别存储在MCU 不同的存储区,这些都是编译器的功劳。编译器相当于 一个中间翻译者,将计算机编程语言翻译成机器内码,从而控制计算体系。
说明:
Program Size包含有:
·Code:代码段,存放程序的代码部分
·RO-data:只读数据段,存放程序中定义的常量
·RW-data:读写数据段,存放初始化为非0值的全局变量
·ZI-data: 0数据段,存放未初始化的全局变量及初始化为0的变量
注:在keil中编译完后,工程会生成一个.map的文件,该文件说明了各个函数占用的尺寸和地址,在文件的最后几行说明了存储关系,查看此文件可以得到许多关于程序代码的重要信息。如下所示(该文件的最后几行信息):
1)RO Size 包含了Code 及RO-data,表示程序占用Flash 空间的大小;
2)RW Size 包含了RW-data 及ZI-data,表示运行时占用的RAM 的大小;
3)ROM Size 包含了Code、RO Data 以及RW Data,表示程序烧写所占用的Flash 空间的大小;
Q2: 程序在MCU中的运行过程?
程序烧写到了MCU后,程序是怎样运行呢?这里以STM32为例来探讨一下。
(1)程序运行之前,需要有文件实体被烧录到STM32 的Flash 中,一般是bin 或者hex 文件,该被烧录文件又被称为可执行映像文件。如下图所示,可执行映像文件烧录到STM32 后的内存分布,它包含RO 段和RW 段两个部分:其中RO 段中保存了Code、RO-data 的数据,RW 段保存了RW-data 的数据,由于ZI-data 都是0,所以未包含在映像文件中。如下图所示:
(2)STM32 在上电启动之后默认从Flash 启动,启动之后会将RW 段中的RW-data(初始化的全局变量)搬运到RAM 中,但不会搬运RO 段,即CPU 的执行代码从Flash 中读取,另外根据编译器给出的ZI 地址和大小分配出ZI 段,并将这块RAM 区域清零。
说明:其中动态内存堆为未使用的RAM 空间,应用程序在申请和释放的内存块都来自该空间。
一些全局变量则是存放于RW 段和ZI 段中,RW 段存放的是具有初始值的全局变量(而常量形式的全局变量则放置在RO 段中,是只读属性的),ZI 段存放的系统未初始化的全局变量。
Q3: 嵌入式开发中是如何实现程序下载(烧写)的?
(1)首先谈谈两个概念:烧写和固件。嵌入式系统需要预先将程序写入ROM/FLASH中,在启动时载入才能够运行这些程序,将已经生成的程序写入ROM/FLASH的过程叫做烧写。这样固化在存储介质上的文件叫固件(firmware)。烧写即是更新固件的过程。
(2)三种程序编烧写方式——ISP/ICP/IAP
ISP:In System Programing,在系统编程
只需上电,处理器无需工作,更新整个存储内容的方式,不需要处理器中间操作,不需要存在引导程序,属于硬件单独处理行为.
ICP:In Circuit Programing,在电路编程
可以编程写入最终用户代码,不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或者进行再次编程,需要一些必要的硬件逻辑或引导代码,例如使用JTAG下载。
IAP:In Applicating Programing,在应用编程
IAP从结构上将Flash存储器映射为多个存储体区域(引导区、运行区、下载存储区等等),第一个项目程序存放在应用引导区,不执行正常的功能操作,而只是通过某种通信管道接收程序或数据,执行对其他部分代码的更新;其他代码才是真正的功能代码,存放在程序存储区。当芯片上电后,首先运行应用引导区程序,检查是否需要对第二部分代码进行更新,存在更新则进行更新后执行,否则直接执行。所以引导区程序应该不可以IAP方式更新。总而言之,就是将存储体分区来进行嵌入系统运行调度和管理。
Q4: 常使用的程序烧写方式有哪些?
1、把系统当做一个存储区域进行烧写,相当于把单片机当成一个ROM芯片。
2、采用专门接口及专用的下载线将程序烧写到固件中。这时CPU除了执行单片机本身的指令之外,还能执行对存储器进行操作的特殊指令,擦除、烧写和校验指令。先通过传输相应的指令给CPU执行(擦除、读入、烧写、校验等),这样完成烧写。现在普遍使用的JTAG仿真器也是这样,CPU能执行JTAG的特殊指令,完成对固件的烧写操作。
3、 引导程序,即单片机中已经存在了一个烧写程序。启动单片机时首先运行该段程序,程序判断端口状态,识别烧写的特殊状态,就从某个端口读取数据,然后写入到存储单元中。如果是正常的状态,就转到用户的程序开始执行。需要触发硬件选择用户程序模式还是烧写模式。
注:部分内容参考于《rt-thread官方开发手册》