endp 汇编start_飞思卡尔Kinetis L 汇编语言启动文件startup_MK25Z4简单分析
打开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简单分析相关推荐
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...
- 痞子衡嵌入式:飞思卡尔Kinetis开发板OpenSDA调试器那些事(上)- 背景与架构
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis MCU开发板板载OpenSDA调试器(上篇). 众所周知,嵌入式软件开发几乎离不开调试器,因为写一个稍有代码规模 ...
- 飞思卡尔Kinetis 60(K60)时钟系统分析
前段时间学习了飞思卡尔K60芯片的时钟系统,对它的时钟系统有了个大致的了解,这里把自己的理解写下来分享一下,以备以后参考. 飞思卡尔 Kinetis系列是飞思卡尔推出的基于ARM CORTEX-M4为 ...
- 带你走进飞思卡尔Kinetis Flashloader(5)
上节我们了解了Kinetis Flashloader支持的外设SPI和I2C,今天我们来看支持的外设UART和CAN UART外设 飞思卡尔Kinetis Flashloader对UART ...
- ARM汇编指令学习---基于启动文件startup.S分析
本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...
- 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 ...
- endp 汇编start_常见汇编代码
# 常见汇编代码 # 1. 编写程序:比较AX,BX,CX中带符号数的大小,将最大的数放在AX中 code segment assume cs:code mov ax,32 mov bx,74 mov ...
- 飞思卡尔Kinetis芯片中NVIC模块的中断寄存器的介绍及其应用举例
NVIC模块的中断寄存器简介 嵌套式向量中断控制器(NVIC)是Cortex内核不可分割的一部分,它与CPU紧密结合,可对系统异常和外设中断进行控制.如图1所示,NVIC右端连接到各个外围模块,负责对 ...
- 飞思卡尔Kinetis系列单片机被锁住后,怎么解锁
Kinetis提供了相当可靠地知识产权保护机制:人为的给芯片上锁,这个对量产后的产品是必须的.但是,用户误擦写了芯片内部security的内存部分(0x400~0x40F),从而锁住了芯片:难道芯片就 ...
最新文章
- 人民日报:中国 31 个省市区最好的大学
- plspl和oracle,LOL2017LSPL春季死啊DS轻取NON ME逆转GD赢得首胜
- 编程软件python中的if用法-python 函数式编程工具
- Python中的支持向量机SVM的使用(有实例有源码)
- 对校招生培养工作的建议_如何提升人才培养质量?西华的老师们正面临一场大考...
- Java Calendar getActualMaximum()方法与示例
- [转载]关于NETBIOS理清楚概念的文章
- 雅士利牵手阿里云实现新零售改造,双11全渠道成交金额同比增长超过200%
- 如何用4K YouTube转换视频为MP3,同时设置成MP3桌面播放器?
- in-band(带内) and out-of-band(带外) management
- r2d 小米路由器2_维修一台亮黄灯的R2D小米路由器2
- Python+大数据技术框架和数仓基础(一)
- 安装kali的过程以及菜咩学到的基础知识
- 奶茶店、粥店、火锅店卫生问题频出,如何通过视频监管系统保证群众饮食安全?
- Oracle官网登录下载资源账号
- 海内存知己,天涯若比邻
- EF6 T4 Model.TT文件的修改-自动加上注释
- Word文件的只读模式没有密码怎么退出?
- MySQL数据库软件及SQL简介
- ubuntu20.04禁止自动休眠的几种方式