问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

IAR启动流程深度解析

创作时间:
作者:
@小白创作中心

IAR启动流程深度解析

引用
CSDN
1.
https://blog.csdn.net/djkeyzx/article/details/140501140

本文深入探讨了IAR编译器在ARM Cortex-M内核芯片上的启动流程,特别是__iar_program_start函数的作用和实现细节。通过反汇编和查阅IAR开发手册,揭示了IAR启动代码的内部机制,并探讨了是否可以绕过__iar_program_start进行程序入口的自定义。内容深入且技术性强,适合嵌入式系统开发人员阅读。

1. IAR启动流程概述

ARM Cortex-M内核芯片的启动代码通常会提供针对Arm、GCC、IAR等编译器的模板。其中,IAR的模板往往让人感到困惑。以STM32F7xx的startup.s为例,其reset_Handler非常简单,仅包含系统初始化和跳转操作:

Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0  

从上述汇编代码可以看出,reset_Handler最终会跳转至__iar_program_start。通过查阅IAR工程配置选项,可以发现如果使能某个选项,应用程序就会从这个标签开始执行。因此,__iar_program_start的主要作用是在运行应用代码前完成必要的初始化工作。

根据IAR开发手册的描述,在IAR工程下,硬件初始化通常由cstartup.s完成。通过对工程进行反汇编,可以发现__iar_program_start中包含多个标签,例如__cmain、__low_level_init等。这些标签的具体定义路径如下:

  • __iar_program_start(仅针对ARM-M):IAR Systems\Embedded Workbench 9.2\arm\src\lib\thumb\cstartup_M.s
  • __cmain:路径同上
  • __low_level_init:IAR Systems\Embedded Workbench 9.2\arm\src\lib\runtime
  • __iar_data_init3:IAR Systems\Embedded Workbench 9.2\arm\src\lib\init

整体逻辑如下图所示:

在low_level_init.c中可以完成一些基础的初始化工作,例如看门狗的设置、中断等级的设置。在反汇编出来的代码中,是否调用__iar_data_init3取决于__low_level_init的返回值。如果返回值为0,则直接跳转至_call_main;如果返回值为1,则继续跳转至__iar_data_init3。

2. 可以不用__iar_program_start吗

答案是肯定的,可以通过指令--entry来改变程序入口的符号,或者在工程设置中直接修改Entry symbol。但是,这样做意味着没有使用IAR自带的初始化,需要手动完成变量的copy赋值。

对于变量的初始值非0的情况,需要在ICF linker文件中进行如下定义:

define block MY_DATA { section .data, section MY_SECTION };
define block MY_DATA_INIT { section .data_init, section MY_SECTION_init };
initialize manually { section .data, section MY_SECTION };

对于变量的初始值为0的情况,则需要使用do not initialize,并手动编写代码将ROM中的Initializer bytes拷贝到对应的RAM区域。

3. 小结

如果不使用__iar_program_start,可能会遇到编译错误。为了解决这个问题,可以在启动代码中定义一个符号。但是,这可能意味着工程配置中还存在其他问题,需要进一步检查和优化。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号