STM32F4XX启动文件分析
2016-04-16 15:56
441 查看
STM32F4XX启动文件分析
- STM32F4XX启动文件下载地址
初始化设置PC指针指向复位中断处理函数,即PC = Reset_Handler
导入中断服务程序(ISR)地址以设置中断向量表
配置系统时钟与外部挂载到STM324xG-EVAL板子上的的SRAM用作数据存储,外部完成的Systeminit完成
转到C库的__main处,也就是main()函数处进行代码的执行
复位CortexM4之后,处理器处于线程模式,为特权优先级,并且栈被设置位MSP主堆栈
满递增:SP指向最后一个被压入的元素,SP朝内存地址增加方向递增
满递减:SP指向最后一个被压入的元素,SP朝内存地址减小方向递增
空递增:SP指向最后一个被压入的元素的下一个为空的地址,SP朝内存地址增加方向递增
空递减:SP指向最后一个被压入的元素的下一个为空的地址,SP朝内存地址减小方向递增
设置中断向量表段
初始化堆栈(外部调用)
构建中断处理函数,代码段(里面包含了中断复位处理函数,里面可以初始化整个系统,然后跳转到main()函数处执行)
- STM32F4XX启动文件下载地址
导读:STM32F4XX启动文件的作用
初始化设置SP,即栈指针初始化设置PC指针指向复位中断处理函数,即PC = Reset_Handler
导入中断服务程序(ISR)地址以设置中断向量表
配置系统时钟与外部挂载到STM324xG-EVAL板子上的的SRAM用作数据存储,外部完成的Systeminit完成
转到C库的__main处,也就是main()函数处进行代码的执行
复位CortexM4之后,处理器处于线程模式,为特权优先级,并且栈被设置位MSP主堆栈
1、设置栈
Stack_Size EQU 0x00000400 ;栈大小设置为1024字节 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;段名称为STACK,未初始化,允许读写,8字节对齐 ;AREA指示编译器编译出一个新的代码段或者数据段,ALIGN = 3,就是2的3次方字节对齐,也就是8字节 Stack_Mem SPACE Stack_Size ;分配空间,大小为1024字节,并把首地址赋值给Stack_Mem __initial_sp ;初始化栈指针,指向栈的顶部,也就是上述空间的尾部,STM32采用满递减堆栈
寻址方式 | 说明 | pop=LDM | push=STM | ||
---|---|---|---|---|---|
FA | 满递增 | LDMFA | LDMDA | STMFA | STMIB |
FD | 满递减 | LDMFD | LDMIA | STMFD | STMDB |
EA | 空递增 | LDMEA | LDMDB | STMEA | STMIA |
ED | 空递减 | LDMED | LDMIB | STMED | STMDA |
满递减:SP指向最后一个被压入的元素,SP朝内存地址减小方向递增
空递增:SP指向最后一个被压入的元素的下一个为空的地址,SP朝内存地址增加方向递增
空递减:SP指向最后一个被压入的元素的下一个为空的地址,SP朝内存地址减小方向递增
2、设置堆
Heap_Size EQU 0x00000200 ;堆大小设置为512字节 AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;段名称为HEAP,未初始化,允许读写,8字节对齐 __heap_base ;堆起始地址 Heap_Mem SPACE Heap_Size ;分配堆空间 __heap_limit ;堆限制大小
3、设置对齐与指令集
PRESERVE8 ;保持下述空间保持8字节对齐 THUMB ;使用THUMB指令集,要声明在任何使用THUMB指令集的语句之前
4、设置中断向量表
AREA RESET, DATA, READONLY ;段名称为RESET,数据段,只读,保持8字节对齐,由上面的PRESERVE8指定 EXPORT __Vectors ;向量表开始 EXPORT __Vectors_End ;向量表结束 EXPORT __Vectors_Size ;向量表大小,可由上述两个标号算出 ;EXPORT 标号的输出(类似于linux设备驱动模块的EXPORT_SYMBOL(symbol)) ;DCD 用于分配一片连续的存储单元,并且使用指定的数据进行初始化,仍然保持8字节的对齐 __Vectors DCD __initial_sp ; 堆栈顶部地址,复位后首先装载堆栈 DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; 硬件错误 DCD MemManage_Handler ; MPU错误 DCD BusFault_Handler ; 总线错误 DCD UsageFault_Handler ; 引用错误 DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; 系统滴答计时器中断响应函数 ;上述为STM32内部指定中断向量 ; External Interrupts DCD WWDG_IRQHandler ; Window WatchDog ... ... DCD HASH_RNG_IRQHandler ; Hash and Rng DCD FPU_IRQHandler ; FPU __Vectors_End ;中断向量表结束地址 __Vectors_Size EQU __Vectors_End - __Vectors ;定义中断向量表长度为结束地址减去开始地址
5、构建中断向量函数
AREA |.text|, CODE, READONLY ;段名为.text(C编译器产生的代码段就是.text,此处可以嵌入C编译出来的代码段),代码段,只读 ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] ;WEAK,如果有重复的定义,优先执行其他的定义 IMPORT SystemInit ;导入SystemInit标号 IMPORT __main ;导入__main标号,也就是main()函数地址 LDR R0, =SystemInit BLX R0 ;带链接跳转并切换指令集 LDR R0, =__main BX R0 ;跳转并切换指令集 ENDP ; Dummy Exception Handlers (infinite loops which can be modified) NMI_Handler PROC EXPORT NMI_Handler [WEAK] B . ;死循环 ENDP ... ... ... ...
6、用户栈与堆初始化
ALIGN ;默认的对齐方式,也就是4字节对齐 ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* IF :DEF:__MICROLIB ;如果勾选了此选项(在keil工程option的target选项右侧) EXPORT __initial_sp ;导出三个符号 EXPORT __heap_base ; EXPORT __heap_limit ; ELSE IMPORT __use_two_region_memory ;否则导入__use_two_region_memory EXPORT __user_initial_stackheap ;导出__user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem ;堆首地址 LDR R1, =(Stack_Mem + Stack_Size) ;栈顶 LDR R2, = (Heap_Mem + Heap_Size) ;堆末地址 LDR R3, = Stack_Mem ;栈首地址 BX LR ;等同于mov pc, lr ;跳转并切换指令集,也就是切换到ARM指令集 ALIGN ENDIF END
7、整个流程分析
先分配好栈,堆段设置中断向量表段
初始化堆栈(外部调用)
构建中断处理函数,代码段(里面包含了中断复位处理函数,里面可以初始化整个系统,然后跳转到main()函数处执行)
相关文章推荐
- Android issues
- Git学习笔记
- autolayout 设置使用tableviewHeaderView
- Redis--开发 Spring Redis 应用程序
- MySQL:基础命令(慢慢累积)
- main函数中两个参数的用法
- 项目总结
- MAP getLastKnownLocation()返回null的解决
- 分治法之快速排序
- 处理tomcat不必要的日志
- POJ1273 Drainage Ditches
- java实现点击图片文字验证码
- 移植telnetd服务器到开发板笔记
- iOSapp的json告示
- Google自己的下拉刷新组件SwipeRefreshLayout
- android 5.0获取前台应用的包名的实现方法
- OOM排除
- JavaScript表单学习:与用户交互
- 声明!!!!!
- Python 练习实例28