2026/3/21 20:52:28
网站建设
项目流程
diywap手机网站系统,设计图室内效果图,网站规划的基本内容不包括,福清建设局网站简介Cortex-M系列#xff1a;可以不自己写汇编启动代码#xff0c;因为芯片厂商提供了完整的启动文件#xff0c;但理解汇编对调试和优化很重要。
Cortex-A系列#xff1a;通常需要懂汇编启动原理#xff0c;但实际开发中常使用现成的bootloader#xff08;如U-Boot#xf…Cortex-M系列可以不自己写汇编启动代码因为芯片厂商提供了完整的启动文件但理解汇编对调试和优化很重要。Cortex-A系列通常需要懂汇编启动原理但实际开发中常使用现成的bootloader如U-Boot学习时必须自己写才能理解启动过程。特性ARM Cortex-M系列如STM32ARM Cortex-A系列如i.MX6ULL典型应用单片机、实时控制应用处理器、Linux系统启动复杂度相对简单非常复杂是否需要汇编通常需要一点通常需要为什么需要汇编启动文件设置堆栈、向量表设置异常向量、MMU、Cache等1. Cortex-M系列如STM32通常的启动流程/* startup_stm32fxxx.s (STM32标准启动文件) */ .section .isr_vector /* 中断向量表 */ .word _estack /* 栈顶地址 */ .word Reset_Handler /* 复位处理函数 */ .word NMI_Handler /* NMI处理函数 */ .word HardFault_Handler /* ... 其他中断向量 */ .section .text Reset_Handler: /* 1. 设置堆栈指针 */ ldr sp, _estack /* 2. 初始化.data段 */ bl SystemInit /* 跳到C语言的SystemInit() */ /* 3. 跳转到main */ bl main如STM32为什么觉得不用写芯片厂商提供现成的启动文件如startup_stm32f103xe.sIDE自动包含这个文件你可以不用修改直接使用但本质上还是有汇编文件2. Cortex-A系列如i.MX 6ULL需要更多汇编因为 更复杂的启动任务/* start.S (U-Boot或裸机程序) */ .globl _start _start: /* 1. 设置异常向量表 */ b reset /* 复位异常 */ b undefined_instruction b software_interrupt b prefetch_abort b data_abort b not_used b irq b fiq reset: /* 2. 设置处理器模式 */ mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0x13 /* 进入SVC模式 */ msr cpsr, r0 /* 3. 设置堆栈 */ ldr sp, 0x87800000 /* 4. 清除BSS段 */ bl clear_bss /* 5. 跳转到C代码 */ bl mainCortex-A系列 需要汇编启动文件的原因异常向量表必须由汇编设置固定地址处理器模式切换SVC、IRQ等MMU/Cache初始化Linux需要多核启动A系列常有多核Cortex-M启动厂商提供 汇编启动文件// main.c可以直接写 #include stm32f1xx.h int main(void) { HAL_Init(); // 厂商库初始化 SystemClock_Config(); // 时钟配置 // 用户的代码... while(1); } // ↑ 看起来没有汇编其实在链接时包含了startup_stm32f1xx.sCortex-A启动自己编写 汇编启动文件// 必须先写start.S然后才能写 int main(void) { // 这里才能正常用C语言 uart_init(); printf(Hello i.MX6ULL\n); return 0; }Cortex-M 与 Cortex-A 技术根源差异Cortex-M的设计理念简化让单片机开发更简单硬件自动完成更多如向量表重定位统一的存储映射代码、数据都在同一地址空间Cortex-A的设计理念灵活适应复杂应用需要软件控制更多如MMU虚拟内存复杂的存储层次L1/L2 Cache、DDR、Flash现代开发的实际状况对于Cortex-M1. 使用CubeMX生成代码 → 包含startup.s 2. 或者使用Arduino/PlatformIO → 隐藏了底层 3. 大多数情况下不用碰汇编 # 但高级应用RTOS、性能优化仍需懂汇编对于Cortex-A1. 使用BootloaderU-Boot→ 已有完整的start.S 2. 运行Linux → 内核有自己的head.S 3. 裸机开发 → 必须自己写或借鉴启动代码