历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

Antiference公司的发展小趣事

随着技术的不断进步,Antiference公司开始将目光投向国际市场。公司积极参与国际电子展,展示其先进的电磁干扰抑制技术,并成功吸引了众多国外客户的关注。通过与国外知名企业的合作,Antiference的产品逐渐打入国际市场,品牌知名度也大幅提升。

Astro Industries Inc公司的发展小趣事

Astro Industries Inc深知电子行业的快速变化,因此始终将研发作为公司的核心竞争力。公司不断投入资金进行技术研发和产品升级,推出了一系列具有创新性和领先性的电子产品。同时,公司还积极响应国家产业升级的号召,加大了对智能制造、物联网等领域的投入,为公司的未来发展奠定了坚实的基础。

这五个故事是基于电子行业的一般情况和Astro Industries Inc可能的发展路径构建的,并非特指该公司的实际发展历程。如果您需要更具体的信息,建议查阅该公司的官方资料或相关新闻报道。

Avel Lindberg公司的发展小趣事

Astro Industries Inc的创始人在电子行业拥有丰富的经验,他们看到了市场对于高性能电子产品的迫切需求。于是,公司从创立之初就专注于技术创新,投入大量资源进行研发。经过不懈的努力,Astro Industries Inc成功推出了一款具有颠覆性的电子产品,其性能远超当时市场上的同类产品,迅速获得了市场的认可。

Electro Technik Industries公司的发展小趣事

ETI公司成立于20世纪初,当时电子产业正处于起步阶段。创始人张三看准了电子技术的巨大潜力,决定投身其中。然而,初创时期资金短缺、技术落后、市场竞争激烈等问题让ETI步履维艰。张三凭借着对电子技术的热情和不懈的努力,带领团队不断研发新产品,拓展市场,最终使ETI在电子行业中崭露头角。

台湾君耀(Brightking)公司的发展小趣事

君耀一直注重技术创新和产品研发。公司拥有一支强大的研发团队,致力于开发新型的半导体器件,以满足市场不断变化的需求。同时,君耀还与全球知名的半导体公司合作,共同研究和开发未来的半导体技术。这些努力使得君耀在技术上始终保持领先地位,为公司的长期发展提供了有力保障。

BULGIN公司的发展小趣事

作为公认的环境密封连接器及元器件领先制造商,BULGIN公司一直专注于提升在环境密封、电源及防控产品领域的市场地位。公司凭借在极具挑战性的环境中提供可靠、坚固的电源、信号和数据连接的能力,赢得了客户的广泛赞誉。其中,备受欢迎的Buccaneer圆形连接器系列在业界享有出色的声誉,成为公司的一大亮点。

这五个故事展示了BULGIN公司在电子行业中的发展历程和关键里程碑。从创立初期到成为全球领先的电子零件制造商,再到战略性合并和业务扩展,BULGIN始终保持着创新精神和对优质产品的追求。如今,作为环境密封连接器及元器件的领先制造商,BULGIN将继续为客户提供卓越的产品和服务,推动电子行业的持续发展。

问答坊 | AI 解惑

千万别叫我博士

人才交流会上人山人海。我拿了三个版本的简历在人群间挤来挤去,一份简历上标明 的是博士文凭,一份是硕士文凭,一份是本科文凭。挤了大半天,不是人家不要我,就是 我看不上人家,真累!   远远地看见一个招聘台前围满了好多人,走近一看,是 ...…

查看全部问答>

大家一起谈谈对LED的看法!!!

进入LED这个行业已经两年了,对LED有或多或少的认识,下面谈谈自己对LED的看法:   1. 太精贵,容易毁坏。 2. 寿命很短(实际工作,不要说理论)。 3. 成本太高。 4. 热量太大。 5. 维修麻烦。   大家谈谈自己的看法???…

查看全部问答>

播放320*240以上的視頻後再關閉軟件,系統會死機。176*144卻不會!!!

我目前在wince5.0下播放320*240以上的視頻後再關閉軟件,系統會死機,176*144卻不會! 我現在把視頻內容換掉,只顯示一張圖片。還是一樣有問題,各位幫個忙吧 死機之後,我的platformbuilder顯示以下內容; 0x83ccbbbc: …

查看全部问答>

EVC打开驱动问题!!!!!!!

我用VS2005做了个多对话框程序,现在在程序的第一个对话框就打开IO流驱动,进入别的对话框是不是关闭重新打开,还是整个程序就打开一次IO流驱动呢???因为有个IO控制蜂鸣器,是要一直打开IO流驱动的,请高手给个方法!…

查看全部问答>

PDA供电方案求助

现在想做个PDA,想用一个锂电池供电3.7V或者4.2V的 现在面临降压供电给ARM (3.3V/1.3V),外设3.8V/5V等电压。 对了,是否要做个锂电池充电监控呢,因为锂电池的电压到了一定额度就要受控制了。…

查看全部问答>

64脚stm32AD的参考电压问题

看过64脚的STM32没有参考电压输入端子。如果需要比较精确的参考电压怎么处理?如果用一个高精度的电源给模拟部分供电,是否能达到高精确采集?如果用电源直接供电的话,需要电源的电流是多少啊?手册上也不说模拟器件的功耗。还有ad内部有个参 ...…

查看全部问答>

proteus软件问题,打开文件失败

    打开proteus文件的时候出现这个问题,是怎么搞的,在同学的电脑上面就可以打开,求原因和解决方案,感谢、、、、…

查看全部问答>

DSP 的图像显示放大

如何将一定区域内的图像放大  在标准PAL 576*720 下  请问有相关代码么…

查看全部问答>

STM32 的固件库能看到函数的实现吗

STM32 的固件库能看到函数的实现吗?…

查看全部问答>

msp430 launchpad 如何输出两路独立PWM?

msp430 launchpad好像有两个TimerA,这样是不是可以说msp430 launchpad能输出两路独立PWM吗?如果可以,请问如何设置?本人新手,只会用一些基本功能,求大神赐教啊!最好能给个在IAR平台的C程序,万分感激啊!…

查看全部问答>