__main,main,__rt_entry,__rt_lib_init

这几天使用ads调试遇到一些问题
1,printf打印不出东西(由于c lib 没有初始化)
2,b __main 异常(应该是初始化堆栈失败,导致arm异常)
zz 以下资料
ARM应用系统开始执行用户应用程式,必须先将应用程式加载到执行域,建立应用程式的执行环境。使用C库时,这些繁琐的工作就大部分由c函数来完成了。汇编程式完成系统初始化后,跳转到C程式的人口_main()(注意:不是main(),当C程式中定义了main()主函数时,编译器就会生成_main代码)。由_main()引导库函数完成C执行环境的初始化,具体过程如下:
◇将非启动代码的RO和RW执行域代码从加载域地址复制到执行域地址;
◇将ZI域清零;
◇跳转到_rt_entry。


调用_main()将大大简化汇编启动代码的编写,汇编代码仅需完成系统硬件的初始化,而没有必要将代码从加载域地址复制到执行域地址,连同ZI域清零等工作。特别是当使用分布式加载时_main()的作用就更加明显了。但是_main()并没有建立C库运行必须的环境,这项工作由_rt_entry()完成,主要调用过程为:
◇调用_rt_stackheap_init()建立堆和栈;
◇调用_rt_lib_init()初始化引用的库函数;假如需要,建立main()函数的参数argc和argv等;
◇调用main()函数,执行应用程式,能够应用库函数;
◇用main()函数的返回值作参数调用exit()。 


_rt_entry并不是C函数,他是用ARM C库编程的起始点。_rt_entry不能用C语言宴现,因为这时候堆栈还没有建立,堆栈由_ rt_stackheap_init()来建立。
------------------------------------------------------------------------------------------------------------------------------
在ADS1.2中__main()作为c语言的入口函数,它主要做了以下工作:
1.把RO,RW从他们的加载域复制到他们的运行域中去(可以用在LINKER中设置RO=,RW=,来确定,也可以用scatter文件来定义)
2.初始化ZI域
3.跳到__rt_entry.
而库函数__rt_entry()会完成以下工作:
1.调用__rt_stackheap_init()设置stack和heap
2.调用__rt_lib_init()初始化相应的库函数,
3.调用main(),即是我们自己的应用程序了
4.调用exit()来处理main()函数的返回值
从上面我们可以看到__main()运行时库主要是初始化一些东西,然后跳到用户的main()中去,所以我们不用__main()函数初始化运行环境的时候,要自己编写相应的代码来完成相应的内容
--------------------------------------------------------------------------------------------------------------------------------
__rt_lib_init
   在ADS1.2的环境中,如果在C入口没有调用编译器的链接库(__main),那么在C程序一开始要调用该函数以初始化运行时的函数库,以保证对ADS提供的某些库函数能够正常调用。从这个函数开始,我们已经在C语言环境下了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值