2.STM32启动文件
一、概念声明
中断向量:由硬件产生的中断标识码,一般用于存放中断服务程序的跳转指令。根据硬件产生的中断号查找中断向量表来确定对应的中断向量。CM3内核有15个异常
和240个中断源。
程序的内存分配:(更多内容: http://blog.csdn.net/c12345423/article/details/53004747 )
栈(stack) :由编译器自动进行分配和释放,一般用于存放函数的参数和局部变量的值。操作方式类似于数据结构中的栈。
特性:由于栈的操作顺序是先进后出,因此用栈顶指针(top)来进行操作占空间。在STM32中,此段空间在启动文件(汇编文件)中被分配,相当于在OS中给任务分配
的栈空间。
栈的生长方式为由下至上,在STM32的map文件得知,栈顶地址为 0x2001ab8.大小为1024Bytes.
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
堆(heap) :由程序员进行分配和释放,若程序员没有进行释放,最后由OS进行释放。
全局区(静态区):初始化的全局变量及静态变量被放置在一起,而未初始化的全局变量和静态变量存放在另一块区域。
文字常量区:字符串存放的位置。
程序代码区:存放函数体的二进制文件。
异常(中断)发生时的内核操作:
①、保护现场(压栈操作)。处理器通过硬件将相关的寄存器xPSR、PC、LR R12及R0-R3保存到当前使用的堆栈中。
②、取向量 CM3内核内部有 数据总线(Dbus)和指令总线(Ibus)。在Dbus保存处理器状态的同时,Ibus将从向量表取出异常向量,并获取ISR函数的地址,
保护现场和取向量是同时进行的。
③、更新寄存器(恢复现场)。
二、启动文件与内核架构的说明
1.不同的CPU需要的启动文件不同,定义的硬件资源如 定时器、串口等不同。
2.复位后的执行过程:
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,
CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断
向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况:
(1) 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
(2) 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
(3) 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;
而Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的
下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。
三、启动文件的内容说明
1.开辟一定大小的堆栈空间,设置SP、PC指针。
2.在代码的起始位置建立中断向量表,第一个表项是栈顶指针(从Flash启动,为0x8000000),第二个表项是复位中断服务程序入口地址。
3.在复位中断服务程序中设置系统初始时钟 、实现由__main跳转到C语言 main函数。
__main不是C语言中mian的入口。__main标号表示C/C++标准实时库函数里的一个初始化子程序__main的入口地址。该程序的一个主要作用是初始化堆栈
(对于程序清单一来说则是跳转__user_initial_stackheap标号进行初始化堆栈的),并初始化映像文件,最后跳转C程序中的main函数。这就解释了为何
所有的C程序必须有一个main函数作为程序的起点——因为这是由C/C++标准实时库所规定的——并且不能更改,因为C/C++标准实时库并不对外界开放源代码。
因此,实际上在用户可见的前提下,程序在第204行后就跳转至.c文件中的main函数,开始执行C程序了。
2.STM32启动文件的更多相关文章
- STM32启动文件
一.复位电路 在了解启动文件之前需要明白STM32的复位中断流程,STM32的复位分为上电复位和手动复位,复位的电路图如下所示: 注意: 图中的复位电路是低电平复位,有的MCU是高电平复位. 上电复位 ...
- STM32启动文件的选择
移植了同事一个程序,然后死活不能用,发现启动文件错了,明天继续调.真把人折腾死了. stm32给的库文件太琐碎了,正如它的芯片型号一样繁多,例如启动文件: 网上查到的各个文件的解释是: startup ...
- stm32启动文件ld md hd cl vl xl分析及选择
startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx, ...
- (转)stm32启动文件详解
在<<STM32不完全手册里面>>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字 ...
- STM32启动文件深度解析
STM32启动过程全面解析,包括启动过程的介绍.启动代码的陈列以及深入解析.相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化.ARM7/ARM9 ...
- STM32启动文件:startup_stm32f10x_hd.s等启动文件的简单描述
在官方的库文件中,分别有如下文件: startup │ │ │ ├─arm │ │ │ │ startup_stm32f10x_cl.s │ │ │ │ startup_stm32f10x_hd.s ...
- STM32启动文件详解
启动文件使用的 ARM 汇编指令汇总 启动程序源码注释(点此下载) 1. Stack—栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE ...
- STM32启动文件详细解析(V3.5.0) 以:startup_stm32f10x_hd.s为例
我用的是IAR,这个貌似是MDK的,不过很有用,大家可以看一下 ;* 文件名 : startup_stm32f10x_hd.s ;* 库版本 : V3.5.0 ;* 说明: 此文件为STM32F10x ...
- stm32启动文件 startup_stm32f10x_hd.s
;* 文件名 : startup_stm32f10x_hd.s;* 库版本 : V3.5.0;* 说明: 此文件为STM32F10x高密度 ...
随机推荐
- es6学习---.babelrc文件
babel是用来进行转码的,在不支持es6的环境下,需要将es6的语法转码成es5的语法格式,就用到了babel. .babelrc 文件的配置 在项目的根目录下创建 .babelrc 文件 文件包括 ...
- weex中使用sass(失败)
在编辑器中可以正常编写不报错 但是在页面上不起作用 <style lang="scss" scoped></style> 第一步 安装依赖 npm i ...
- ZCRM_AU_MAIL
FUNCTION ZCRM_AU_MAIL. *"---------------------------------------------------------------------- ...
- Redis缓存设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要.下面会介绍缓存使 用技巧和设计方案,包含如下内容:缓存的收益和成本分析.缓存更新策略的 ...
- react-thunk的使用流程
react-thunk作用:使我们可以在action中返回函数,而不是只能返回一个对象.然后我们可以在函数中做很多事情,比如发送异步的ajax请求. 这就是react-thunk的使用方法.接受一个d ...
- 从swap说引用
C++的引用类型是个很奇妙的存在,比如下面这个例子: #include<iostream> using namespace std; void swap(int& a, int&a ...
- 朋友给的IE滚动条
scrollbar-arrow-color: #f4ae21; /*图6,三角箭头的颜色*/scrollbar-face-color: #333; /*图5,立体滚动条的颜色*/scrollbar ...
- XenServer7.6命令行导出导入虚拟机(迁移)
一:命令行方法导出虚拟机(先关闭虚拟机) 1.1:打印虚拟机列表 xe vm-list uuid ( RO) : 43dfac04-515e-7769-b2d2-444d4b7cb198 name-l ...
- 【IDEA&&Eclipse】1、为何 IntelliJ IDEA 比 Eclipse 更适合于专业java开发者
圣战 有一些没有唯一正确答案的“永恒”的问题,例如哪个更好:是Windows还是Linux,Java还是C#:谁更强壮:Chuck Norris还是Van Damme. 其中的一个圣战便是Java I ...
- 剑指Offer 53. 表示数值的字符串 (字符串)
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...