系统是如何进入main函数开始执行的_IAR小课堂| 如何系统启动流程及修改方法?...

在IAR环境中,程序从__iar_program_start开始执行,经过CPU复位、栈指针初始化、可能调用__low_level_init函数进行硬件初始化。接着,初始化C/C++运行环境,包括静态和全局变量、构造静态C++对象,最后调用main函数。用户可通过提供定制的_low_level_init程序来修改系统启动流程。
摘要由CSDN通过智能技术生成
36c72311a7555294d5e00c2ad0a0879b.gif

默认情况下,直接进入调试状态后程序将停在main函数的开头位置,但其实在进入main函数之前,IAR已经进行了一个系统初始化的过程。本文将介绍在IAR环境中,系统启动流程中将执行哪些步骤,主要包含硬件初始化和软件运行环境初始化两个部分的工作。

系统硬件初始化

对于硬件初始化,执行步骤流程如下:

9438b9cacd3c24b91fdd3fffb1c0e68d.png

CPU复位时,会从系统启动程序代码cstartup中的__iar_program_start函数入口处开始执行

    ●  初始化栈指针为栈CSTACK存储块的末尾地址

    ●  对于ARM 7/9/11、Cortex A、Cortex R内核设备,将另外的堆栈指针初始化为对应存储空间的尾地址处

    ●  如果用户定义了__low_level_init函数,那么该函数会被系统调用。这也为用户定制系统启动流程提供了方法。

C/C++ 程序运行环境初始化

对于软件运行环境,初始化步骤如下:

c429a713e27ba82ea50c9ebd3daaf879.png

    ●  初始化静态和全局变量。以0作为初始值的变量内容会被清除,以非0值为初始值的变量内容会从ROM拷贝到RAM中。如果在硬件初始化过程中,上文提到的_low_level_init函数的返回值为0,那么将忽略这些静态和全局变量的初始化工作。
    ●  构造静态C++对象
    ●  调用用户的main函数,启动应用程序

到上述的第三步才正式跳转到用户撰写的main函数中。在此之前已经完成了硬件和软件运行环境的初始化。

修改系统启动流程

在某些情况下,用户可能需要修改默认的系统启动流程。例如,应用程序可能需要初始化内存映射特殊功能寄存器SFRs的内容,或省略掉cstartup代码中默认的数据初始化部分。此时可以由用户提供一个定制版本的_low_level_init程序。

对于Cortex M内核,系统启动代码是保存在arm\src\lib文件夹下的cstartup_M.s和low_level_init.c这两个文件。对于其他的ARM内核,系统启动代码文件则是同文件夹下的cstartup.s和low_level_init.c文件。

为避免默认提供的启动文件被修改,用户可将默认的low_level_init.c文件复制添加到自己的工程中后,再进行修改,避免其他工程受到修改的影响。

注意在low_level_init.c文件中的源码不能使用静态初始化变量,因为此时变量初始化的动作尚未执行。

70d592f04d275bc00f87b8d8387b8ced.png

产品咨询:

北京:010-62975900

上海:021-62127690

  深圳:0755-82977971

4a3823f3cded220a20dc98c91c86df44.gif

分享、在看与点赞,至少我要拥有一个吧

be6d0d55b241a09e54735541f22a239f.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值