和记娱乐


网站导航

联系我们

和记娱乐

联系人: 

电 话:021-64057486

公司网址:http://www.happy123456789.com

   址:成都市松江区漕河泾松江新兴产业园区研展路丰产支路55号B座803室

邮编:201165


通信知识

您的当前位置: 和记娱乐主页 > 通信知识 >

STM32之启动文件详解

发布日期:2019-07-17 10:59 来源:和记h88 发布人:和记娱乐 点击:

  在嵌入式应用程序开发过程里,由于使用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

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

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

  AREA指令是一个伪指令,用于段定义。ARM汇编程序由段组成,段是相对的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性。

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

  例子:开辟一个堆栈段,段名为STACK,定义为可读可写,将内存单元初始化为0,对齐方式为8字节对齐。

      和记娱乐,和记h88,h88平台官网