彻底倒塌了~~~keil的CARM编译器好象不能设置生成相对跳转代码

[复制链接]
 楼主| computer00 发表于 2007-4-11 10:33 | 显示全部楼层 |阅读模式
最近在弄44B0,要通过串口下载程序到FLASH中,需要擦除flash。所以要先把代码复制到RAM中运行,<br />这样就需要产生相对跳转的代码,不然一跳转就到FLASH里面去,死翘翘了。虽然CARM有__ram,<br />但是弄起来太麻烦了。在选项里面找了半天,也没找到在哪设置?晕菜了.....<br /><br /><br /><br />看来是该换换口味~~~换用RealView来搞了………………
ayb_ice 发表于 2007-4-11 10:55 | 显示全部楼层

原来是不会用啊...

  
djyos 发表于 2007-4-11 11:59 | 显示全部楼层

哈哈,遇到同道了

我用gcc做44b0,效果还可以,也是要copy代码到ram中.<br />这种用法中,你要的应该是长跳转吧,b和bl只能跳32M,而44b0的sdram区与flash(cs0)区距离不止32M哟,如果你用c语言拷贝代码,那应该用函数指针,编译器会处理的.<br />keil不是可以用gcc编译吗?<br />
 楼主| computer00 发表于 2007-4-11 16:17 | 显示全部楼层

回ayb_ice:是不会用,不然我也不会来这里发帖了

请问ayb_ice该如何在CARM里面设置,才让它生成的代码不是绝对地址跳转的指令呢?<br /><br /><br />回djyos:GCC我电脑上没装,也更加不熟悉,所以就不打算用它了。用realview算了。<br />我的问题不是长跳转的问题,而是用C写代码,让编译器产生代码的时候,不要产生使用绝对<br />地址的指令。这样我复制到RAM里面再去运行,跳转到绝对地址就错了。长跳转的话,可以通过<br />PC=PC+offset的办法来实现,这个编译器应该可以搞定的。<br />
djyos 发表于 2007-4-11 16:45 | 显示全部楼层

那不叫相对跳转,叫位置无关.

这样执行效率会低不少的.因为不但代码位置无关,而且变亮也要位置无关,所有全局变亮都要使用基址+变址方式寻址.<br /><br />难道你不能把代码copy到固定的地址去吗?这样就可以不使用&quot;位置无关&quot;技术了.把你copy的目标地址作为函数指针调用就可以了,这个目标地址你总是知道的.<br /><br />我的做法是:<br />用C语言写一个load_program,函数,返回main函数指针.再调用这个指针.注意main函数的地址不一定就是copy的目标地址,要使main函数是目标地址,就只有改连接配置文件了,但这好像没什么意义.
 楼主| computer00 发表于 2007-4-11 17:20 | 显示全部楼层

我的全局变量要固定地址,否则就乱套了。

局部变量是压在栈里面的,这个我不用担心。<br /><br /><br />代码是可以复制到固定的RAM地址,并且我也知道如何去调用。<br /><br />问题是,如果在这个函数中(总之是在RAM里运行的程序了),有一个跳转指令是绝对地址跳转,<br />它就会跳到原来的FLASH地址中去,这样就错了。必须要地址无关的跳转才可以。我就是在<br />CARM里找不到如何设置,但在RealView里是有可以选的,代码和变量无关都可以选。<br /><br /><br />不知道CARM是不是默认就是产生相对跳转的指令,昨天弄了一阵,开始是在它的启动<br />代码里又回到了FLASH,那个是因为keil提供的启动代码使用的是LDR&nbsp;PC,xx的方式,<br />我将其修改了,然后继续往下运行,到RAM初始化时,又跳到FLASH里面去了,这里<br />的代码我就没办法控制了,因为是编译器自动产生的。我不清楚之后的代码是否还<br />会有绝对地址跳转?去找相关设置,找不到。只好考虑换成RealView来搞了。hotpower大叔<br />早就建议我换了,趁这个机会,赶紧换了~~~~~~~
djyos 发表于 2007-4-11 17:56 | 显示全部楼层

看我的做法

//以下是由编译链接器定义的常数,gcc下可以通过链接脚本得到.<br />//carm应该也有类似的常数吧,没用过,不了解.<br />//调用load_program函数后,就可以直接执行该函数的返回值了.<br />extern&nbsp;ucpu_t&nbsp;text_load_start[];<br />extern&nbsp;ucpu_t&nbsp;text_run_start[];<br />extern&nbsp;ucpu_t&nbsp;text_run_limit[];<br />extern&nbsp;ucpu_t&nbsp;rodata_load_start[];<br />extern&nbsp;ucpu_t&nbsp;rodata_run_start[];<br />extern&nbsp;ucpu_t&nbsp;rodata_run_limit[];<br />extern&nbsp;ucpu_t&nbsp;rw_load_start[];<br />extern&nbsp;ucpu_t&nbsp;rw_run_start[];<br />extern&nbsp;ucpu_t&nbsp;rw_run_limit[];<br />extern&nbsp;ucpu_t&nbsp;zi_start[];<br />extern&nbsp;ucpu_t&nbsp;zi_limit[];<br /><br />void&nbsp;main(void);<br /><br />void&nbsp;(*load_program(void))(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8_t&nbsp;*src,*des;<br />&nbsp;&nbsp;&nbsp;&nbsp;//在44b0x中,初始化段无需拷贝<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(text_run_start&nbsp;!=&nbsp;text_load_start)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//拷贝代码段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(src=text_load_start,des=text_run_start;des&lttext_run_limit;src++,des++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*des=*src;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(rodata_run_start&nbsp;!=&nbsp;rodata_load_start)&nbsp;&nbsp;&nbsp;//拷贝只读数据段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(src=rodata_load_start,des=rodata_run_start;des&ltrodata_run_limit;src++,des++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*des=*src;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(rw_run_start&nbsp;!=&nbsp;rw_load_start)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//拷贝初始化数据段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(src=rw_load_start,des=rw_run_start;des&ltrw_run_limit;src++,des++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*des=*src;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(src=zi_start;src&ltzi_limit;src++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*src=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;main;<br />}<br />
 楼主| computer00 发表于 2007-4-11 23:22 | 显示全部楼层

晕菜了~~~看来你还是没理解我要表达的

复制这个过程我已经完成了,并且去RAM里面运行了,但是在RAM里面运行一些指令后,它又自己跑到FLASH里面去运行了,因为有绝对跳转的指令。<br /><br /><br />例如FLASH地址从0开始,RAM地址从0x0C000000开始,那么我把FLASH的内容复制到0x0C000000开始处,<br />并跳转到0x0C000000开始运行,运行一些指令后,遇到了一个绝对跳转指令,假设它要跳转到地址0x30,<br />那么这个地址是在FLASH中的,然后程序又回到FLASH中去了,并没有继续在RAM中运行。我现在就<br />是要它不要生成这样的指令,而用相对跳转.因为我要把程序搬到RAM中,然后擦除FLASH,这个过程<br />程序不能继续去FLASH里面去取指令了,否则肯定乱套.
high 发表于 2007-4-12 00:07 | 显示全部楼层

相当于ads1.2里面的ropi, rwpi。

//position&nbsp;impendence<br />position&nbsp;imdependence<br /><br />木有用过keil&nbsp;for&nbsp;arm.&nbsp;查查看编译器手册.应该会支持吧,不然,application中动态加载程序就没法实现了?<br /><br />---<br />我们写完一个程序for&nbsp;os&nbsp;with&nbsp;file&nbsp;system,事先也不可能知道会被加载到什么地址.所以编译器应该支持的,我想.<br />---<br />或者是通过mmu等的地址映射,使得总是加载到地址0.这也是可能的,windows的每个进程就总以为自己占有0~4g地址空间.
hotpower 发表于 2007-4-12 01:06 | 显示全部楼层

我没搞过此活动,估计应该实现

关键以前在FLASH生成的函数必须是相对寻址的.绝对寻址可能要跳回FLASH.<br />再者中断向量表也要重定位即映射到RAM去.<br /><br />我不太喜欢在RAM中运行,DSP时是这样玩的.
iC921 发表于 2007-4-12 01:11 | 显示全部楼层

