历史上的今天
返回首页

历史上的今天

今天是:2025年04月19日(星期六)

2019年04月19日 | stm32F103大容量Flash的启动文件分析理解

2019-04-19 来源:eefocus

启动文件详解:


启动文件的作用:


1.初始化堆栈指针


2.初始化PC指针


3.初始化中断向量表


4.配置系统时钟


5.调用 C 库函数_main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界


 


详解:


给栈分配地址


Stack_Size EQU 0x00000400 ;1kb


 


AREA STACK(名字), NOINIT(不初始化), READWRITE(可读可写), ALIGN=3(以3个字节对齐,表示)


Stack_Mem SPACE Stack_Size


__initial_sp


 


EQU:宏定义的伪指令,代表#define


AREA:告诉汇编器一个新的代码段或数据段


ALIGN:表示里面的数据要以怎样的形式对齐,一般跟一个立即数,代表以2的立即数次方字节对齐。这里是8字节对齐。默认是4字节对齐


SPACE:给xxx分配地址


Stack_Mem:栈的大小


__initial_sp:表示栈的结束地址


栈(Stack)知识普及;


栈的作用是用于局部变量,函数调用,函数形参等的开销。并且栈的结束地址是最 高位 地址,栈是从高往低生长。其实函数调用开销表示调用时存放函数地址。


给堆分配地址


Heap_Size EQU 0x00000200



AREA HEAP, NOINIT, READWRITE, ALIGN=3


__heap_base


Heap_Mem SPACE Heap_Size


__heap_limit


PRESERVE8


THUMB


__heap_base:表示堆的起始地址


__heap_limit:表示堆的结束地址


PRESERVE8: 指定当前文件的堆栈按照 8 字节对齐。


THUMB: 表示后面指令兼容 THUMB 指令。 THUBM 是 ARM 以前的指令集, 16bit,


现在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位


的指令,是 THUMB 的超集。


初始化中断向量表


中断向量表:是中断服务函数的集合地,无论是内核中断,还是外设中断,当系统有异常服务例程(ESR),就去查询此向量表,找到其中对应的标号,执行标号地址中的函数,效率高。


完全表可在STM32F103中文参考手册P132查询


 

; Vector Table Mapped to Address 0 at Reset


AREA RESET, DATA, READONLY


EXPORT __Vectors


EXPORT __Vectors_End


EXPORT __Vectors_Size


;:表注释


DATA:表数据


EXPORT:定义此变量有全局性,可被外部的文件使用。


_Vectors DCD __initial_sp ; Top of Stack


DCD Reset_Handler ; Reset Handler


DCD NMI_Handler ; NMI Handler


_Vectors:表示向量表开始地址


DCD:以字为单位分配内存,要求 4 字节对齐,并要求初始化这些内存


DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5


__Vectors_End


 

__Vectors_Size EQU __Vectors_End - __Vectors


__Vectors_End:表示向量表结束地址



复位程序


Reset_Handler PROC


EXPORT Reset_Handler [WEAK]


IMPORT __main


IMPORT SystemInit


LDR R0, =SystemInit


BLX R0


LDR R0, =__main


BX R0


ENDP


PROC:定义一个子程序,与ENDP成对出现,表示子程序结束


IMPORT :表示该标号来自外部文件,跟 C 语言中的 EXTERN 关键字类似。这里表示SystemInit 和__main 这两个函数均来自外部的文件。


LDR 从存储器中加载自一个寄存器中,将SystemInit函数从存储器中加载到R0。


BLX :跳转到由寄存器给出的地址,并根据寄存器的 LSE 确定处理器的状态,还要


把跳转前的下条指令地址保存到 LR


BX:跳转到由寄存器/标号给出的地址,不返回。


是系统通电后运行的一个程序,运行后单片机时钟被配置位72M,并转至c语言世 界。


R0:在CM3权威指南 P36


中断服务函数


在这里是向量表中的中断服务函数


NMI_Handler PROC


EXPORT NMI_Handler [WEAK]


B .


ENDP


B . :表示无限循环,死机


[WEAK]:弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不出错。要注意的是:这个不是 ARM的指令,是编译器的,这里放在一起只是为了方便。也就是,此中断函数,在stm32固件库中的,it.c中我们可以对中断服务函数编程,并且在编译时优先使用我们编程的函数,但是我们的函数名字一定要和向量表中的一样,不要编译时就直接来到这里找中断服务函数。从而导致死机。


用户堆栈初始化:


IF :DEF:__MICROLIB


if #define __MICROLIB(这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1)


EXPORT __initial_sp


EXPORT __heap_base


EXPORT __heap_limit


ELSE


IMPORT __use_two_region_memory //用户自己编写的程序


EXPORT __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


ALIGN


ENDIF


END


个人理解__user_initial_stackheap这个程序是在建立堆栈区域,因为堆和栈是相邻的呀。


最后初始化栈堆指针如果有理解错误,希望大家指出。

推荐阅读

史海拾趣

Cooper Industries公司的发展小趣事

在电工产品领域,Cooper Industries同样取得了显著的成就。2000年,公司收购了Eagle电气,并将其与已有的接线装置产品系列合并,组建成了一个名为“库柏电工”的新事业部。这一举措不仅丰富了公司的产品线,也使其在电工产品领域的技术实力得到了进一步提升。库柏电工提供了超过10000个高质量装置的产品组合,广泛应用于工业、商业和住宅领域,满足了不同客户的需求。同时,公司还不断投入研发,推出更加先进、高效的电工产品,为行业的发展做出了积极贡献。

安纳森(AnaSem)公司的发展小趣事

在电子行业中,晶振模组是众多电子设备不可或缺的核心组件。安纳森(AnaSem)公司自创立之初,便致力于研发创新的晶振模组技术。面对市场上多数厂家仍依赖传统晶体制作方法的现状,安纳森凭借其深厚的研发实力和前瞻性的技术视野,成功研发出以单体式集成电路为核心的晶振模组制作技术。这一技术的突破不仅大幅提升了晶振模组的性能与稳定性,更使得安纳森在激烈的市场竞争中脱颖而出,迅速占据了行业的一席之地。

Epitex Inc公司的发展小趣事

Epitex一直将品质管理作为公司的核心竞争力之一。他们建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的控制。同时,Epitex还不断引进先进的生产设备和检测技术,确保产品的稳定性和可靠性。

此外,Epitex还非常重视员工的培训和素质提升。他们定期组织员工进行技能培训和质量意识教育,提高员工的专业素养和工作质量。这种持续改进的精神使得Epitex的产品质量得到了客户的高度认可。

华润华晶公司的发展小趣事

Epitex非常重视企业文化的建设和团队精神的培育。他们倡导“创新、协作、务实、共赢”的价值观,鼓励员工积极创新、勇于挑战。同时,Epitex还注重员工关怀和福利待遇的提升,为员工提供良好的工作环境和发展空间。

在团队建设方面,Epitex注重培养员工的团队协作能力和沟通能力。他们定期组织团队活动和培训项目,增强团队的凝聚力和向心力。这种积极向上的企业文化和高效的团队协作为Epitex的持续发展提供了有力保障。

Components Corporation公司的发展小趣事

随着全球环保意识的不断提高,Epitex也积极响应环保号召,将环保理念融入到公司的生产经营中。他们采用环保材料和生产工艺,减少对环境的影响。同时,Epitex还积极参与环保公益活动,推动电子行业的绿色发展。

在可持续发展方面,Epitex也做出了积极努力。他们通过技术创新和产业升级,不断提高资源利用效率和产品附加值。同时,Epitex还注重与供应商和客户的合作,共同推动产业链的可持续发展。

GE (General Electric)公司的发展小趣事
包括机床指示灯和照明灯,用于指示机床的工作状态和提供工作照明。

问答坊 | AI 解惑

石英振荡体名企诚招 研发部总工

百利通公司总部设在硅谷,是Nasdaq上市公司,在晶体振荡器领域位居世界前十大。百利通公司在香港和美国都设有研发中心,拥有一批经验丰富的专业设计人员。随着产品线的扩充和区域市场的成熟,先后在台湾、香港、上海设立公司,凭借其遍布全球的销售 ...…

查看全部问答>

求高手们帮忙看看这个射频可调衰减器

求高手们帮忙看看这个射频可调衰减器求高手们帮忙看看这个射频可调衰减器中Q1是用什么管的。型号是多小!!!!!原来上面用的是这个3个脚的管子 …

查看全部问答>

隔离器选型要点

隔离器选型要点 一.共模干扰抑制能力,隔离器优势先决条件。 隔离器在独有行业范围内,无论是温度隔离变送器、信号分配器、隔离配电器及电流、电压变送器等产品内,它们共有特点是端口之间要绝对电气隔离,也就是一次仪表、电源及采集设备之间没有任 ...…

查看全部问答>

如何选择生物识别产品?

  采用生物识别技术的门禁系统在安防行业应用已经越来越多,包括银行、监狱、部队等单位已经采用生物识别的门禁系统来加强其管理的安全性和使用的方便性。由于生物识别技术已经开始达到大规模的应用水平,包括产品价格、品质和技术都已经相对成熟 ...…

查看全部问答>

无法弹出wifi登陆框

wince加了wifi组件,同时里面有wifi的驱动和注册表 但插入wifi模块时候为什么不能够弹出登录框 dnw也没有打印出wifi加载的信息 想问一下 这个现象是不是与定制explore的时候有关呢? 由于需要,将系统的部分功能裁减了,比如说将\"任务栏\"去 ...…

查看全部问答>

window media player下添加菜单

大家好:      请教大家一个问题:      在微软window mobile 的windows media player下的右软键菜单下添加一个菜单项,该怎么添加? 微软是否提供相应的接口?      有谁知道 ...…

查看全部问答>

怎样读出试图列表里文件的名,用OnClickList么?

程序大概这样的,一个试图列表里显示了CF卡中所有的文件,鼠标焦点可以放在文件上,但现在想做一个选取功能,就是,当鼠标单击了一个文件就能直接或按另一个按钮读出他的名字,这样好去CF卡中查找这个文件并对这个文件操作。问题是,怎么读出文件的 ...…

查看全部问答>

I2C总线库函数介绍

函数I2CMasterInitExpClk( )    …

查看全部问答>

单片机浮点与字节数组的转换

void FloatToByte(float floatNum,unsigned char* byteArry){    char* pchar=(char*)&floatNum;    for(int i=0;i<sizeof(float);i++)    {  &nb ...…

查看全部问答>

M4开发板(14):硬件问题,关于Hanker开发板的VREF!

这几天又重新玩起了ADC采样功能,在测试AD采样加速度传感器的时候,我发现了问题,这个问题早在 https://bbs.eeworld.com.cn/viewthread.php?tid=330464这个帖子里,我就发现了,那就是AD采样的值不准确!!那个测倾角的程序,本来使用的那个MSP-E ...…

查看全部问答>