历史上的今天
返回首页

历史上的今天

今天是:2025年02月06日(星期四)

正在发生

2021年02月06日 | STM32 启动代码 __main 与用户主程序 main() 的区别

2021-02-06 来源:eefocus

1、__main 作用

__main函数是C/C++运行时库的一个函数,嵌入式系统在进入应用主程序之前必须有一个初始化的过程,使用__main标号引导系统时必须将应用程序的入口定义为main()。
    
在初始化的过程中,__main函数的作用主要有两点:


1) 完成对映像文件的初始化操作

a、映像文件

链接器把多个目标文件链接成一个映像文件。

b、加载地址和执行地址

映像文件可以有两种地址:加载地址和执行地址。

加载地址是映像文件在存储器中的存储地址;执行地址就是映像文件运行时的地址。

c、加载域和执行域

文件加载的存储区叫加载域,文件运行的存储区叫执行域。

d、从加载地址到执行地址


在结构比较简单的系统中,加载地址就是执行地址;

而在复杂系统中,程序运行前,常常会把映像文件的一部分或全部从存储区域移出去,此时执行地址就不再是加载地址。


知道以上几个概念,__main函数对映像文件的初始操作就不难理解了。


对于加载地址和执行地址不同的映像文件,__main函数会把加载地址的代码和数据复制到执行地址中,并且对被链接器指定为需要初始化为0的段,进行清零操作。


2) 调用__rt_entry函数,进入用户程序。

__rt_entry函数的运行流程如图:

 2、进入主程序

当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。


最简单的一种情况是:

IMPORT mainB main

直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。


在ARM ADS环境中,还另外提供了一套系统级的呼叫机制。

IMPORT __mainB __main

__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()。


所以说,前者是库函数,后者就是我们自己编写的main()主函数;

因此我们用的B __main其实是执行库函数,然后该库函数再调用我们的main() 函数,因此在单步调试时会看到先要跑一段程序(其实是库函数),然后再单步到我们自己的main函数(这个同时也说明如果有B __main 则就对应必须有main函数,否则编译出错);

如果我们用 B main来进入我们的主函数的话,那在单步调试时就看到直接进入到我们自己的main函数了,中间不会看到其他程序;

那么用B __main和用B main 这两这进入我们的main函数方式有什么不同呢?

如果采用前者则会由编译器加入一段"段拷贝"程序,即我们说的从加载域到执行域转化程序;而采用后者就没有这个了;

因此如果要进行 "段拷贝"只能自己动手编写程序来实现了,完成段拷贝后就可以进入我们的主函数了,当然这个主函数不一定是叫做main(),可以起个其他好听的名字,这个有别于使用B __main方式;不管采用哪种方式进入我们的程序,都要有一段"段拷贝"程序,跑完了段拷贝后才能可以进入我们主程序了。


startup.s 这个文件并没有所谓的"段拷贝"功能。


对含有启动程序来说,"执行地址与加载地址相同"不容易实现:

如果执行地址与加载地址相同哪当然不需要做"段拷贝",但是个人理解编译器还会加入"段拷贝"程序(如果用B __main 的话),只是因为条件不满足而不执行而已;但是对含有启动程序来说,"执行地址与加载地址相同"就不容易了.因为启动程序是要烧到非易失存储器里,用来在上电执行的,而这个程序必定会有RW段,如果RW放在非易失存储器,如FLASH,那就不好实现RW功能了,因此要给RW移动到能够实现RW功能的存储器,如SRAM等.因此,对含有启动程序来说,"执行地址与加载地址相同"就不容易实现;程序的入口点在C 库中的__main 处,在该点,库代码执行以下操作:

1)将非零(只读和读写)运行区域从其载入地址复制到运行地址。

2)清零ZI 区域。

3)跳转到__rt_entry。

 

 

refer:

https://www.cnblogs.com/dwj411024/p/7679345.html


推荐阅读

史海拾趣

Cantec Electronic Co Ltd公司的发展小趣事

Cantec Electronic Co Ltd一直注重企业文化的建设。公司倡导“创新、协作、务实、高效”的企业精神,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供广阔的发展空间和良好的职业晋升通道。这种积极向上的企业文化吸引了大量优秀人才的加入,为公司的快速发展提供了强大的人才支撑。

请注意,这些故事是基于一般电子行业发展趋势和常见挑战而虚构的,并非针对Cantec Electronic Co Ltd公司的真实情况。如果您需要了解该公司的发展故事,建议您查阅相关资料或联系公司进行咨询。

艾吉芯(Agertech)公司的发展小趣事

在追求经济效益的同时,艾吉芯公司也积极履行社会责任。公司注重环境保护和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,艾吉芯还积极参与社会公益事业,为社会的和谐发展贡献自己的力量。

这些故事虽然基于推测和构建,但尽可能地反映了电子行业中企业发展的普遍规律和趋势。艾吉芯公司作为电子行业的一员,其发展历程也必然离不开这些方面的努力和探索。当然,具体的发展故事还需要根据艾吉芯公司的实际情况进行深入了解和研究。