难得00发自己的问题

  
 楼主| computer00 发表于 2007-4-12 01:15 | 显示全部楼层

谢谢大家的讨论,晚上又试了一下,OK了,

不用去哪里设置,默认生成的代码应该就是Read-Only&nbsp;Position&nbsp;Independent的,<br />以前跳到FLASH中运行,是因为keil自动生成启动代码里面有绝对跳转的指令,并且<br />我没有修改到它.&nbsp;现在改成相对跳转的指令,就OK了。把所有的代码复制到RAM中,<br />然后跳转过去运行,再也没有回到FLASH中去了~~~~~~~高兴~~~~~接下来就是做这个<br />FLASH的编程程序了,找到几份关于这个的源代码,拿来修修改改应该就可以了,<br />哈哈~~~~~~原来是错怪CARM了.........
 楼主| computer00 发表于 2007-4-12 01:50 | 显示全部楼层

这回是彻底倒塌了......结果还是有些地方跑到flash里去了....

还以为搞定了,晕死.........<br /><br /><br />0x0C3042D4&nbsp;&nbsp;E1A03004&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,R4<br />0x0C3042D8&nbsp;&nbsp;E3A0000C&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,#0x0000000C<br />0x0C3042DC&nbsp;&nbsp;E0030390&nbsp;&nbsp;MUL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,R0,R3<br />0x0C3042E0&nbsp;&nbsp;E59F0028&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,[PC,#0x0028]<br />0x0C3042E4&nbsp;&nbsp;E7902003&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,[R0,R3]<br />0x0C3042E8&nbsp;&nbsp;E1A00002&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,R2<br />0x0C3042EC&nbsp;&nbsp;E3500000&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,#0x00000000<br />0x0C3042F0&nbsp;&nbsp;0A000003&nbsp;&nbsp;BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0C304304<br />0x0C3042F4&nbsp;&nbsp;E59D0000&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,[R13]<br />0x0C3042F8&nbsp;&nbsp;E28D1004&nbsp;&nbsp;ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,R13,#0x00000004<br />0x0C3042FC&nbsp;&nbsp;E1A0E00F&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R14,PC<br />0x0C304300&nbsp;&nbsp;E12FFF12&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2<br /><br />本来运行在RAM好好的,就是这个BX&nbsp;R2(这里R2=0x000039d4了,是FLASH中的地址),<br />一跳就跳到FLASH里去了,晕菜,不知道如何控制它好......不搞了,倒塌,睡觉去........<br />
hotpower 发表于 2007-4-12 01:54 | 显示全部楼层

应该有编译选项吧.

  
djyos 发表于 2007-4-12 09:06 | 显示全部楼层

注意看清楚了

&nbsp;&nbsp;&nbsp;&nbsp;下面的常数中,load表示存放代码的起始地址,limit表示存放代码的结束地址,run表示运行地址.<br />&nbsp;&nbsp;&nbsp;&nbsp;初始化代码则run和load地址相同且在flash里面,无须拷贝,load_program代码就在初始化段里面,所以可以在flash中运行.<br />&nbsp;&nbsp;&nbsp;&nbsp;其他代码的load地址在flash中,run地址在ram中,所以只能在ram中运行的,如果把它放在flash中,反而不能运行了,因为代码里面用的也是绝对跳转地址.<br />&nbsp;&nbsp;&nbsp;&nbsp;这些常数中,你还可以看到,zi段只有run地址而没有load地址.<br />&nbsp;&nbsp;&nbsp;&nbsp;在ads中,是可以用scat文件完成这些功能的,而且,连接定位是开发系统的基本功能,keil也应该有这种功能吧,没用过,说说而已,错了不要砸砖.<br />&nbsp;&nbsp;&nbsp;&nbsp;你这个问题当时我也是花了很多时间去解决,只是我是先看到了这个问题的存在,动手写程序之前先解决了,而不是等出了问题再抓狂.<br />&nbsp;&nbsp;&nbsp;&nbsp;其实&quot;位置无关&quot;只是在动态加载中才会用到,这时运行地址是用malloc得到的,编译时不知道运行地址,只能编译成&quot;位置无关&quot;的,但嵌入式开发中不多见.<br />extern&nbsp;ucpu_t&nbsp;text_load_start[];<br />extern&nbsp;ucpu_t&nbsp;text_run_start[];<br />extern&nbsp;ucpu_t&nbsp;text_run_limit[];<br />extern&nbsp;ucpu_t&nbsp;rodata_load_start[];<br />extern&nbsp;ucpu_t&nbsp;rodata_run_start[];<br />extern&nbsp;ucpu_t&nbsp;rodata_run_limit[];<br />extern&nbsp;ucpu_t&nbsp;rw_load_start[];<br />extern&nbsp;ucpu_t&nbsp;rw_run_start[];<br />extern&nbsp;ucpu_t&nbsp;rw_run_limit[];<br />extern&nbsp;ucpu_t&nbsp;zi_start[];<br />extern&nbsp;ucpu_t&nbsp;zi_limit[];<br />
 楼主| computer00 发表于 2007-4-12 10:43 | 显示全部楼层

