您的位置 首页 设计

引证 ARM开发,对entry point的意义

从事了这么久的ARM开发,对entrypoint的含义一知半解,今日再次拿出一本写得还算不错的ARM教材来翻,书中这一段仅仅是把英文手册单纯翻译…

从事了这么久的ARM开发,对entry point的意义一知半解,今天再次拿出一本写得还算不错的ARM教材来翻,书中这一段仅仅是把英文手册单纯翻译成中文,并没有讲到真实的本质。不是ARM公司手册写得不具体,而是大都中文教材的编写选用的办法是: english–华文 mapping,但英文手册是有系列安排的suite,而书本往往翻译自系列中的一篇,简单使得读者井蛙之见。

摘要:ARM link的时分-entry ‘行标号’ 选项用于指定程序的进口地址,其实便是ICE把代码load完之后主动跳入的地址,终究的程序中这个作业是由bootloader来完结的,当然bootloader也能够跳到其他进口地址去。简直一切的制品ARM芯片都有内置的bootloader,因而开发者看到的程序进口点便是entry point。关于FPGA上的ARM体系调试,ARM复位后跳转到一个固化地址,就需要自己写bootloader代码并经过scatter加载到rom中(咱们的EAS片上存储器包含rom在内悉数用FPGA的ram完结,tape out的时分bootloader代码会被固化到chip的rom中)

1.entry point在编译中的指定

看了make file,entry point的指定是在link的时分用命令行参数的办法告知编译器的,

armlink … -Entry reset_handler

假如选用RVDS或ADS,工程特点中有entry point选项可供设置,但终究仍是作为参数传递给armlink。

这样, 在衔接ICE并loadimage之后,ICE会经过JTAG把代码映像搬移到内存中,然后把当时PC指针指向reset_handler,但引出了一个问题:在终究的产品中不存在ICE和JTAG,ARM上电复位后跳向固化的复位地址,如0xFFFF0000,那么由谁来让PC指针指向咱们指定的entry point呢?答案是:由bootloader代码来完结,进一步引出2个问题:1,谁来生成bootloader?2,怎样把bootloader定位到硬件复位地址?

2. 自己写bootloader并经过scatter文件将之定位到硬件复位地址。

或许某些开发工具会主动的为咱们生成bootloader,这儿介绍的是自给自足的办法。

首要介绍bootloader,这儿仅完结中止向跳转:

AREA Vect, CODE, READONLY ;编译器伪指令,scatter依据这些特点来安排程序映像

ENTRY ;这个entry和本文中的entry point是没有关系的,它表明的是汇编程序代码部分的开端

LDR PC, Reset_Addr

LDR PC, Undefined_Addr

LDR PC, SWI_Addr

LDR PC, Prefetch_Addr

LDR PC, Abort_Addr

NOP ; Reserved vector

LDR PC, IRQ_Addr

LDR PC, FIQ_Addr

Reset_Addr DCD Reset_Handler

Undefined_Addr DCD Undefined_Handler

SWI_Addr DCD SWI_Handler

Prefetch_Addr DCD Prefetch_Handler

Abort_Addr DCD Abort_Handler

IRQ_Addr DCD IRQ_Handler

FIQ_Addr DCD FIQ_Handler

Reset_Handler

LDR PC, =0x00000000;

然后是scatter文件:

ROM_LOAD 0x00000000

{

ROM_EXEC 0x00000000

{

* (InRoot$$Sections); 完结搬移scatter的代码,编译器主动生成

*(+RO) ; 除了bootloader的一切代码段放这儿

}

D-TCM 0x00400000 0x003FFFFF

{

* (+RW,+ZI);这儿放一切的RW段(char ch=4;)和ZI段(char ch; ch会被初始化零)。

}

}

ROM2 0xFFFF0000

{

BOOTLOAD 0xFFFF0000

{

bootloader.o(+RO) ;bootloader的程序段放这儿

}

}

scatter也是在link的时分经过参数‘-scatter 文件名’传递的。

3.总结

在以上条件下,比较运用ICE和终究产品中的发动次序:当运用ICE调试时,ICE读入映像文件,找到其间的scatter信息,经过JTAG把代码段和数据段放到指定的方位,然后把PC设为-entry所指定的标号,这便是为什么当咱们loadimage之后看到的是在entry point中指定的行号地点的源代码。当脱离ICE运行时,ARM上电后跳转到硬件复位地址0xFFF0000 (ROM),咱们已事前在那里烧入了咱们的bootloader,bootloder从外设中读入加载映像文件(如片外nand,I2C,UART等)并放入scatter的加载域中(0x00000000),然后跳转到0x000000,因为咱们已在scatter中将InRoot$$Sections定位在那里,所以它被履行,它担任把映像文件从加载域搬移到履行域中,然后跳转到__main,__main是arm编译器主动生成的,它担任清零ZI段和初始化C库,终究__main跳向C代码的进口main()

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/275713.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部