news 2026/4/15 19:01:37

Cortex-M系列,Cortex-A系列,汇编启动文件的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cortex-M系列,Cortex-A系列,汇编启动文件的区别

Cortex-M系列:可以不自己写汇编启动代码,因为芯片厂商提供了完整的启动文件,但理解汇编对调试和优化很重要。

Cortex-A系列:通常需要懂汇编启动原理,但实际开发中常使用现成的bootloader(如U-Boot),学习时必须自己写才能理解启动过程。

特性

ARM Cortex-M系列(如STM32)ARM 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.s

  • IDE自动包含这个文件

  • 你可以不用修改直接使用

  • 但本质上还是有汇编文件


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 main
Cortex-A系列 需要汇编启动文件的原因:
  1. 异常向量表必须由汇编设置(固定地址)

  2. 处理器模式切换(SVC、IRQ等)

  3. MMU/Cache初始化(Linux需要)

  4. 多核启动(A系列常有多核)

Cortex-M启动(厂商提供 汇编启动文件):

// main.c可以直接写: #include "stm32f1xx.h" int main(void) { HAL_Init(); // 厂商库初始化 SystemClock_Config(); // 时钟配置 // 用户的代码... while(1); } // ↑ 看起来没有汇编,其实在链接时包含了startup_stm32f1xx.s

Cortex-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-M:

1. 使用CubeMX生成代码 → 包含startup.s 2. 或者使用Arduino/PlatformIO → 隐藏了底层 3. 大多数情况下不用碰汇编 # 但高级应用(RTOS、性能优化)仍需懂汇编

对于Cortex-A:

1. 使用Bootloader(U-Boot)→ 已有完整的start.S 2. 运行Linux → 内核有自己的head.S 3. 裸机开发 → 必须自己写或借鉴启动代码
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 8:03:44

2.运放选型调试方法论

一般学习过模电的同学,懂负反馈、虚短虚断、会计算,但是还是不会具体应用。接下来先根据需求锁定关键参数,再通过规范调试排除问题。一、 运放选型:从需求出发,按优先级筛选参数选型的核心是 **“按需取舍”—— 没有万…

作者头像 李华
网站建设 2026/4/16 10:43:53

基于STM32单片机汽车防盗报警GSM短信GPS北斗定位地图APP设计37(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码**

基于STM32单片机汽车防盗报警GSM短信GPS北斗定位地图APP设计37(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 STM32单片机电动车防盗报警GSM短信上报GPS定位37 产品功能描述: 本系统由STM32F103C8T6单片机核心板、…

作者头像 李华
网站建设 2026/4/16 11:18:44

SpringBoot学习:整合Quartz实现定时任务

在应用开发中,经常会遇到需要定时执行操作的场景,例如日志清理、邮件发送、订单处理等。SpringBoot支持多种定时任务实现方式,包括Timer、ScheduledExecutorService、SpringTask、Quartz以及xxljob等。本文将重点介绍如何使用Quartz框架实现可…

作者头像 李华
网站建设 2026/4/16 7:46:28

Kubernetes平滑部署全景实战指南

在Kubernetes中实现平滑部署(亦称无损发布或零宕机部署)的核心原理在于:必须确保新Pod已启动并通过就绪检查、能够接收流量后,再终止旧Pod。若这一顺序被打破,则可能引发服务闪断、请求丢失或短暂不可用。 一、实现平…

作者头像 李华
网站建设 2026/4/16 11:05:36

什么网盘能够解决超大文件传输难题?

一、超大文件传输为何成为难题?现代社会的数字化程度从未像今天这样深刻影响我们的生活和工作。先做一个简单的思维试验:每次需要传输视频文件、设计素材、数据库备份或者超大文档时,你是不是曾经历过以下这些问题?电子邮件容量有…

作者头像 李华
网站建设 2026/4/10 6:50:51

口碑好的高转速搅拌釜供应商

行业口碑王——高转速搅拌釜供应商怎么选?在化工、锂电、医药、食品等众多行业的生产过程中,高转速搅拌釜这类设备起着关键作用。一个口碑好的高转速搅拌釜供应商,不仅能提供优质的设备,更能为企业的生产运营提供坚实保障。那该如…

作者头像 李华