晕了~~~还是不明白djyos所说的方法.

我不能把代码区间设置到RAM区间,因为这样就没办法下载到FLASH里面去.设置在FLASH区间,<br />生成的跳转指令又是跳到FLASH中去,复制到RAM里去运行就不行了。所以我需要地址无关的<br />代码.但是我在KEIL&nbsp;CARM中找不到它在哪儿设置,帮助手册看了,都没提到.我的是keil&nbsp;UV3&nbsp;2.5A版,<br />不知道新版本是否有这些选项?&nbsp;还是先换用RealView试试吧.如果那个再不行,那我只能给<br />每个需要用到的函数加上__ram了......并且还不能调用库函数(例如整数除法,浮点运算等),<br />因为里面有这些运算的话,__ram并不负责搬运代码,而是简单的调用FLASH里面的内容......
djyos 发表于 2007-4-12 11:09 | 显示全部楼层

我的程序确实是下载到flash中运行的

过程:<br />1.编译连接后产生一个bin文件,<br />2.下载到flash.<br />3.复位板子<br />4.从flash开始运行,执行初始化代码<br />5.copy大部分代码(除初始化和load_program本身以外的代码)到sdram中.copy的代码包括了所有库函数.<br />6.执行main函数,即load_program返回的指针,此时已经在sdram中了.<br /><br />是不是跟你的需求一样?
 楼主| computer00 发表于 2007-4-12 13:16 | 显示全部楼层

基本上差不多,只是我的不是一上电就copy,而是由我通过串口

也许我们的编译器不同,你的编译器产生的代码是相对跳转的,所以在跳转的时候不会跳到绝对地址,<br />因而一直在RAM里面运行,不会再回到FLASH去.<br /><br />但是我这个编译出来的结果有绝对跳转的指令,所以到RAM里面去运行遇到绝对地址跳转时,就回<br />跳回到FLASH中.<br /><br />例如一个函数,由于代码是写在FLASH中的,假设它的地址是0x200,当前PC是在0x100处,<br />这两个地址都是在FLASH中.现在要调用这个函数,编译器生成了一条绝对跳转指令,<br />jump&nbsp;0x200,OK,这个指令是没问题的,运行正常.<br /><br />&nbsp;&nbsp;&nbsp;然后我把代码复制到RAM中,又运行到了这里,而这时的PC值已经变为0xC000100了,<br />而这个函数的地址也就变成0xC000200了.但是里面的代码还是一个绝对地址跳转指令,<br />它要jump到0x200处,这样就又回到FLASH去了.我要编译器帮我生成一个基于PC跳转的<br />指令,跳转到0xC000200处才正确。而我现在不知道如何去告诉编译器,产生这样的代码.
djyos 发表于 2007-4-12 13:29 | 显示全部楼层

不是这样的

&nbsp;&nbsp;&nbsp;&nbsp;我的代码也是绝对跳转的,它只能copy到0xc000000,别的地址是不行的。我前面的帖子里已经说过,真正使用相对跳转的“位置无关”代码只有在动态加载到用malloc创建的内存中运行才需要。<br />&nbsp;&nbsp;&nbsp;&nbsp;至于用串口命令,这个不是问题,只要在load_program函数中加入接收串口命令的代码就可以了。<br />&nbsp;&nbsp;&nbsp;&nbsp;莫非你要求代码既要能在flash中运行,又要可以在ram中运行?收到命令前在flash中运行,同一份代码,收到命令后copy到ram中运行?要是这样,可就只有用“位置无关”了。可这样有什么实际意义吗?
mybao 发表于 2007-4-12 13:31 | 显示全部楼层

难得圈圈问问题,我也顶一个

ModeMask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x1F<br />SVC32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x13<br />IRQ32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x12<br />FIQ32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x11<br />User32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x10<br />Abort32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x17<br />Undef32Mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x1B<br />IRQ_BIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x80<br />FIQ_BIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;0x40<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;GBLS&nbsp;&nbsp;&nbsp;&nbsp;MainEntry<br />MainEntry&nbsp;&nbsp;&nbsp;&nbsp;SETS&nbsp;&nbsp;&nbsp;&nbsp;&quot;main&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;$MainEntry<br />;******************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;AREA&nbsp;&nbsp;&nbsp;&nbsp;SelfBoot,&nbsp;&nbsp;&nbsp;&nbsp;CODE,&nbsp;&nbsp;&nbsp;&nbsp;READONLY<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;UDF_INS_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;SWI_SVC_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;INS_ABT_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;DAT_ABT_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;IRQ_SVC_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;FIQ_SVC_VECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ENTRY&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;:DEF:&nbsp;|ads$version|<br />&nbsp;&nbsp;&nbsp;&nbsp;ELSE<br />&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;__main<br />__main<br />&nbsp;&nbsp;&nbsp;&nbsp;ENDIF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />ResetEntry<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;SYS_RST_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;UDF_INS_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;SWI_SVC_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;INS_ABT_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;DAT_ABT_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;IRQ_SVC_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;FIQ_SVC_HANDLER<br /><br />;******************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;MACRO&nbsp;&nbsp;&nbsp;&nbsp;<br />$Label&nbsp;&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;&nbsp;$Vector<br />$Label<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;lr,&nbsp;#4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;lr}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=$Vector<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;pc}^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MEND<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />UDF_INS_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;lr}<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=UDF_INS_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;pc<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;pc}^<br />SWI_SVC_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;lr}<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=SWI_SVC_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;pc<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;pc}^<br />INS_ABT_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;lr,&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;lr}<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=INS_ABT_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;pc<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;pc}^<br />DAT_ABT_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;lr,&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;lr}<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=DAT_ABT_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;pc<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r3,&nbsp;pc}^<br />IRQ_SVC_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;lr,&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r12,&nbsp;lr}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;spsr<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0}<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=IRQ_SVC_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;[r0]&nbsp;&nbsp;&nbsp;&nbsp;<br />FIQ_SVC_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;lr,&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0-r12,&nbsp;lr}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;spsr<br />&nbsp;&nbsp;&nbsp;&nbsp;stmfd&nbsp;&nbsp;&nbsp;&nbsp;sp!,&nbsp;{r0}<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=IRQ_SVC_VECTOR<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;[r0]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />;*******************************************************<br />SYS_RST_HANDLER<br />&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;cpsr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;enter&nbsp;svc&nbsp;mode&nbsp;and&nbsp;disable&nbsp;irq,fiq<br />&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#ModeMask<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#(SVC32Mode&nbsp;:OR:&nbsp;IRQ_BIT&nbsp;:OR:&nbsp;FIQ_BIT)<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;cpsr_c,&nbsp;r0<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;InitSystem<br />&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;InitSystem&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;ResetEntry<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;&nbsp;&nbsp;BaseOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;r1<br />&nbsp;&nbsp;&nbsp;&nbsp;ldreq&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;TopOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;InitRamData<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;&nbsp;&nbsp;=CopyProcBeg<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r2,&nbsp;r1<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;&nbsp;&nbsp;&nbsp;=CopyProcEnd&nbsp;&nbsp;&nbsp;&nbsp;<br />0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;&nbsp;&nbsp;&nbsp;r0!,&nbsp;{r4-r7}<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;&nbsp;&nbsp;&nbsp;r2!,&nbsp;{r4-r7}<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;TopOfROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;=CopyProcBeg<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />;***********************************************<br />CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;<br />0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;&nbsp;&nbsp;&nbsp;r0!,&nbsp;{r4-r11}<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;&nbsp;&nbsp;&nbsp;r2!,&nbsp;{r4-r11}<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;&nbsp;&nbsp;&nbsp;<br />CopyProcEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />InitRamData&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;BaseOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;BaseOfZero&nbsp;&nbsp;&nbsp;&nbsp;<br />0<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;ldrcc&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r0],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;strcc&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;[r2],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;&nbsp;&nbsp;&nbsp;EndOfBSS<br />1&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;&nbsp;&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;strcc&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[r2],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;&nbsp;&nbsp;&nbsp;GotoMain&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />GotoMain&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;$MainEntry<br /><br />;***********************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RO$$Base|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;ROM&nbsp;code&nbsp;start&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RO$$Limit|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;RAM&nbsp;data&nbsp;starts&nbsp;after&nbsp;ROM&nbsp;program<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RW$$Base|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Pre-initialised&nbsp;variables<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Base|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;uninitialised&nbsp;variables<br />&nbsp;&nbsp;&nbsp;&nbsp;IMPORT&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Limit|&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;End&nbsp;of&nbsp;variable&nbsp;RAM&nbsp;space<br /><br /><br />BaseOfROM&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RO$$Base|<br />TopOfROM&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RO$$Limit|<br />BaseOfBSS&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;|Image$$RW$$Base|<br />BaseOfZero&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Base|<br />EndOfBSS&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;|Image$$ZI$$Limit|<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;GetBaseOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;GetEndOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;GetBaseOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;GetBaseOfZero<br />&nbsp;&nbsp;&nbsp;&nbsp;EXPORT&nbsp;&nbsp;&nbsp;&nbsp;GetEndOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />GetBaseOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;BaseOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;lr&nbsp;&nbsp;&nbsp;&nbsp;<br />GetEndOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;TopOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;&nbsp;&nbsp;&nbsp;lr<br />GetBaseOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;BaseOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;&nbsp;&nbsp;&nbsp;lr<br />GetBaseOfZero<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;BaseOfZero<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;&nbsp;&nbsp;&nbsp;lr<br />GetEndOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;EndOfBSS<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;&nbsp;&nbsp;&nbsp;lr<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />;***********************************************&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />直接把工程所有的空间都设置到RAM区,生成的BIN文件烧FLASH就可以。<br />CopyProcBeg&nbsp;&nbsp;&nbsp;&nbsp;<br />0&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;&nbsp;&nbsp;&nbsp;r0!,&nbsp;{r4-r11}<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;&nbsp;&nbsp;&nbsp;r2!,&nbsp;{r4-r11}<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;r3<br />&nbsp;&nbsp;&nbsp;&nbsp;bcc&nbsp;&nbsp;&nbsp;&nbsp;%B0&nbsp;&nbsp;&nbsp;&nbsp;<br />CopyProcEnd<br /><br />上面这段负责从FLASH搬移代码<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;ResetEntry<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;&nbsp;&nbsp;BaseOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;r1<br />&nbsp;&nbsp;&nbsp;&nbsp;ldreq&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;TopOfROM<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;InitRamData<br />上面这段,简单的说,就是判断代码从FLASH执行还是从RAM执行。<br /><br />Image$$RO$$Base&nbsp;这些是ADS连接器预定意的,KEIL也有吧,<br />有了这段启动代码,存储器空间怎么设置都为所谓。<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

247

主题

14712

帖子

212

粉丝
快速回复 在线客服 返回列表 返回顶部