登录/注册

如何设计ARM的启动代码?

ARM处理器的三大特点是:耗电少功能强、16位/32位双指令集和合作伙伴众多。

更多

设计ARM处理器的启动代码(Bootloader)需考虑芯片架构、硬件平台和开发环境。以下是关键步骤和示例代码框架:


一、核心设计步骤

  1. 设置异常向量表

    • ARM复位后从0x0地址开始执行
    • 向量表包含7个异常入口(复位、未定义指令等)
      _start:
      B Reset_Handler        ; 复位异常
      B Undefined_Handler    ; 未定义指令异常
      B SVC_Handler          ; SWI软中断
      B Prefetch_Handler     ; 取指中止
      B DataAbort_Handler    ; 数据中止
      NOP                    ; 保留
      B IRQ_Handler          ; 普通中断
      B FIQ_Handler          ; 快速中断
  2. 初始化关键寄存器

    • 关闭中断,设置处理器模式(如SVC模式)
      Reset_Handler:
      CPSID I                 ; 关闭中断
      MRS R0, CPSR            ; 读取状态寄存器
      BIC R0, R0, #0x1F       ; 清除模式位
      ORR R0, R0, #0x13       ; 设置为SVC模式
      MSR CPSR_c, R0          ; 写回CPSR
  3. 设置栈指针

    • 为不同模式分配栈空间
      LDR SP, =_svc_stack_top ; SVC模式栈顶地址
  4. 初始化内存系统

    • 配置DDR/SDRAM控制器(芯片手册提供参数)
      void init_sdram(void) {
      // 设置内存控制器寄存器
      *((volatile uint32_t*)0x48000000) = 0x22000000;
      // ...其他寄存器配置
      }
  5. 代码重定位(可选)

    • 将代码从Flash复制到RAM执行
      LDR R0, =_code_start    ; 源地址(Flash)
      LDR R1, =_text_start    ; 目标地址(RAM)
      LDR R2, =_data_end
      copy_loop:
      LDMIA R0!, {R3-R10}     ; 批量加载
      STMIA R1!, {R3-R10}
      CMP R1, R2
      BLT copy_loop
  6. 初始化BSS段(清零)

     LDR R0, =_bss_start
     LDR R1, =_bss_end
     MOV R2, #0
    zero_loop:
     STR R2, [R0], #4
     CMP R0, R1
     BLT zero_loop
  7. 跳转主程序

     BL main                 ; 跳转到C语言的main函数

二、关键注意事项

  1. 芯片手册依赖

    • 时钟配置:PLL锁定时间(如设置MPLL)
    • 内存时序:SDRAM参数需按硬件设计填写
    • 外设基地址:查看芯片Memory Map
  2. 编译器相关

    • 链接脚本定义内存区域(.text, .data, .bss)
      MEMORY {
      ROM (rx) : ORIGIN = 0x00000000, LENGTH = 256K
      RAM (rwx): ORIGIN = 0x40000000, LENGTH = 64K
      }
  3. 优化技巧

    • 用汇编实现核心初始化(速度敏感部分)
    • C语言中声明register变量加速启动
    • 使用volatile避免编译器优化硬件寄存器访问

三、调试手段

  1. LED调试法

    void main() {
     volatile uint32_t *GPIO_DAT = (uint32_t*)0x56000014;
     *GPIO_DAT |= (1 << 5);  // 点亮LED
    }
  2. 串口输出

    • 初始化UART后打印状态信息
  3. JTAG/SWD调试

    • 结合IDE设置断点查看寄存器

四、示例代码结构

/* startup.s */
.section .vectors
_start:
  b Reset_Handler
  /* 其他异常入口... */

.section .text
Reset_Handler:
  /* 初始化硬件 */
  bl init_clock
  bl init_sdram
  /* 跳转C入口 */
  ldr sp, =_stack_top
  bl main

/* init.c */
void init_clock(void) {
  // 配置PLL寄存器
}

int main() {
  while(1); // 主循环
}

提示:完整启动代码需配合具体芯片手册调整(如STM32需处理中断向量偏移)。建议参考厂商提供的启动文件(如Keil中的startup_stm32f4xx.s)进行修改。

ARM64位与ARM32位OP-TEE启动过程的差异

ARM32的OP-TEE与ARM64的OP-TEE启动过程大致相同。ARM

2023-11-07 15:12:12

ARM汇编入门

我们在学习ARM的时候,一般都不用看汇编启动代码,直接使用芯片厂商提供的汇编启动

2023-06-10 14:00:20

初识ARM处理器模板的启动文件

首先决定看 ARM 模板的启动文件,光这个启动文件就不简单啊,因为 ARM

2022-06-30 14:51:21

Cortex-M3(M0)汇编-启动代码分析资料下载

电子发烧友网为你提供Cortex-M3(M0)汇编-启动代码分析资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资

资料下载 刘洋 2021-04-13 08:46:36

如何让ARM代码执行速度更快?资料下载

电子发烧友网为你提供如何让ARM代码执行速度更快?资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、

资料下载 王强 2021-03-30 08:41:46

使用ARM处理器实现代码的分析与编程资料概述

优秀的启动代码的编写可以保证程序的稳定高效运行。首先介绍了ARM(AdvancedRISCMachines)

资料下载 佚名 2019-10-25 11:34:30

如何设计ARM核处理器S3C4510B的启动代码详细资料分析

研究了ARM核处理器S3C4510B 的中断异常处理机制和启动代码的任务及运行过程。分析了在REMAP(存储系统重映射) 情况下中断向量设置、存

资料下载 佚名 2019-10-12 16:44:03

单片机的启动代码详细资料说明

对于熟悉电脑的伙伴们来说,BIOS(那个蓝色的界面)可能不会太陌生吧,这货就是电脑的启动代码。没有BIOS的电脑,那注定是一块板砖!BIOS主要是做一些开机前的准备工作,例如系统时间设定、

资料下载 向日葵的花季 2019-07-29 17:36:00

如何启动ARM

如何启动ARM?

2022-01-21 07:36:29

谈一谈嵌入式的SDRAM与启动代码

《嵌入式技术ARM裸机开发》之SDRAM与启动代码 2008年毕业于沈阳航空...

2021-12-23 07:23:43

MCU的启动代码是如何运行的

启动代码通常都烧写在flash中,它是系统一上电就执行的一段程序,它运行在任何用户c代码之前。上电后,

2021-11-03 08:09:23

启动代码的主要功能是什么?启动代码和Bootloader的区别和关系是怎样的?

为什么启动代码一定一要用汇编语言编写?启动代码的主要功能是什么?单片机不

2021-03-10 07:41:06

ARM启动代码为什么要用汇编语言?

ARM的启动代码为什么要用汇编语言

2021-02-26 07:17:48

ARM代码编译链接的工作流程

ARM处理器在市面上到处都是ARM7、ARM9、Cortex-M、Cortex-R、Cortex-A包含的种类繁多,今天我们就来了解一下

2020-12-22 16:57:59

关于MDK-ARM代码格式化插件AStyle

MDK-ARM代码格式化插件AStyle

2020-03-07 16:34:53

7天热门专题 换一换
相关标签