基于IAR Embedded Workbench的MCU初始化过程

很多嵌入式软件工程师会好奇程序是怎么从MCU复位跑到main()函数的?存储在RAM的全局和静态变量的初始值是如何设置好的?要回答这些问题,就需要弄懂MCU的初始化过程。

本文主要基于IAR Embedded Workbench介绍MCU的初始化过程。虽然是基于IAR Embedded Workbench,但是大部分内容都是通用的。

MCU初始化过程指的是从MCU复位到main()函数之前的过程。一般来说,MCU初始化过程包括如下几个阶段:

1. 硬件初始化

硬件初始化指的是硬件必须先准备好(比如初始化Stack Pointer, 初始化外部的存储器等),用于准备软件C/C++初始化。

2. 软件C/C++初始化

软件C/C++初始化的主要工作是在main()函数之前初始化C/C++中存储在RAM的全局和静态变量的初始值。正常来说,在链接的时候,代码和常量会被放置在ROM中,而全局和静态变量会被放置在RAM中,由于RAM数据掉电后会丢失(volatile),存储在RAM的全局和静态变量在main()函数之前必须初始化。

下面是对应MCU初始化过程的示意图:

1. 当MCU复位之后,PC指针会指向对应的复位向量,然后运行对应的启动代码(startup code),进行硬件初始化(比如初始化Stack pointer指向指定Stack区域的末尾)

2. 初始化初始值为0的存储在RAM中的全局和静态静态变量(比如 int i = 0;):

3. 初始化初始值为非0的存储在RAM中的全局和静态静态变量(比如 int i = 1;),初始值是从相应的ROM拷贝到对应的RAM:

4. 最后,调用main()函数:

本文主要介绍了基于IAR Embedded Workbench的MCU初始化过程。一般来说,嵌入式软件工程师不需要对MCU初始化的代码进行修改,因为工具在链接的时候,会自动调用相关的库函数完成MCU初始化需要的操作。但是了解MCU的初始化过程对于掌握MCU,软件以及整个系统工作是非常有帮助的。

注:本文没有介绍具体的代码实现,因为觉得代码讲起来会比较空,嵌入式软件工程一个需要实践的工程(纸上得来终觉浅,绝知此事要躬行)。建议大家自己动手去调试看看MCU的初始化过程,对理解MCU的初始化过程是非常有帮助的。下面是几点关于在IAR Embedded Workbench上调试MCU初始化过程的经验分享:

1. 默认情况下,MCU初始化代码是工具在链接的时候自动调用相关库函数实现的。如果有特别需要,用户可以将相关的库函数文件拷贝到工程目录,然后再进行相关修改(因为链接的时候,会优先使用用户添加的文件,然后才是库函数)。MCU初始化代码位于安装目录\src\lib\arm, \src\lib\thumb,\src\lib\runtime和\src\lib\init。(注:不添加相关文件到工程目录下面也是可以在反汇编(Disassembly)窗口进行调试的。)

2. Debugger选项里面不要勾选 Run to, 这样复位之后PC会指向复位向量(而不是main),然后就可以单步调试MCU初始化过程了:

3. Linker选项里面List,勾选Generate linker map file选项和Generate log file里面Initialization decisions的选项:

这样在生成的map文件里面会有INIT TABLE字段显示初始化使用的函数:如下图所示,__iar_zero_init3用于初始化初始值为0的全局和静态变量,__iar_copy_init3用于初始化初始值为非0的全局和静态变量。

参考文献:

1. IAR C/C++ Development Guide: Compiling and Linking (The initialization phase)

2. Embedded Basics – Understanding the Microcontroller Boot Process | Beningo Embedded Group

3. Michael Barr, Anthony Massa Programming Embedded Systems, Second Edition (Initialize the Hardware)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
註冊機分為三部分,分別為PartA,PartB,PartC 此註冊機支持的軟件如下:(2012年08月8日最新版) PartA: IAR Embedded Workbench For MSC-51 v8.10 (終版,下一個版本授權方式更改,暫時無法破解) IAR Embedded Workbench For Atmel AVR v6.12 IAR Embedded Workbench For Atmel AVR32 v4.10 IAR Embedded Workbench For ARM v6.40 IAR Embedded Workbench For Renesas M16C and R8C v3.50 IAR Embedded Workbench For NEC 78K v4.71 IAR Embedded Workbench For MSP430 v5.50 IAR Embedded Workbench For Samsung SAM8 v3.20 PartB: IAR Embedded Workbench For Dallas Semiconductor/Maxim MAXQ v2.40 IAR Embedded Workbench For NEC V850 v3.80 (終版,下一個版本授權更改,暫時無法破解) IAR Embedded Workbench For Renesas M32C v3.30 IAR Embedded Workbench For CR16C v3.10 IAR Embedded Workbench For Renesas R32C v1.31 IAR Embedded Workbench For Microchip PIC18 v3.10A IAR Embedded Workbench For Microchip dsPIC v1.40A IAR Embedded Workbench For Renesas RX v2.30 (終版,下一個版本授權方式更改,暫時無法破解) PartC: IAR Embedded Workbench For ColdFire v1.23 IAR Embedded Workbench For HCS12 v3.20 IAR Embedded Workbench For HCS08 v1.20 IAR Embedded Workbench For STM8 v1.30 IAR Embedded Workbench For Renesas SuperH v2.20 IAR Embedded Workbench For Renesas H8 v2.30 IAR Embedded Workbench For Renesas RL78 v1.10 (終版,下一個版本授權方式更改,暫時無法破解) 【說明】1、當註冊機運行於vista或者WIN7的系統下時,請右鍵點擊然後使用管理員模式運行,或者將系統的UAC功能關閉後運行。 2、此註冊機針對的是IAR官網上下載的EV版(評估板),至於從其他渠道獲得的CD版或者FULL版的軟件,沒有測試。 3、本註冊機僅限測試和學習IAR系列軟件之用,請勿用於商業用途。請勿在網絡上隨意傳播。 ----------------------------------http://www.ourjcdz.com--------------------------------------------------- ----------------------------------http://hzjcdz.taobao.com---------------------------------------------------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值