历史上的今天
今天是:2025年01月18日(星期六)
2020年01月18日 | ARM中B __Main和B Main的区别
2020-01-18 来源:eefocus
第一种答案如下: 在软件仿真的情况下,执行“[b]B __main[/b]”指令,能使程序跳到[b]C[/b]文件的[b]main[/b]函数,但用硬件仿真时,还没执行到[b]main[/b]函数时就进入了异常中断。
原因是执行“B __main”指令后,程序先跳到__main库函数的入口,再进行一些初始化操作,最后再跳入用户的main函数。但在初始化过程中,由于堆栈或其它原因造成程序出错。有两种方法可以解决这个问题。第一:将“B __main”指令直接改成“B main”,使程序不进行初始化而直接跳入用户的main()函数。第二:合理初始化堆栈。由于考虑到刚接触ARM和将问题简单化,我选择了第一种方法。
第二种答案如下:
IMPORT __main
.... ....
BL TargetResetInit
B __main
1、此后流程将跳转到ADS提供的启动代码__main函数处,负责完成库函数的初始化及相关功能,并最终引导处理器入口用户代码main()函数,其代码流程为:
嵌入式系统在进入应用主程序之前必须有一个初始化的过程,该过程完成系统的启动和初始化功能,初始化过程可以分成两部分来看:
√ _main负责设置运行映像存储器映射;
√ _rt_entry负责库函数的初始化。
_main完成代码和数据的复制,并把ZI数据区清零,这一步当代码和数据区在存储和运行时处于不同的存储器位置时有意义。接着_main跳进_rt_entry,进行STACK和HEAP等的初始化。最后_rt_entry跳进应用程序的入口main()。当应用程序执行完时,_rt_entry又将控制权交还给C库函数,函数main()在ADS中有特殊的意义。当一个程序工程项目中存在main()时,连接器会把_main和_rt_entry中的初始化代码连接进来;如果没有main()函数,初始化过程就不会被连接,初始化过程中一些标准的C库函数失效。而用户应用程序初始化过程并未显式的完成这些堆栈初始化及数据拷贝操作,应用程序将启动不成功。
2、__main()为编译系统提供的一个库函数,使用__main标号引导系统时必须将应用程序的入口数定义为main();
3、若希望系统进入应用程序前自动完成系统调用(如库函数的初始化、RW、ZI数据从Flash到RAM的拷贝(加载映像--->执行映像)等)的初始化过程,必须使用__main标号以跳至ADS提供的初始化函数库,这种情况一般需做一些库函数移植及重定向问题解决;这一点上,应用程序入口必须以main函数标识;
4、若所有的初始化步骤都已显式的完成(如堆栈初始化、加载映像到执行映像RW、ZI数据的拷贝等),应用程序入口函数XXXX()可以任意定义(非main,这样可以避免自动链接上__main,从而跳过__main),初始化完成后直接B XXXX即可,这一点上,main()函数并不具有特殊性;
5、若必须的初始化步骤都未显示的完成,一意孤行的B XXXX,程序运行的结果将不可预料。一个典型的例子是:若用户并未显示完成加载映像--->执行映像的数据初始化而直接B XXXX,[b]则应用程序中所有的全局变量并不会被预期的初始化,而所有的ZI变量也不会被预期的清零[/b];
6、本人在调试LPC2294 LCD模块时才认识到上述第五点(5、)的重要性:程序指令流并没有错,但LCD上显示的全部是乱码。我用两种方法解决了这一bug:
(1)将所有的字库数据定义为const常量,程序运行正确;
(2)将B Main 修改成B __main接着将应用入口改为int main(void) 而非int Main(void),程序也得到正确的执行;
[b]Initializing memory required by C code[/b]
The initial values for any initialized variables (RW) must be copied from ROM to RAM.
All other ZI variables must be initialized to zero. The library initialization code called
at __main performs the copying and initialization.
[b]Using the main function[/b]
When the compiler compiles a function called main(), it generates a reference to the
symbol __main to force the linker to include the basic C run-time system from the ANSI
C library. (The symbol __main is marked as an entry point.)
建议和我一样的初学者还是乖乖的B __main接着将应用入口设置为main()函数的好。
本文摘自:http://hi.baidu.com/%F2%DF%F2%D1%B7%C9%B9%FD%BC%D0%D6%F1%CC%D2/blog/item/69692c2ea28b55321f3089c2.html
上一篇:ARM启动代码的分析
下一篇:ARM 启动代码笔记
史海拾趣
|
进入LED这个行业已经两年了,对LED有或多或少的认识,下面谈谈自己对LED的看法: 1. 太精贵,容易毁坏。 2. 寿命很短(实际工作,不要说理论)。 3. 成本太高。 4. 热量太大。 5. 维修麻烦。 大家谈谈自己的看法???… 查看全部问答> |
|
播放320*240以上的視頻後再關閉軟件,系統會死機。176*144卻不會!!! 我目前在wince5.0下播放320*240以上的視頻後再關閉軟件,系統會死機,176*144卻不會! 我現在把視頻內容換掉,只顯示一張圖片。還是一樣有問題,各位幫個忙吧 死機之後,我的platformbuilder顯示以下內容; 0x83ccbbbc: … 查看全部问答> |
|
我用VS2005做了个多对话框程序,现在在程序的第一个对话框就打开IO流驱动,进入别的对话框是不是关闭重新打开,还是整个程序就打开一次IO流驱动呢???因为有个IO控制蜂鸣器,是要一直打开IO流驱动的,请高手给个方法!… 查看全部问答> |
|
看过64脚的STM32没有参考电压输入端子。如果需要比较精确的参考电压怎么处理?如果用一个高精度的电源给模拟部分供电,是否能达到高精确采集?如果用电源直接供电的话,需要电源的电流是多少啊?手册上也不说模拟器件的功耗。还有ad内部有个参 ...… 查看全部问答> |
|
msp430 launchpad好像有两个TimerA,这样是不是可以说msp430 launchpad能输出两路独立PWM吗?如果可以,请问如何设置?本人新手,只会用一些基本功能,求大神赐教啊!最好能给个在IAR平台的C程序,万分感激啊!… 查看全部问答> |




