当一切的体系初始化作业完结之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简略的一种状况是:
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。