您的位置 首页 数字

STM32之发动文件了解

在嵌入式应用程序开发过程里,由于使用C语言编程,基本很少涉及到机器底层寄存器的执行过程,一般都会直接在main函数里开始写代码,似乎m

嵌入式应用程序开发进程里,因为运用C言语编程,根本很少涉及到机器底层寄存器的履行进程,一般都会直接在main函数里开端写代码,好像main成为了天经地义的起点,虽然从C程序的视点来看程序都是直接从main函数开端履行。但是,MCU上电后,是怎么寻找到并履行main函数这一问题却很天然的被忽略了!事实上微控制器是无法从硬件上去定位main函数的进口地址,因为运用C言语作为开发言语后,变量/函数的地址便由编译器在编译时自行分配,因而main函数的进口地址在编译后便纷歧定是一个肯定地址。MCU上电后又是怎么寻找到这个进口地址呢?曾经触摸不管是PIC、AVR、MSP430或是51进程中都没涉及到发动文件的装备,只是只要熔丝位或装备字是需求依据实际运用装备来设置,其实并非没有,而是因为大部分的开发环境往往主动完整地供给了这个发动文件,不需求开发人员再行干涉发动进程,只需求从main函数开端进行应用程序的规划即可。但是,但触摸到嵌入内核比方Linux体系移植进程“bootloader”却是很重要也是必不可少的一个环节。事实上,每一种微控制器,不管功能高低,结构简繁,价格贵贱都是必须有发动文件才干正常作业的,它的效果同“bootloader”相似。发动文件完成了微控制器从“复位”到“开端履行main函数”中心这段时刻的必要发动装备。

STM32中,假如是在MDK下创立一个工程,一般都有提示是否参加Star up Code文件,这个便是发动文件,这里有个误区,一般关于初学者来看,很简单误以为STM32F10x.s这个发动文件是STM32一切类型芯片的通用发动文件,因而也天然不会去理睬它的效果,事实上,这个发动文件只是针对部分STM32系列,假如细心看过它的发动代码就会发现里边许多中止函数界说是没有的,乃至有些和STM32F10x_it.c里的函数是有出路的,假如刚好用到了默许的这个中止服务子函数的话,程序一旦运转到了中止是找不到进口地址的,这样就会不可思议地不知问题所在。STM32F10x.s是MDK供给的发动代码,从其里边的内容看来,它只界说了3个串口,4个定时器。实际上STM32的系列产品有5个串口的类型,也只要有2个串口的类型,定时器也是,做多的有8个定时器。比方,假如你用的STM32F103ZET6,而发动文件用的是STM32F10x.s的话,你能够正常运用串口1~3的中止,而串口4和5的中止,则无法正常运用。所以STM32F10x.s并不能适用一切的STM32类型,关于不同类型的STM32,正确做法是挑选不同的发动文件。ST公司供给了3个发动文件:startup_stm32f10x_ld.s
/startup_stm32f10x_md.s/startup_stm32f10x_hd.s 别离适用于小容量/中容量/大容量的STM32芯片,详细判别办法如下:

小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH
在发动代码中,弥补几点:

发动代码中的两条句子解说:

一、PROC 为子程序开端,ENDP 为子程序完毕

二、[weak] 的意思是该函数优先级比较弱,假如其它当地界说了一个同名函数,那么此处的这个函数就被替代了。语法格局为 EXPORT 标号 {[WEAK]} 。EXPORT 可用GLOBAL替代。

关于_main函数的了解:

事实上,_main 和main是两个彻底不同的函数!_main代码是编译器主动创立的,因而无法找到_main代码。MDK文档中有一句阐明:it is automatically craated by the linker when it sees a definition of main() .大体意思能够了解为:当编译器发现界说了main函数,那么就会主动创立_main.

_main 和main的联系

_main 主要做两件事:其一,C所需的资源;其二,调用main函数。这就不难了解为什么在发动代码调用的是_main ,最终却能转到main函数中去履行的原因了。

AREA指令的了解

AREA指令是一个伪指令,用于段界说。ARM汇编程序由段组成,段是相对独立的指令或数据单位,每个段由AREA伪指令界说,并界说段的特点。

AREA参数阐明:

* STACK——AREA指令的一个参数,界说段称号

* NOINIT——AREA指令的一个参数,指定本数据段只是保留了内涵单元,而将句初始值写入内存单元,此刻内存单元值初始化为0

* READWRITE——指定本段为可读可写,数据段默许为READWRITE.

READWRITE(读写)、READONLY(只读)

*ALIGN——也是一个伪指令,指定对齐方法。ALIGN n 指令的对齐值有两种挑选:n或许2^n

比如:拓荒一个仓库段,段名为STACK,界说为可读可写,将内存单元初始化为0,对齐方法为8字节对齐。

AREA STACK,NOINIT,READWRITE,ALIGN=3

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/262547.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部