打开Freedom KL25的例程包,任意找一个code example,以lower_power_dma_uart_demo为例,分析一下启动汇编文件的代码。

代码主要分三部分:堆栈等的配置、向量表、初始启动跳转。

1. 堆栈配置

; Stack Configuration

;   Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>

;

Stack_Size      EQU     0x00000800

AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE   Stack_Size

__initial_sp    EQU     0x20002ff8

; Heap Configuration

;     Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

;

Heap_Size       EQU     0x00000000

AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE   Heap_Size

__heap_limit

注:AREA关键字的作用是告诉汇编器,该section是独立的一段,应该重新开始解析。AREA后面的一系列表示该段的属性。

SPACE关键字告诉其后的一段memory存储空间,不被初始化为某些特定值,与FILL相对。

EQU可以理解为等于。

2. 向量表

; Vector Table Mapped to Address 0 at Reset

AREA    RESET, DATA, READONLY

EXPORT  __Vectors

EXPORT  __Vectors_End

EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp  ; Top of Stack

DCD     Reset_Handler  ; Reset Handler

DCD     NMI_Handler  ; NMI Handler

DCD     HardFault_Handler  ; Hard Fault Handler

DCD     0  ; Reserved

DCD     0  ; Reserved

DCD     0  ; Reserved

DCD     0  ; Reserved

DCD     0  ; Reserved

DCD     0  ; Reserved

DCD     0  ; Reserved

DCD     SVC_Handler  ; SVCall Handler

DCD     0  ; Reserved

DCD     0  ; Reserved

DCD     PendSV_Handler  ; PendSV Handler

DCD     SysTick_Handler  ; SysTick Handler

; External Interrupts

DCD     DMA0_IRQHandler  ; DMA channel 0 transfer complete interrupt

DCD     DMA1_IRQHandler  ; DMA channel 1 transfer complete interrupt

DCD     DMA2_IRQHandler  ; DMA channel 2 transfer complete interrupt

DCD     DMA3_IRQHandler  ; DMA channel 3 transfer complete interrupt

DCD     Reserved20_IRQHandler  ; Reserved interrupt 20

DCD     FTFA_IRQHandler  ; FTFA interrupt

DCD     LVD_LVW_IRQHandler  ; Low Voltage Detect, Low Voltage Warning

DCD     LLW_IRQHandler  ; Low Leakage Wakeup

DCD     I2C0_IRQHandler  ; I2C0 interrupt

DCD     I2C1_IRQHandler  ; I2C0 interrupt 25

DCD     SPI0_IRQHandler  ; SPI0 interrupt

DCD     SPI1_IRQHandler  ; SPI1 interrupt

DCD     UART0_IRQHandler  ; UART0 status/error interrupt

DCD     UART1_IRQHandler  ; UART1 status/error interrupt

DCD     UART2_IRQHandler  ; UART2 status/error interrupt

DCD     ADC0_IRQHandler  ; ADC0 interrupt

DCD     CMP0_IRQHandler  ; CMP0 interrupt

DCD     TPM0_IRQHandler  ; TPM0 fault, overflow and channels interrupt

DCD     TPM1_IRQHandler  ; TPM1 fault, overflow and channels interrupt

DCD     TPM2_IRQHandler  ; TPM2 fault, overflow and channels interrupt

DCD     RTC_IRQHandler  ; RTC interrupt

DCD     RTC_Seconds_IRQHandler  ; RTC seconds interrupt

DCD     PIT_IRQHandler  ; PIT timer interrupt

DCD     Reserved39_IRQHandler  ; Reserved interrupt 39

DCD     USB0_IRQHandler  ; USB0 interrupt

DCD     DAC0_IRQHandler  ; DAC interrupt

DCD     TSI0_IRQHandler  ; TSI0 interrupt

DCD     MCG_IRQHandler  ; MCG interrupt

DCD     LPTimer_IRQHandler  ; LPTimer interrupt

DCD     Reserved45_IRQHandler  ; Reserved interrupt 45

DCD     PORTA_IRQHandler  ; Port A interrupt

DCD     PORTD_IRQHandler  ; Port D interrupt

向量表很长,此处只截取一部分,这些向量表中的向量的默认名字就在这里指定了。开发人员只需将中断向量函数的具体功能实现即可。当然,有一些默认的dummy 异常handler已经有了,都是死循环:

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC

EXPORT  NMI_Handler               [WEAK]

B       .

ENDP

HardFault_Handler\

PROC

EXPORT  HardFault_Handler         [WEAK]

B       .

ENDP

SVC_Handler     PROC

EXPORT  SVC_Handler               [WEAK]

B       .

ENDP

PendSV_Handler  PROC

EXPORT  PendSV_Handler            [WEAK]

B       .

ENDP

SysTick_Handler PROC

EXPORT  SysTick_Handler           [WEAK]

B       .

ENDP

3. 启动代码

启动代码就放在Reset复位向量里面,因为Reset向量是MCU启动时候第一个进入到PC寄存器并开始执行的地方。

