__iar_program_start在哪里定义/main之前做了什么

在IAR环境下stm32的汇编启动引导代码中有如下内容

这是一个IAR内部定义的函数,基本是一些为运行C语言准备运行环境的初始化的操作。

总之,IAR在启动main()函数以前,

①首先执行了Reset_Handler

②调用SystemInit()(ST库提供)进行对单片机的时钟,Flash读取初始化,

③并转入__iar_program_start中执行__low_level_init与__iar_data_init2,并在__iar_data_init2中,先后调用__iar_zero_init2与__iar_copy_init2对全局变量、全局已初始化变量进行相应的初始化操作。

④最后调用main()函数执行。

************************************************************************************************************************************

可查看官方文档查看__iar_program_start的作用,打开IAR->help->C/C++ Development Guide。

想看具体代码方法如下:

这个__iar_program_start一般定义在在cstartup的文件中,具体是哪个文件需要查看.map文件,如下我们找到了这个文件名(还有一些文件名是工程中没有出现的,那就是IAR的库提供的比如zero_init3.o,low_level_init.o,这些文件一般在IAR安装目录内搜的到)。

  .text              ro code   0x800'1560     0xc  cstartup_M.o [3]

IAR额外使用的文件
  .text              ro code   0x800'0d80    0xa6  ABImemcpy.o [3]
  .text              ro code   0x800'0e26    0x3a  zero_init3.o [3]
  .text              ro code   0x800'143c    0x2c  copy_init3.o [3]
  .text              ro code   0x800'1468    0x28  data_init.o [3]
  .text              ro code   0x800'14f8    0x1e  cmain.o [3]
  .text              ro code   0x800'1516     0x4  low_level_init.o [2]
  .text              ro code   0x800'151a     0x4  exit.o [2]
  .text              ro code   0x800'1520     0xa  cexit.o [3]
  .text              ro code   0x800'152c    0x14  exit.o [4]
  .text              ro code   0x800'1560     0xc  cstartup_M.o [3]




搜索一下这个文件,有两个,一个汇编一个C文件。

通过查看map文件发现这些函数都是通过.a的静态库文件提供的

dl7M_tlf.a: [2]
    exit.o                        4
    low_level_init.o              4
    -------------------------------------------------
    Total:                        8

rt7M_tl.a: [3]
    ABImemcpy.o                 166
    cexit.o                      10
    cmain.o                      30
    copy_init3.o                 44
    cstartup_M.o                 12
    data_init.o                  40
    zero_init3.o                 58
    -------------------------------------------------
    Total:                      360

shb_l.a: [4]
    exit.o                       20
    -------------------------------------------------
    Total:                       20

尝试对其进行反汇编,暂时没找到反汇编的方法。

那换一种方式,直接反汇编生成的工程文件,反汇编工具D:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\binielfdumparm.exe可反汇编elf格式文件, hex、bin文件不是elf是不行的,在Exe文件夹有一个.out文件,这个可以被反汇编。

在windows terminal使用如下命令进行反汇编

 cd D:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin
.\ielfdumparm.exe -a --source D:\TestIAR\pro.out -o  D:\TestIAR\bin.s

得到的汇编文件非常大,行数有23000+。重新编译了一个简单的工程尽量减小代码量,再进行反汇编。减小到了5200行。

由于太简单没有一些RAM的初始化等操作,再修改一下加上了初始化的数组、初始为0的数组、未初始的数组。

(因为Cortex-M3内部使用了指令流水线,读取PC内容时返回的值是当前指令的地址+4。如要与PC进行计算需要注意这一点)

突然想起来IAR仿真时会显示反汇编,查看通用寄存器功能,使用仿真调试器,实时查看数值更方便。

以下是执行顺序

__iar_program_start

?main  →  __low_level_init  →    __iar_data_init3 →   __iar_zero_init3→  __iar_copy_init3:(这些函数初始化了定义了变量的内存,不需要太关心)

_call_main:

main(你写的程序)

 

***********************************************************************************

搜索《在main()之前,IAR都做了啥》这个写的比较详细。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值