您的位置 首页 IOT

__main() 和 main()

__main()和main()(转载)因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__

__main() 和 main()(转载)

由于咱们通常在BOOTLOADER中都已做好了比较详尽的初始化作业,包含代码的转移,所以咱们最好别再调用库函数__main(),由于__main()作为ADS集成好的库函数,会对体系进行初始化设置,或许会与咱们的初始化发生冲突,故在咱们做好初始化后最好别调用__main()。仿真时若调了__main()且没设置entry会报正告,__main()库函数代码不太了解,估量跟ADS初始化有关,库函数__main()要慎用。

当一切的体系初始化作业完结之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简略的一种状况是:
IMPORTmain
Bmain
直接从发动代码跳转到应用程序的主函数进口,当然主函数姓名可以由用户随意界说。
在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。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/257343.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部