ADS启动代码详解:从startup.s看处理器初始化

需积分: 9 5 下载量 122 浏览量 更新于2024-09-17 收藏 220KB PDF 举报
"这篇教程详细讲解了如何学习和理解ADS启动代码,特别是针对初学者,强调了理解堆栈、地址和指针等基本概念的重要性。文章以S64处理器为例,探讨了启动代码的两个主要部分:与ARM7TDMI内核相关的初始化以及与处理器外部设备相关的初始化。启动代码的主要任务是初始化处理器模式、设置堆栈、初始化变量,并最终跳转到主程序。此外,文中还介绍了S64处理器的内存布局和异常向量配置。" 在学习启动代码时,首先需要了解处理器的启动过程。启动代码是处理器在启动时执行的第一段程序,通常用汇编语言编写,因为它涉及到处理器的低级初始化操作。在S64处理器中,启动代码有两个关键部分: 1. **与ARM7TDMI内核相关的初始化**:这部分主要包括配置处理器的各种异常向量,如复位、未定义、软件中断、预取异常、数据异常等。异常向量通常放置在内存的起始地址,以便处理器在发生异常时能够快速响应。例如,复位向量位于0地址,它会跳转到系统初始化代码(BSYSINIT)。 2. **与处理器外部设备相关的初始化**:这部分涉及特定于硬件的初始化,如看门狗定时器(WDT)、子系统时钟、可能的内存重映射(remap)等。这些初始化步骤确保了外部设备的正常工作,并且与具体的微控制器设计有关。 S64处理器的内存布局如下: - **片上FLASH**:从0x100000开始,共有64kB,用于存储固件代码。 - **片上RAM**:从0x200000开始,共有16kB,用于运行时的数据和栈操作。 在复位后,程序会从0地址开始执行,这时FLASH被映射到这个地址。通过使用remap,可以将RAM映射到0地址,这样0地址的内容就变成了RAM的副本。这允许处理器在RAM中执行代码,从而实现更快的访问速度。 启动代码中的异常向量配置至关重要,因为它们定义了处理器如何响应各种异常情况。在S64的例子中,每个异常都有一个对应的处理程序,如UNDEFINED、SWI、PREFETCHABORT和DATAABORT。`B`指令用于跳转到相应的处理程序,其地址在编译时自动计算,确保代码位置无关性,无论指令在何处执行,都能正确跳转。 通过理解这些基本概念,初学者可以逐步深入到更复杂的启动代码分析中,包括数据和BSS段的初始化,以及如何正确地设置堆栈,以便在程序执行过程中管理函数调用和保存现场。掌握这些知识对于任何想要深入理解嵌入式系统开发的人来说都是至关重要的。