ARM中B __Main和B Main的区别(好文)
2011年04月11日
第一种答案如下: 在软件仿真的情况下,执行“B __main”指令,能使程序跳到C文件的main函数,但用硬件仿真时,还没执行到main函数时就进入了异常中断。
原因是执行“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,则应用程序中所有的全局变量并不会被预期的初始化,而所有的ZI变量也不会被预期的清零;
6、本人在调试LPC2294 LCD模块时才认识到上述第五点(5、)的重要性:程序指令流并没有错,但LCD上显示的全部是乱码。我用两种方法解决了这一bug:
(1)将所有的字库数据定义为const常量,程序运行正确;
(2)将B Main 修改成B __main接着将应用入口改为int main(void) 而非int Main(void),程序也得到正确的执行;
Initializing memory required by C code
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.
Using the main function
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
发表评论
-
Tomcat 6 性能优化 小结
2012-01-20 10:45 792Tomcat 6 性能优化 小结 2 ... -
Memcached安装指南(linux)
2012-01-20 10:45 691Memcached安装指南(linux) 2011年04月2 ... -
.net设计规范(四) 成员设计
2012-01-20 10:45 508.net设计规范(四) 成员设计 2011年04月27日 ... -
使用 OProfile for Linux on POWER 识别性能瓶颈
2012-01-20 10:45 571使用 OProfile for Linux on POWER ... -
并行计算--并发构造纵览
2012-01-20 10:44 687并行计算--并发构造纵览 2010年10月22日 作者简 ... -
记录没见过的词条
2012-01-19 15:46 400记录没见过的词条 2011 ... -
事件管理器――PWM
2012-01-19 15:46 1698事件管理器――PWM 2011 ... -
我的日志
2012-01-19 15:46 502我的日志 2012年01月16日 毋痈“乜ψ不许 ... -
开源工具
2012-01-19 15:46 716开源工具 2011年03月22日 软件集成开发环境(代码 ... -
玫瑰帝国札记
2012-01-17 05:28 1378玫瑰帝国札记 2012年01月13日 要认真的看!知道不 ... -
为流量想破了脑袋吗――提供一个获取流量的简单通用方法
2012-01-17 05:28 655为流量想破了脑袋吗――提供一个获取流量的简单通用方法 201 ... -
2012-1-13
2012-01-17 05:28 5452012-1-13 2012年01月13日 振 1: ... -
2012-1-12
2012-01-17 05:28 6522012-1-12 2012年01月13日 今天去玉 ... -
《大魔术师》:给内地闹剧变个“魔术”
2012-01-17 05:28 686《大魔术师》:给内地闹剧变个“魔术” 2012年01月13日 ... -
浩浩兵马俑
2012-01-16 04:24 733浩浩兵马俑 2011年12月28 ... -
红楼梦》室内空间艺术+古代门窗及家居装饰陈设+陈设和起居及其他。
2012-01-16 04:23 969红楼梦》室内空间艺术+古代门窗及家居装饰陈设+陈设和起居及其他 ... -
中国古人"香"
2012-01-16 04:23 313中国古人"香" 2011年12月29日 ...
相关推荐
详细讲述ARM中B___Main和B_Main的区别。
ARM中B __Main和B Main的区别
It is a UART send char project for STM32F107VC ARM micro-controllers by Dr. Barati.
gcc for arm stm32Xclm.exe file to replace the original installation directory can be, and then set up the project in the MPLAB compiler module for the PRO. pro test, optimize a lot of. Summary: Memory...
_old cs8900 led mmu nand_boot std uart bootl exception_mode mboot nand nand_boot_old ts clock key mem_control nand2 start_main ts_printf
gprs uc_gui 实现的main文件串口发送地图到ARM,LCD 显示地图程序.rar
学习stm32f103启动过程,系统自动调用_main函数后进行一系列初始化操作,其中包括调用一些C库函数,该PDF从ARM官网下载,介绍_main函数调用相关C库函数进行初始化操作。
“..\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3\port.c(412): error: A1586E: Bad operand types (UnDefOT, Constant) for operator (”,最后发现是main.h 中的#include "stm32f1xx_hal.h"的...
code for external interrupts of arm lpc2138
6. 移植“移植成功范例”工程main函数中的“FIR驱动变量定义”,其中testInput_f32_50Hz_200Hz用来存储原始信号,testOutput用来存储经过FIR滤波之后的信号,如果后续修改的话直接把FIR滤波函数中的指针替换成ADC采...
PyCharm中“can’t find ‘main’ module in”问题的解决办法 Python语言,很久就想学习了,可总是下不了决心,现在宅在家,终于是可以学习下了。 一切顺利地下载安装了Python3.7,使用IDLE写了个“Hello World”...
详细介绍了ARM在进入__main()函数后,进入main()函数之前所做的一系列工作
该文件是u-boot分析第一阶段和第二阶段流程图:lowlevel_init和start_armboot,具体分析的文章如下: lowlevel_init:https://blog.csdn.net/zi_yang_/article/details/89182278 start_armboot:...
SimIt-ARM-3.0 给予命令行ARM指令模拟器,短小精悍,是研究ARM处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux操作系统;提供了简单易用的调试命令,可以逐条跟踪指令的执行。 SimIt-...
arm的在线升级程序int main(void) { u16 tmp; Init_All_Periph(); UserProgram = (void (*)()) (0x08004131); for(tmp=0;tmp;tmp++)DATA.u_int[tmp]=(u16)0xFFFF; if(BKP_ReadBackupRegister(BKP_DR1)==(u16)...
在user 组中的main.c 中编写主程序代码;使用系统宏IRQEnable(),使能IRQ 中断。 装载并使能外中断; 选用DebugInExram 生成目标,然后编译连接工程。 选择【Project】->【Debug】,启动AXD 进行JTAG 仿真调试。 ...
适合初学者的模板,直接套用就可以了,稍微修改一下main。c文件就可以使用。和从官网下载的不一样,官网下载的内容太多了。这个是总起来。适用stm32f103系列的
签名下载ELF检测
在reset_handler中的基本设置(适合进行分散加载)之后,使您的代码跳转到__main: B __main 根据您的应用程序执行的操作,您可能不需要__rt_entry完成的所有其他状态限制。 要覆盖ARM库中的__rt_entry,请定义自己...
实现步骤: 1. PyCharm, IDE有个Project setting图标,是给run图标做配置的,...if __name__ == ‘__main__’:main()# ————————————– 3. 复制代码 代码如下:mic@ubt: ~$ ls> make.py myfile.py mic@ubt: