历史上的今天
返回首页

历史上的今天

今天是:2025年03月08日(星期六)

2019年03月08日 | STM32__main代码分析

2019-03-08 来源:eefocus

STM32启动代码主要是分配堆栈及设置向量表,然后跳转到__main函数。

跳转具体到代码段部分如下:


[cpp] view plain copy

  1. Reset_Handler   PROC  

  2.                 EXPORT  Reset_Handler             [WEAK]  

  3.                 IMPORT  __main  

  4.                 LDR     R0, = __main  

  5.                 BX      R0  

  6.                 ENDP  


当您看到__main函数时,估计应该有不少人认为这个是main函数的别名或是编译之后的名字,否则在启动代码中再也无法找到和main相关的字眼了。可事实是,__main和main是完全两个不同的函数,并且你无法找到__main代码,因为这个是编译器自动创建的。

     

查看MDK的文档,会发现有这么一句说明:It is automatically created by the linker when it sees a definition of main()。简单点来说,当编译器发现定义了main函数,那么就会自动创建__main。

 

程序经过汇编启动代码,执行到__main()后,可以看出有两个大的函数:

__scatterload():负责把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作。

__rt_entry():负责初始化堆栈,完成库函数的初始化,最后自动跳转向main()函数。

 

分析__scatterload()函数

执行到__main(),先跳转到_scatterload下图红框框中代码所示,执行完后,R10和R11就被赋给成了下面两个值。


Map文件中的symbol








然后执行_scatterload_null代码,将R10对应地址存放的的4个字copy到R0~R3中,可以看出

R0:0x1000表示的是keyled.o加载域起始地址

R1:0x30000100为keyled.o运行域地址

R2:0X160为copy的大小,keyled.o的大小从map文件中得知就是0x160 Byte

R3:0X1E4 是_scatterload_copy 代码的起始地址,实用BXR3 就能跳转到_scatterload_copy来复制代码。

 



跳到_scatterload_copy,开始copy,循环0x16次,每次搬移4个字(16Byte),共搬移0x16*0x10=0x160





复制完keyled.o代码后,进一步循环到_scatterload_null准备好,ZI段需要清零的地址和范围

执行完这个循环后

R1:0x30050000 为ZI段的起始地址

R2:0x618为ZI段大小,换成十进制是1560.从map文件得知ZI大小就是1560Byte

R3:0x20c 为_scatterload_zeroinit 的地址





执行下面红框框中循环体,共清零0x610Byte范围,然后再执行蓝框框中代码,清零8Byte,总共0x618

ZI段清零(0x30050000~0x30050618)





然后使用BX R14跳转到0x000001BC处,顺序执行到BL  __rt_enty 指令

成功跳转到__rt_enty函数


 


分析__rt_entry()函数

先调用__user_setup_stackheap()函数来建立堆栈





可以看出在这个函数中,会执行到BL__user_initial_stackheap()函数,这样也就明白了,为什么使用分散加载文件,需要设置__user_initial_stackheap这个函数来设置堆栈空间。



推荐阅读

史海拾趣

台湾致强(FORT)公司的发展小趣事

面对电子行业的快速发展和市场需求的不断变化,致强科技始终保持敏锐的市场洞察力。公司积极寻求与上下游企业的跨界合作,共同推动产业升级和技术创新。通过与知名电子厂商、科研机构及高校等建立紧密的合作关系,致强科技不断引入新技术、新工艺和新材料,为产品的升级换代提供了有力支持。同时,公司还积极拓展新业务领域,如车联网、物联网等新兴领域,为公司的未来发展开辟了更广阔的空间。

浙江凡华(FANHAR)公司的发展小趣事

致强科技自2005年成立以来,便专注于高功率、低阻值且低TCR(温度系数)的电阻产品研发与生产。团队由一群具有机电整合、金属材料加工及冶金制程丰富经验的专家组成,他们独立研发出全合金材料的电阻生产制程,这一创新不仅区别于业界常见的厚膜或厚膜贴合金制程,还大幅提升了电阻的性能与稳定性。通过不断的技术迭代,致强科技成功推出了一系列高精度、高功率的合金电阻产品,广泛应用于各类电子产品中,满足了市场对高质量电流检知电阻的迫切需求。

Daniel Woodhead公司的发展小趣事