; Reset Handler

Reset_Handler   PROC

EXPORT  Reset_Handler             [WEAK]

IMPORT  SystemInit

IMPORT  __main

LDR     R0, =SystemInit

BLX     R0

LDR     R0, =__main

BX      R0

ENDP

启动代码首先将SystemInit的地址load到R0寄存器中,然后使用BLX跳转指令跳到SystemInit函数开始处去执行,执行完毕以后再执行main函数的执行。

接下去需要找SystemInit的代码查看。

endp 汇编start_飞思卡尔Kinetis L 汇编语言启动文件startup_MK25Z4简单分析相关推荐

  1. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...

  2. 痞子衡嵌入式:飞思卡尔Kinetis开发板OpenSDA调试器那些事(上)- 背景与架构

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis MCU开发板板载OpenSDA调试器(上篇). 众所周知,嵌入式软件开发几乎离不开调试器,因为写一个稍有代码规模 ...

  3. 飞思卡尔Kinetis 60(K60)时钟系统分析

    前段时间学习了飞思卡尔K60芯片的时钟系统,对它的时钟系统有了个大致的了解,这里把自己的理解写下来分享一下,以备以后参考. 飞思卡尔 Kinetis系列是飞思卡尔推出的基于ARM CORTEX-M4为 ...

  4. 带你走进飞思卡尔Kinetis Flashloader(5)

     上节我们了解了Kinetis Flashloader支持的外设SPI和I2C,今天我们来看支持的外设UART和CAN UART外设 飞思卡尔Kinetis Flashloader对UART ...

  5. ARM汇编指令学习---基于启动文件startup.S分析

    本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...

  6. endp 汇编start_汇编语言程序设计:[20]汇编计算器

    输入如下代码 ;==给DD数x赋值的宏==将DD型的两个数X,Y其中Y的值赋给X give macro x,y mov ax,y mov x,ax mov ax,y[2] mov x[2],ax en ...

  7. endp 汇编start_常见汇编代码

    # 常见汇编代码 # 1. 编写程序:比较AX,BX,CX中带符号数的大小,将最大的数放在AX中 code segment assume cs:code mov ax,32 mov bx,74 mov ...

  8. 飞思卡尔Kinetis芯片中NVIC模块的中断寄存器的介绍及其应用举例

    NVIC模块的中断寄存器简介 嵌套式向量中断控制器(NVIC)是Cortex内核不可分割的一部分,它与CPU紧密结合,可对系统异常和外设中断进行控制.如图1所示,NVIC右端连接到各个外围模块,负责对 ...

  9. 飞思卡尔Kinetis系列单片机被锁住后,怎么解锁

    Kinetis提供了相当可靠地知识产权保护机制:人为的给芯片上锁,这个对量产后的产品是必须的.但是,用户误擦写了芯片内部security的内存部分(0x400~0x40F),从而锁住了芯片:难道芯片就 ...

最新文章

  1. 人民日报:中国 31 个省市区最好的大学
  2. plspl和oracle,LOL2017LSPL春季死啊DS轻取NON ME逆转GD赢得首胜
  3. 编程软件python中的if用法-python 函数式编程工具
  4. Python中的支持向量机SVM的使用(有实例有源码)
  5. 对校招生培养工作的建议_如何提升人才培养质量?西华的老师们正面临一场大考...
  6. Java Calendar getActualMaximum()方法与示例
  7. [转载]关于NETBIOS理清楚概念的文章
  8. 雅士利牵手阿里云实现新零售改造,双11全渠道成交金额同比增长超过200%
  9. 如何用4K YouTube转换视频为MP3,同时设置成MP3桌面播放器?
  10. in-band(带内) and out-of-band(带外) management
  11. r2d 小米路由器2_维修一台亮黄灯的R2D小米路由器2
  12. Python+大数据技术框架和数仓基础(一)
  13. 安装kali的过程以及菜咩学到的基础知识
  14. 奶茶店、粥店、火锅店卫生问题频出,如何通过视频监管系统保证群众饮食安全?
  15. Oracle官网登录下载资源账号
  16. 海内存知己,天涯若比邻
  17. EF6 T4 Model.TT文件的修改-自动加上注释
  18. Word文件的只读模式没有密码怎么退出?
  19. MySQL数据库软件及SQL简介
  20. ubuntu20.04禁止自动休眠的几种方式

热门文章

  1. 使用Spring开发Java RESTful Web服务的7个理由
  2. Spring中的异步和事务性事件侦听器
  3. Java增强枚举的用例
  4. java签署ssl_签署Java代码
  5. Java EE 8 MVC:使用查询参数
  6. ruby和python_Ruby,Python和Java中的Web服务
  7. 使用Degraph管理软件包依赖关系
  8. 如何安全使用SWT的显示器asyncExec
  9. JUnit ExpectedException规则:超越基础
  10. 使用JAX-RS的HTTP缓存