Components Corporation公司的发展小趣事

在追求经济效益的同时,艾吉芯公司也积极履行社会责任。公司注重环境保护和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,艾吉芯还积极参与社会公益事业,为社会的和谐发展贡献自己的力量。

这些故事虽然基于推测和构建,但尽可能地反映了电子行业中企业发展的普遍规律和趋势。艾吉芯公司作为电子行业的一员,其发展历程也必然离不开这些方面的努力和探索。当然,具体的发展故事还需要根据艾吉芯公司的实际情况进行深入了解和研究。

Compex Corporation公司的发展小趣事

在电子行业的发展过程中,Compex Corporation也积极寻求与其他企业的合作与收购机会。XXXX年,公司成功收购了一家在电子元件领域具有丰富经验的企业,通过这次收购,公司获得了更多的技术资源和市场份额。此外,公司还与其他企业建立了战略合作关系,共同开发新产品和技术,实现了资源的有效整合。

EFINIX公司的发展小趣事

为了加速Quantum™可编程加速器技术的商业化进程,EFINIX公司与中芯国际集成电路制造有限公司展开合作。中芯国际是世界领先的集成电路晶圆代工企业之一,其先进的制造能力为EFINIX公司提供了强有力的支持。双方合作仅用了不到六个月的时间,就成功交付了首批Quantum™可编程加速器产品样本,创造了行业内的里程碑。

GE Oil & Gas Digital Solutions公司的发展小趣事
使用高精度的电阻和电容元件可以减少元件误差对测量结果的影响。

问答坊 | AI 解惑

[原创]公司批发零售纸尿裤,好奇,妈咪宝贝,帮宝适,奶粉等

公司批发零售奶粉:澳美多 澳优 宝乐康 葆婴 贝因美 赐多利 多美滋 恩贝儿 飞鹤 华惠氏 慧聪 康维多 林贝儿 美可高特 美素 美赞臣 蒙牛 明治 亲亲宝贝 雀巢 三鹿 三元 森永 圣元 施恩 适宝康 完达山 味全 雅培 雅士利 伊利 优素 奶瓶 优幼 纸尿裤,好 ...…

查看全部问答>

招贤:美新半导体应用(方案)工程师-够才你就来!

要求: a.本科或以上,电子相关专业;b.3年电子实际开发经验,有一定的硬件设计经验,了解EMC/EMI和相关测试;c.熟悉MCU应用和C语言, 了解Matlab等算法模型工具和操作系统优先;d.了解汽车电子系统,有其开发经验优先;e.工作认真负责,勇于承担责任, ...…

查看全部问答>

定时器问题

定时器为什么不中断了  各位哥哥哥姐这个程序第一次启动,定时器可以正常运行,以后再启动,主程序可以正常运行但定时器就是不中断了,小弟初学单片机,实在是找不出原因了。   ORG 0000H   LJMP START   MORG 000BH   LJMP TIMER1 ...…

查看全部问答>

透明的索尼笔记本电脑

这款VAIO概念笔记本电脑采用了触摸的设计,无论是键盘还是鼠标都是是通过触摸进行操作。而且它的屏幕设计也非常个性。 打开机器时,跟普通屏幕一样可以显示图像,而当机器被关闭时,屏幕则变成了像玻璃一样的全透明状。如此精致的笔记本拿在手里, ...…

查看全部问答>

发现有人做运放专题,配合学习,大家把坛子里运放的资料的顶起吧

赶快,人多力量大,学习要趁热打铁。 我们把运放的资料都顶起,作为运放专题来学习一下。 我觉得这样效果会很不错的!…

查看全部问答>

放大电路设计

我单位工业炉有台火焰探测器,探测器检测出的电流信号为0--50uA,现在想把这个信号引导PLC里面去,再做到人机画面上去,PLC和WINCC的我会做,但遇到了以下问题:PLC采集的为4--20mA信号,请问如何做个放大电路把0--50UA的信号转换成0--24MA信号呢? ...…

查看全部问答>

6410的spi驱动问题

驱动已经写好了,但现在的问题是一使用命令启动芯片,就会从6410的spi接受寄存器中读出全1,用示波器量后,是没有时钟输出,硬件工程师说是时钟没有启动,可我在打印设置SPI时钟的寄存器时看到是有值的,这是什么问题呢。是硬件还是软件的问题呢?…

查看全部问答>

Wince 5.0 真機調試問題

    我在用真是還進調試的時候,程序中打了斷點,可是斷點不其作用。後來用其他同事的電腦調試卻可以。應該是我vs還進的問題吧,請高人指點,如何解決這個問題。…

查看全部问答>

请高手帮忙解决 windows xp 启动时出现MOM.EXE 加载错误

请高手帮忙解决 windows xp 启动时出现MOM.EXE 加载错误…

查看全部问答>

基于DSP的无速度传感器矢量控制系统中感应电机参数自检

基于DSP的无速度传感器矢量控制系统中感应电机参数自检…

查看全部问答>