历史上的今天
返回首页

历史上的今天

今天是:2025年01月16日(星期四)

正在发生

2020年01月16日 | Arm中main()和_main()的区别

2020-01-16 来源:eefocus

    当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是:
    IMPORT main
    B main
    直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。
 
    在ARM ADS环境中,还另外提供了一套系统级的呼叫机制。
    IMPORT __main
    B __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。

推荐阅读

史海拾趣

General Semiconductor ( Vishay )公司的发展小趣事

1997年,Vishay正式进入分立半导体领域,收购了Lite-On Power Semiconductor公司65%的股份。这一举措标志着Vishay在半导体技术上的重大突破。随后,在1998年,Vishay又收购了TEMIC的半导体业务部分,包括特洛芬肯(Telefunken)和硅尼克斯(Siliconix)两家公司的大部分股份。这些收购为Vishay带来了先进的晶体管、二极管、光电子装置等半导体技术,进一步巩固了其在半导体领域的地位。

Custom Mmic Design Services Inc公司的发展小趣事

CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。

Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

随着国内市场的饱和,AE&ST公司开始将目光投向全球。公司积极寻找国际合作伙伴,拓展海外市场。在一次国际电子展上,AE&ST与一家欧洲知名电子公司达成了战略合作协议。双方共同研发了一款针对欧洲市场的特色产品,并成功打开了欧洲市场的大门。此后,AE&ST公司不断深化与国际伙伴的合作,逐步实现了全球化布局。

顺芯(Everest-semi)公司的发展小趣事

为了进一步提升公司的国际竞争力,顺芯公司积极开展国际合作与全球布局。公司与国际知名半导体厂商建立了战略合作关系,共同研发新产品、开拓新市场。同时,顺芯公司还在海外设立了研发中心和销售中心,以便更好地服务全球客户。这些举措使顺芯公司的全球市场份额逐年提升,成为了国际半导体行业的重要力量。

骏晔科技(DreamLNK)公司的发展小趣事

骏晔科技在无线通讯模块领域一直寻求创新。2019年,公司与硬之城达成战略合作,推出了高性能的FSK双向收发模块。这款模块采用了最新的FSK调制技术,极大地提高了数据传输的稳定性和效率。通过这一创新,骏晔科技在物联网设备通讯领域取得了显著的市场份额增长。

Hpc Technology Inc公司的发展小趣事

骏晔科技非常重视知识产权的积累与保护。公司拥有一支专业的研发团队,致力于新产品的研发和技术创新。同时,公司还积极申请专利和软件著作权,保护自身的技术成果。截至目前,骏晔科技已经拥有8个专利信息和12个软件著作权,这些知识产权的拥有,为公司的发展提供了强有力的支撑。

问答坊 | AI 解惑

ORCAD 10.5 pspice AD734仿真中出现问题

用orcad 10.5 pspice 仿真 用AD734实现除法功能的时候,在AD734的10 和13管脚出现如下问题: ERROR: [NET0075] Unconnected pin, no FLOAT property or FLOAT = e U8 pin \'DD\' ERROR: [NET0075] Unconnected pin, no FLOAT property or F ...…

查看全部问答>

现在的gps是否有实时路况的导航系统

他能否在我输入目的地后结合对当时路况分析为我选出最合适的行车路线 …

查看全部问答>

应用程序如何调用 控制面板中的存储器管理 程序???

在EVC下,应用程序如何调用 控制面板中的存储器管理 程序??? 比如我们需要调用系统自带的cplmain.cpl的\"电源管理\",只要在开始菜单的运行中输入:\"ctlpnl.exe \\windows\\cplmain.cpl,5\". 但是“存储器管理”是在STGUI目录下的,应该如何调 ...…

查看全部问答>

串口通讯校验和问题(100分)

  格式:      ESC+ID+COMMAND+DATA+CHECKSUM+END(ASCII 码传送)   说明:         名称         内容     长度( ...…

查看全部问答>

今天是10月11日了!几时开始派发学习板啊?

  盯了好久了,可是一点眉目都没有,一个字急啊!…

查看全部问答>

请问版主主,外设库3.3.0版本有BUG吗?

听别人说的,研讨会上说这个版本有BUG,用SWD调试时会卡在SystemInit()函数中,要在编译器的linker选项下重新设置库的入口。 怎样设置? 如果用jtag是不是就没这个问题了?…

查看全部问答>

限制垃圾的方法:“负分审核法”

有时候,看到很多垃圾帖,看着一个一个地在增加,真的干着急啊。 如果采用评分法,这样对于没有删帖权力的人,只要给他评个负分,再利用网站这个限制办法,会不会使之发不了帖呢?…

查看全部问答>

L298N奇怪的现象

现在有一个12V铅蓄电池,充满电12.3V左右,我用这个给L298N供电,但是给输入逻辑0之后,输出3.3V左右的电平,高倒是能到12V左右,这个是什么情况,用的是淘宝上买的模块,而且L298N也没有发热的现象 …

查看全部问答>

Cyclone V FPGA系列简介

Cyclone V FPGA系列简介 Altera的Cyclone® V FPGA实现了业界最低的系统成本和功耗,其性能水平满足了您突出大批量应用优势的需求。从三种型号中进行选择:只提供逻辑的Cyclone V E FPGA具有3.125-Gbps收发器的Cyclone V GX FPGA具有5G收发器 ...…

查看全部问答>