历史上的今天
返回首页

历史上的今天

今天是: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,二维码见下边。




--------


推荐阅读

史海拾趣

Compact公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场洗牌。面对这些挑战,Compact公司积极调整战略,加大研发投入,以适应市场变化。同时,公司还通过优化生产流程、降低成本等方式提高竞争力。在行业变革中,Compact公司不仅成功应对了挑战,还抓住了机遇,实现了跨越式发展。

Advantech公司的发展小趣事

在快速发展的过程中,Compact公司始终注重品牌建设和文化传承。公司通过不断提升产品质量和服务水平,树立了良好的品牌形象。同时,公司还注重培养员工的归属感和忠诚度,形成了独特的企业文化。这种文化传承不仅为公司的发展提供了强大的精神动力,还使公司在激烈的市场竞争中保持了独特的竞争力。

Dell公司的发展小趣事

在快速发展的过程中,Compact公司始终注重品牌建设和文化传承。公司通过不断提升产品质量和服务水平,树立了良好的品牌形象。同时,公司还注重培养员工的归属感和忠诚度,形成了独特的企业文化。这种文化传承不仅为公司的发展提供了强大的精神动力,还使公司在激烈的市场竞争中保持了独特的竞争力。

Belden Wire and Cable公司的发展小趣事

1902年,Joseph C. Belden在美国伊利诺伊州芝加哥创立了Belden公司。在创立初期,公司主要生产电线和电缆产品,并逐渐在行业内崭露头角。1905年,经过大量的实验和研究,Belden公司成功研发出“Beldenamel”绝缘材料,这种灵活的搪瓷绝缘材料极大地提升了线缆的性能和可靠性,为公司的早期发展奠定了坚实的基础。

Britool Expert公司的发展小趣事

1902年,Joseph C. Belden在美国伊利诺伊州芝加哥创立了Belden公司。在创立初期,公司主要生产电线和电缆产品,并逐渐在行业内崭露头角。1905年,经过大量的实验和研究,Belden公司成功研发出“Beldenamel”绝缘材料,这种灵活的搪瓷绝缘材料极大地提升了线缆的性能和可靠性,为公司的早期发展奠定了坚实的基础。

Hitron公司的发展小趣事

为了满足不断增长的市场需求,1928年,Belden在印第安纳州里士满开设了一家专为制造电线而设计的新工厂。这家工厂的建立极大地提升了公司的产能和效率,为公司的进一步发展提供了有力保障。在随后的几十年里,随着第二次世界大战的爆发和战后经济的复苏,里士满工厂经历了多次扩建和升级,逐渐成为百通最大的制造工厂之一。

问答坊 | AI 解惑

GPS在公路测量中的应用

 1 GPS 测量简介   全球定位系统(GPS) 是美国国防部主要为满足军事部门对海上、陆地和空中设施进行高精度导航和定位的要求而建立的。该系统从本世纪70 年代初开始设计、研制。GPS 具有全天候提供高精度的连续实时三维导航、定位能力。自1980 年 ...…

查看全部问答>

介绍一种串口设备联网的解决方法

1.串口联网服务器的定义   串口联网服务器顾名思义就是串口连接到网络的接口转化设备,由于串口一般包括RS-232/485/422,网络协议也指TCP/IP 协议,所以串口联网服务器也可以称为将RS-232/485/422数据形式转化为TCP/IP数据形式或TCP/IP数据形式 ...…

查看全部问答>

6410,wince软件开发项目合作

基于S3C6410的WINCE 6.0 R3软件开发. 最好在顺德,需要与硬件调试.…

查看全部问答>

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之间的关系是怎么的.我总感觉好象说的一回事. 请明白人赐教 …

查看全部问答>

请教:wince下pppoe和网关冲突?

各位高人,我现在发现如下问题,百思不得其解,还望高手们解答: 1. wince下直接接ADSL modem, pppoe拨号成功,但就是不能上网,通过抓包发现,所有的报文都发到我网卡设的网关去了,因此去掉我网卡的网关,再拨号,可以上网了.奇怪,在pc上是肯定没有这个问 ...…

查看全部问答>

bmp图像问题

//文件信息头如下: LPBITMAPINFO        pbmi = NULL; memset(&pbmi->bmiHeader, 0, sizeof(BITMAPINFOHEADER));         pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER) ;     &nbs ...…

查看全部问答>

求问手动复位,谢谢大侠们!

我在430的复位管脚设置了一个复位按键,如果系统运行过程中复位键被按下,系统就复位,备份数据清除。我想问怎么判断是否有复位键按下呢?是不是如下: while(1) { if(IFG1&BIT4==1) System_reset(); //系统 ...…

查看全部问答>

xilinx SDK环境下ucosII的移植吗

有人在xilinx SDK环境下弄过ucosII的移植吗??? 小弟现在有一个问题想请教一下,启动一个ucos任务,在该任务中设置断点时,运行到断点就马上报错,死机, 但是当我这个断点去掉后,代码能顺利的运行过刚才设置断点的地方,报错内容如下: Cannot ...…

查看全部问答>

求1788开发板资料

求1788开发板资料。滕华的、周立功的都行。哪位大侠给俺发一下啊wzpstudy@126.com…

查看全部问答>