历史上的今天
今天是:2025年04月19日(星期六)
2021年04月19日 | MCU在运行到main()之前都干了什么
2021-04-19 来源:eefocus
很多ARM工程师想当然的以为,自己开发的应用程序,用AK100Pro仿真器下载进入调试,MCU的PC指针必定停留在main()函数的入口。但实际上,在运行到main()前,MCU还做了很多事情。这里以一个LPC1700的Keil工程为例说明。
MCU上电复位后,通常会从一个固定的地址开始启动,比如ARM7复位后的入口地址为0x00000000;或者类似Cortex-M内核从中断向量表中取出入口地址,中断向量表的地址必须是固定的。
LPC1700为Cortex-M3内核,所以启动时会从中断向量表(地址0x00000000)处取出入口地址和堆栈指针,分别加载到PC和SP中。
入口地址处通常放的是芯片相关的启动代码。这部分代码要完成很多芯片初始化的动作,由于与特定型号芯片相关,所以不能随随便便地就用到别的型号芯片上。通常我们会使用官方提供的例程,然后以此为基础进行必要的修改。以下是LPC1700的初始化代码,所有硬件相关的初始化操作放在了SystemInit()函数中。
SystemInit()完成的功能可以有:设置看门狗、外部存储器接口、内核时钟等等。当然,这些代码有些是可以放到后面的main()函数中完成,但有些则必须放在运行到__main之前完成。
芯片初始化完成后,接下来是执行C运行环境的初始化。C环境的初始化主要包含两点:
按照分散加载文件的配置,将相应的数据段和代码段拷贝到相关位置,将ZI段清零。通过这个功能可以将C代码中未指定初始化值的全局变量和静态变量对应的内存清零,然后将指定初始化的全局变量和静态变量对应的内存初始化。另外,如果有通过分散加载文件设置代码存储在Flash中,然后自动搬运到RAM中运行(该功能将在后续文章中细讲),也会在该阶段完成这个自动搬运工作。
之后是初始化C库,完成后才跳转到main()。
以下是LPC1700工程的一段初始化代码,不同的工程配置,反汇编出来的结果略有不同。
所以说,在main()运行前,MCU其实已经做了很多工作了。如果程序下载没有出现问题,但是就是跑不到main(),有可能不是仿真器的问题。是否会是main()之前的初始化操作异常?
-------------------------------
后面继续分享这种小的技术总结。如有不对,欢迎拍砖。想及时获取最新文章的朋友可以加微信:devtools,二维码见下边。
--------
史海拾趣
|
1 GPS 测量简介 全球定位系统(GPS) 是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。该系统从本世纪70 年代初开始设计、研制。GPS 具有全天候提供高精度的连续实时三维导航、定位能力。自1980 年 ...… 查看全部问答> |
|
1.串口联网服务器的定义 串口联网服务器顾名思义就是串口连接到网络的接口转化设备,由于串口一般包括RS-232/485/422,网络协议也指TCP/IP 协议,所以串口联网服务器也可以称为将RS-232/485/422数据形式转化为TCP/IP数据形式或TCP/IP数据形式 ...… 查看全部问答> |
|
c8051f,at89s5x,sst89等51系列单片机仿真器、编程器和学习板 西安杨工 13002928013 email: yang96381@126.com http://c8051fmcu.blog.sohu.com … 查看全部问答> |
|
菜鸟提问-Host controller与root hub关系 大家好,小弟对USB的体系结构方面有些迷惑: USB host controller和USB root hub之间的关系是怎么的.我总感觉好象说的一回事. 请明白人赐教 … 查看全部问答> |
|
各位高人,我现在发现如下问题,百思不得其解,还望高手们解答: 1. wince下直接接ADSL modem, pppoe拨号成功,但就是不能上网,通过抓包发现,所有的报文都发到我网卡设的网关去了,因此去掉我网卡的网关,再拨号,可以上网了.奇怪,在pc上是肯定没有这个问 ...… 查看全部问答> |
|
我在430的复位管脚设置了一个复位按键,如果系统运行过程中复位键被按下,系统就复位,备份数据清除。我想问怎么判断是否有复位键按下呢?是不是如下: while(1) { if(IFG1&BIT4==1) System_reset(); //系统 ...… 查看全部问答> |
|
有人在xilinx SDK环境下弄过ucosII的移植吗??? 小弟现在有一个问题想请教一下,启动一个ucos任务,在该任务中设置断点时,运行到断点就马上报错,死机, 但是当我这个断点去掉后,代码能顺利的运行过刚才设置断点的地方,报错内容如下: Cannot ...… 查看全部问答> |




