周立功NXP LPC21xx22xx ARM芯片启动程序解析

需积分: 9 10 下载量 161 浏览量 更新于2024-08-02 收藏 393KB PDF 举报
"周立功NXP LPC21xx/22xx系列ARM芯片的启动程序分解由钟常慰提供,详细分析了ARM芯片的启动代码,包括分散加载技术的应用,特别是针对ADS的scf文件的解释。" 本文将深入探讨周立功关于NXP LPC21xx/22xx系列ARM芯片的启动程序分解,主要关注点在于启动代码的运行机制和分散加载技术。分散加载是嵌入式系统中一种重要的编程技术,它允许将代码和数据分布在不同的内存区域,以优化系统性能。 首先,分散加载文件(如mem_a.scf、mem_b.scf、mem_c.scf)在ADS环境中用于指定代码和数据在内存中的布局。这些文件定义了装载域和运行域,确保程序在启动时正确加载到目标地址。在LPC2200的启动模板中,这些scf文件用于指导ArmLinker进行代码段和数据段的定位。 分散装载技术的核心在于如何有效地将程序段分配到不同类型的存储器,如Flash、16位RAM和32位RAM。例如,中断服务程序通常放在32位RAM中以提高响应速度,而启动代码(Bootloader)之外的其他代码则可能被复制到RAM中以提升运行效率。 该技术包含两个关键步骤:如何分散和如何装载。如何分散涉及将输入段划分并组织成输出段和域,而如何装载则涉及到确定这些段在内存中的实际地址。域分为装载域和运行域,装载域描述了程序在加载到ROM/RAM的状态,而运行域则表示程序运行时的内存布局。对于某些类型的数据(如可读写数据段),在装载和运行时可能需要在不同的地址空间中。 Scatterfile是实现分散加载的关键,它可以为每个代码或数据区指定装载和执行时的独立地址。Scatterfile中的装载区和执行区定义了程序加载时的存储位置以及运行时的内存使用。每个段都有装载地址和运行地址,两者根据需求可以相同或不同。 在scatter文件中,程序员可以使用特定的语法来定义各个段的属性和位置,例如: ``` LR_IROM1 0x10000000 0x00008000 { ; 装载地址: 0x10000000, 大小: 0x00008000 *.o (RESET, +First) ; 设置RESET入口点 *(InRoot$$Sections) .ANY (+RO) ; 所有只读段 } RAM_CODE 0x40000000 0x00002000 { ; 运行地址: 0x40000000, 大小: 0x00002000 .ANY (+RW +ZI) ; 所有可读写和零初始化段 } ``` 这段示例展示了如何在scatter文件中配置装载和运行地址,确保代码在正确的位置运行。 总结来说,周立功的分析揭示了NXP LPC21xx/22xx系列ARM芯片启动过程中的关键要素,尤其是分散加载技术的运用,这对于理解和优化嵌入式系统的性能至关重要。通过理解这些概念,开发者能够更好地设计和调试在这些微控制器上的程序,从而充分利用硬件资源。