13.4.2 固化程序的XIP运行
固化应用是一种嵌入式系统常用的运行方式,其前提是目标代码位于目标系统ROM(Flash)中。ROM中的区域包括映像文件的代码段(code或text)、只读数据段(RO Data)、读写数据段(RW Data)。
以XIP(在位置执行)方式运行程序时内存布局如图13-7所示。
代码的运行也是在ROM(Flash)中,因此,在编译过程中代码的存储地址和运行地址是相同的,由于上电时需要启动,因此该代码的位置一般是(0x0)。
在这种应用中,一件重要的事情就是将已初始化读写段的数据从Flash中复制到SDRAM中,由于已初始化读写段既需要固化,也需要在运行时修改,因此这一步是必须有的,在程序的初始化阶段需要完成这一步。
|
| (点击查看大图)图13-7 XIP运行程序时的内存布局 |
一般来说,在编译过程中需要定义读写段和未初始化段的地址。在程序中可获取这些地址,然后就可以在程序的中加入复制的代码,实现读写段的转移。表13-5列出了C语言程序的XIP运行过程。
表13-5 C语言程序的XIP运行过程
|
阶 段< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
涉及的部分 |
主要工作 |
|
程序的映像 |
代码段(Code)
只读数据段(RO Data)
读写数据段(RW Data) |
程序放置在Flash中 |
|
初始化阶段 |
读写数据段(RW Data)
未初始化数据段(BSS) |
复制读写数据段到RAM中
开辟未初始化段并且清零 |
|
运行阶段 |
代码段(Code)
只读数据段(RO Data)
读写数据段(RW Data)
未初始化数据段(BSS)
堆(heap)
栈(stack) |
运行Flash代码段中的程序,
动态地在RAM中开辟堆和栈 |
知识点:程序在ROM或者Flash中以XIP形式运行的时候,不需要复制代码段和只读数据段,但是需要在RAM中复制读写数据段,并另辟未初始化数据段。