随着公司业务的不断拓展,Daniel Woodhead公司意识到人才是企业发展的核心。因此,公司加大了对研发团队的投入,引进了一批业界顶尖的技术人才。这些人才的加入不仅为公司带来了更多的创新思路,还提高了整体的技术水平。在团队的共同努力下,公司不断推出具有竞争力的新产品,进一步巩固了市场地位。

GMT(致新科技)公司的发展小趣事
使用收音机的方向键或旋钮来设置希望定时开机的时间。这可能包括小时、分钟以及是否启用AM/PM模式。
璟德(ACX)公司的发展小趣事

多年来,璟德(ACX)凭借其卓越的技术实力和市场表现,荣获了多项荣誉和奖项。这些荣誉不仅是对公司过去努力的肯定,也为其未来的发展注入了新的动力。同时,璟德(ACX)始终坚持创新驱动的发展理念,不断投入研发,推出新产品和新技术,以满足市场的不断变化和客户的需求。

请注意,以上故事是基于现有资料和行业常识构建的,可能无法完全反映璟德(ACX)公司实际发展历程中的所有细节和复杂性。如需了解更多关于璟德(ACX)公司的故事和发展历程,建议查阅公司官方网站、相关新闻报道或行业研究报告。

Ferroxcube公司的发展小趣事

在全球经济一体化的背景下,Ferroxcube公司意识到拓展国际市场的重要性。为了进一步扩大业务范围,公司决定在欧洲、亚洲和北美等地设立分支机构,以更好地服务当地客户。

通过在各地设立销售和服务中心,Ferroxcube成功地打入了多个国际市场。公司的产品和服务得到了越来越多国际客户的认可和赞赏。同时,公司也积极与当地的研究机构和高校合作,共同推动磁性元件技术的创新和发展。

这些国际市场的成功拓展不仅为Ferroxcube带来了更多的业务机会和收入来源,还进一步提升了公司在全球电子行业中的地位和影响力。如今,Ferroxcube已经成为了全球知名的磁性元件供应商之一,为电子行业的发展做出了重要贡献。

问答坊 | AI 解惑

c陷阱与缺陷

书中收集了c语言编程的几乎所有漏洞与缺陷。 这本书再版多少次了,几乎没有改版,经典!!! [ 本帖最后由 richiefang 于 2009-11-25 08:55 编辑 ]…

查看全部问答>

LabVIEW测量信号时间间隔的实现

LabVIEW测量信号时间间隔的实现 摘要 以两路信号为例, 详细阐述了以虚拟仪器方式, 针对不同种类的信号输入硬件板卡, 使用L abV IEW 软件平台实现信 号时间间隔测量的方法。详细解释了各种方法的特点、适用范围及具体实现。另外, 也根据具体的测 ...…

查看全部问答>

SD卡数据的读取

我想用FPGA来读取SD卡内的数据,那位大虾有现成的FPGA程序,共享一下!…

查看全部问答>

支持DirectShow的usb摄像头的接口是什么标准啊(不需要安装驱动)

如题:这种usb设备需要怎样通讯可让windows 自动识别为usb图像设备…

查看全部问答>

求助:关于无法解析的外部符号的错误

大家好:     在我的程序里用了::TrackPopupMenu,程序编译通过了,但连接时又出现如下错误: error LNK2019: 无法解析的外部符号 TrackPopupMenu。     我在.cpp文件中已经#include ,TrackPopupMenu就在winuser.h里,为什 ...…

查看全部问答>

由于快递没到所以团购活动的maple开发板延误了

由于快递没到所以团购的maple开发板延误了预计明天会到…

查看全部问答>

仿真器的问题

我用的是usb仿真器,以前一直好好的,可是昨天拆了一次后,系统突然提示为无法识别的usb设备,因此也无法安装驱动,请问有人遇到这样的问题吗?…

查看全部问答>

死区控制寄存器不起作用?

可能是载波频率过高,示波器扫描时间不足以观察脉冲边沿的变化。 上下桥臂驱动脉冲应该是互补,而且上下沿变化是错开的。…

查看全部问答>

如何让51 记录下很多数据??

具体点是  现在有多个数据过来 比如说 一号灯亮 二号等亮 三号灭 四号灭 这些是不同个信号源发送过来的 这些都是同时发送给51  能不能让51  同时记录下来  记录后打包做好标记 然后不同时刻发送出去 !! ...…

查看全部问答>

FPGA中PLL配置详细说明和使用

FPGA中PLL配置详细说明和使用(Quartus II)…

查看全部问答>