[ZLG-ARM] 写bootloader是遇到的问题,不解?

[复制链接]
3328|8
 楼主| junovour 发表于 2007-4-5 11:35 | 显示全部楼层 |阅读模式
1&nbsp;假如我把写好的程序下载到smartarm开发板的flash中,使用ldr取一个标号,比如reset,那么,取得的地址是0x80000000,还是0x00000000呢?<br />2&nbsp;假如我写的是bootloader程序,开发板使用flash启动,那中断向量表是不是一定要放到flash中,或者使用跳转指令跳转到ram中,并且要事先把代码转移到ram中呢?我是否可以这样理解。<br />3&nbsp;如果可以发生中断时,中断向量表从RAM取值,我该具体怎么做呢?冲映射吗?把RAM映射到0x0位置?具体怎么操作呢?<br />我是新手,很多问题不太明白,希望好心人能解答,谢谢~<br />
zlgARM 发表于 2007-4-5 21:47 | 显示全部楼层

junovour

&nbsp;&nbsp;&nbsp;如果一定要弄懂这些问题,那么请自行研究一下startup.s文件,以及存储器映射的概念。
VisionShow 发表于 2007-4-6 00:03 | 显示全部楼层

回复

1.&nbsp;是0x80000000,&nbsp;只是CPU根据MEMMAP把访问地址改变了(只是头64字节)<br />2.&nbsp;不是,可以事先把代码拷贝到RAM中<br />3.&nbsp;MEMMAP=2,此时从RAM中取中断向量<br />下面是一个LPC2220的启动程序:<br />@这个文件是LPC2220的外部启动程序<br />.text<br />.align&nbsp;4<br />.global&nbsp;_start<br />.global&nbsp;Reboot<br /><br />_start:<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;DataAbort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@这个地方很奇怪,非这样一条语句才能启动<br />&nbsp;&nbsp;.long&nbsp;&nbsp;0xA3400FF2<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;[PC,&nbsp;#-0xFF0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@这个方式也是比较奇怪的,如果用B&nbsp;IRQ此类的语句是不能执行的(下面有例子)<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br /><br />/*<br />IRQ:<br />&nbsp;&nbsp;STMDB&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;CPSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@获取当前CPU状态<br />&nbsp;&nbsp;STMDB&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@保存当前CPU状态<br />&nbsp;&nbsp;BL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRQ_Handler<br />&nbsp;&nbsp;LDMIA&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@读回CPU状态<br />&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR,&nbsp;R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@恢复CPU状态<br />&nbsp;&nbsp;LDMIA&nbsp;&nbsp;&nbsp;SP!,&nbsp;{R0-R12,&nbsp;LR}<br />&nbsp;&nbsp;SUBS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;LR,&nbsp;#4<br />*/<br /><br />DataAbort:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;0x80000024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@这个地方也很奇怪,非指向0x80000000才行,也就是必须指向FLASH<br /><br />SystemReset:<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xFFFFF014&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@关闭所有中断<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xFFFFFFFF<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xE0000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@映射为Flash启动<br />&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xE002C014<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x0F814920<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xFFE00000<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x1000FFEF<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xFFE00004<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x2000FFEF<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xFFE00008<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x0000FFEF<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xFFE0000C<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x00002400<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xD2<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x40010000<br /><br />&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xD3<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x4000E000<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x80000000<br />&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0x40000000<br />&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0xC000<br />CopyProgram:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@把程序拷贝到RAM中运行<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0],&nbsp;#4<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R3,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R1],&nbsp;#4<br />&nbsp;&nbsp;SUBS&nbsp;&nbsp;&nbsp;R2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;&nbsp;&nbsp;#4<br />&nbsp;&nbsp;BNE&nbsp;&nbsp;&nbsp;&nbsp;CopyProgram<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0xE01FC040<br />&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#2<br />&nbsp;&nbsp;STRB&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR<br />&nbsp;&nbsp;BIC&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;#0x80<br />&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;CPSR,&nbsp;&nbsp;&nbsp;R1<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataAbort<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=SystemReset<br />&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[R0]<br /><br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=Startup<br /><br />Reboot:<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x80000000<br />
high 发表于 2007-4-6 09:55 | 显示全部楼层

鼓励一下楼主,我觉得您问的问题很好。

我也困惑很久<br /><br />我的理解:<br /><br />1,地址问题<br /><br />&nbsp;&nbsp;&nbsp;这也是为什么要用户指定ro_base的原因。所有地址是这个基地址偏移。所以,这个值是您自己定的。<br />&nbsp;&nbsp;&nbsp;进阶内容:如果是一个多任务的并有文件系统,每个程序由os来自动加载,--旧象windows做到的那样。我们怎么办?编译器提供了这么个功能:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ROPI&nbsp;-&nbsp;位置无关&nbsp;read&nbsp;only&nbsp;position&nbsp;independece?<br />&nbsp;&nbsp;&nbsp;(我从手册获知,并没有应用经验)<br /><br />2,如果问vector所在位置。在支持remap的系统里面,事实上,vector是可以任意安排所在,只要它是地址0,或者remap后的地址0。
 楼主| junovour 发表于 2007-4-6 12:55 | 显示全部楼层

感谢大家解答,还有几点不太明白

通过大家的讲解,我也稍微明白了一些。<br />看U-Boot中start.S,还有几处不太明白,可能还是没有理解好吧……<br />#include&nbsp;&ltconfig.h&gt<br />#include&nbsp;&ltversion.h&gt<br /><br />#define&nbsp;PINSEL0&nbsp;0xe002c000<br />#define&nbsp;PINSEL2&nbsp;&nbsp;&nbsp;&nbsp;0xe002c014<br />#define&nbsp;BCFG0&nbsp;&nbsp;&nbsp;&nbsp;0xffe00000<br />#define&nbsp;BCFG1&nbsp;&nbsp;&nbsp;0xffe00004<br />#define&nbsp;MEMMAP&nbsp;&nbsp;&nbsp;&nbsp;0xe01fc040<br />#define&nbsp;PLLCON&nbsp;&nbsp;&nbsp;&nbsp;0xe01fc080<br />#define&nbsp;PLLCFG&nbsp;&nbsp;&nbsp;&nbsp;0xe01fc084<br />#define&nbsp;PLLSTAT&nbsp;0xe01fc088<br />#define&nbsp;PLLFEED&nbsp;0xe01fc08c<br />#define&nbsp;VPBDIV&nbsp;&nbsp;0xe01fc100<br />#define&nbsp;RAM_SIZE&nbsp;&nbsp;0x20000&nbsp;+&nbsp;1024&nbsp;*&nbsp;128<br />#define&nbsp;RAM_BASE&nbsp;0x81000000<br />.globl&nbsp;_start<br />_start:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;pc,reset<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;疑问1<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.balignl&nbsp;&nbsp;&nbsp;&nbsp;16,0xdeadbeef<br /><br /><br />_TEXT_BASE:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;TEXT_BASE<br /><br />.globl&nbsp;&nbsp;&nbsp;&nbsp;_armboot_start<br />_armboot_start:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_start<br /><br />.globl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_bss_start<br />_bss_start:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;__bss_start<br /><br />.globl&nbsp;&nbsp;&nbsp;&nbsp;_bss_end<br />_bss_end:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;_end<br /><br />reset:<br />/*<br />**first&nbsp;set&nbsp;cpu&nbsp;to&nbsp;svc32&nbsp;mode<br />*/<br />&nbsp;&nbsp;&nbsp;&nbsp;mrs&nbsp;&nbsp;&nbsp;&nbsp;r0,cpsr<br />&nbsp;&nbsp;&nbsp;&nbsp;bic&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0x1f<br />&nbsp;&nbsp;&nbsp;&nbsp;orr&nbsp;&nbsp;&nbsp;&nbsp;r0,r0,#0x13<br />&nbsp;&nbsp;&nbsp;&nbsp;msr&nbsp;&nbsp;&nbsp;&nbsp;cpsr,r0<br />/*<br />&nbsp;&nbsp;&nbsp;&nbsp;ok&nbsp;the&nbsp;cpu&nbsp;is&nbsp;setted&nbsp;to&nbsp;svc32&nbsp;mode<br />&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;we&nbsp;should&nbsp;first&nbsp;close&nbsp;the&nbsp;watch&nbsp;dog<br />&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;the&nbsp;others&nbsp;Interrupt<br />*/<br /><br />Init_cpu:<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,=PINSEL0<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=0x0//common&nbsp;io<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=PINSEL2<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=0x0f814914<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=BCFG0<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=0x1000ffef<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=BCFG1<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,=0x1000ffef<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br /><br />////////////////////////////////////////////////////////////////////////////////&nbsp;&nbsp;&nbsp;&nbsp;<br />PLL_CON:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;0xaa<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;&nbsp;&nbsp;&nbsp;0x55<br /><br />#define&nbsp;Fosc&nbsp;&nbsp;&nbsp;&nbsp;11059200<br />#define&nbsp;Fcclk&nbsp;&nbsp;&nbsp;&nbsp;(Fosc*4)<br />#define&nbsp;Fcco&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Fcclk*4)<br />#define&nbsp;Fpclk&nbsp;&nbsp;&nbsp;&nbsp;(Fcclk/4)*1<br /><br />Init_target:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=MEMMAP<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#3<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=VPBDIV<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#0<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=PLLCFG<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#0x23&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=PLLCON<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#01<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=PLLFEED<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#0xaa<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#0x55<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />wait_lock:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=PLLSTAT<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r2,#0x400<br />&nbsp;&nbsp;&nbsp;&nbsp;beq&nbsp;&nbsp;&nbsp;&nbsp;wait_lock<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=PLLCON<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#0x03<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,=PLLFEED<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r2,#0xaa<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,#0x55<br />&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;&nbsp;&nbsp;&nbsp;r2,[r1]<br /><br />/*<br />&nbsp;&nbsp;&nbsp;&nbsp;relocate&nbsp;the&nbsp;mem<br />*/<br />relocate:<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;r0,_start&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;疑问2<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r1,_TEXT_BASE<br />&nbsp;<br />//compare&nbsp;how&nbsp;many&nbsp;mem&nbsp;we&nbsp;should&nbsp;copy<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r2,_armboot_start<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r3,_bss_start<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;r2,r3,r2//r3-r2-&gtr2<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r2,r0,r2//from&nbsp;start&nbsp;to&nbsp;_bss_start<br />copy_loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;r0!,{r3-r10}<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;r1!,{r3-r10}<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;ble&nbsp;copy_loop<br />//ok&nbsp;,finish&nbsp;copyed<br />/////////////////////////////////////////////&nbsp;&nbsp;&nbsp;&nbsp;<br />//now&nbsp;setup&nbsp;the&nbsp;stack&nbsp;and&nbsp;ready&nbsp;to&nbsp;jump&nbsp;to&nbsp;C&nbsp;code<br />&nbsp;&nbsp;&nbsp;&nbsp;adr&nbsp;r0,real_vectors<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r2,r0,#1024<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r1,=0x81000000//this&nbsp;is&nbsp;the&nbsp;base&nbsp;of&nbsp;first&nbsp;ram<br />////////////////////////////////////////////////////////<br />//new&nbsp;added<br />&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r1,r1,#0x08<br />////////////////////////////////////////////////////////<br />v_copy_loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldmia&nbsp;r0!,{r3-r10}<br />&nbsp;&nbsp;&nbsp;&nbsp;stmia&nbsp;r1!,{r3-r10}<br />&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;r0,r2<br />&nbsp;&nbsp;&nbsp;&nbsp;ble&nbsp;&nbsp;&nbsp;&nbsp;v_copy_loop<br />stack_setup:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r0,_TEXT_BASE<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;r0,r0,#CFG_MALLOC_LEN<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;r0,r0,#CFG_GBL_DATA_SIZE<br />#ifdef&nbsp;CONFIG_USE_IRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;r0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;r0,r0,#12<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;fp,#0&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;疑问3<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a2,#0<br />/////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;pc,_start_armboot<br />_start_armboot:<br />&nbsp;&nbsp;&nbsp;&nbsp;.word&nbsp;start_armboot<br /><br /><br />real_vectors:&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;&nbsp;&nbsp;&nbsp;疑问4<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;undefined<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;software<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preabort<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;dataabort<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;not_use<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;irq<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;fiq<br /><br />undefined:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r6,#3<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset<br />software:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,#4&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset&nbsp;&nbsp;&nbsp;&nbsp;<br />preabort:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,#5<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset<br />dataabort:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,#6<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset<br />not_use:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,#7<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset<br />irq:&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,#8<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset<br />fiq:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;r6,#9<br />&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;reset<br />上边这段代码把MEMMAP设定为0x3,就是说中断向量从外部存储器重新映射,代码已经把中断向量表拷贝到RAM的基地址处0x81000000,那么我在疑问一的地方,是否可以添加add&nbsp;&nbsp;&nbsp;&nbsp;pc,pc,#0x01000000&nbsp;&nbsp;这样的指令,发生请求时先到flash去指令(pc指针是0x8@@@@@@@吧?),然后将pc指针相加,指到外部的RAM空间0x81000000中,那里有中断向量表的一份拷贝。<br />疑问2的地方,为什么要用adr呢?那adr&nbsp;r0,_start,&nbsp;当程序在flash中运行时和程序在ram运行时r0值是否相同,还是r0值根本不变,是由uboot.lds中指定呢?程序里有一个_start,lds文件也有一个?到底曲哪个呢?<br />疑问3的地方一直不明白在干什么...<br />疑问4的地方使用的跳转指令,执行到这的时候,一定在ram里了,那它跳转的时候是到了flash中的代码,还是到了ram中的代码呢<br />这些问题困扰了我很久了。。。。。<br />
bqt 发表于 2007-4-6 13:57 | 显示全部楼层

我用自己写的Bootloader也可以从U盘加载UClinux

我写的Bootloader支持3个功能:<br />1.&nbsp;从网卡接收hex或bin程序放到0x81000000的ram中运行,当然该程序链接时要将基地址指定在0x81000000处。<br />2.&nbsp;从U盘中加载hex或bin程序放到0x81000000的ram中运行。<br />3.&nbsp;从U盘中加载UClinux并运行UClinux。<br /><br />当然Bootloader本身也是一个程序,它运行于0x80000000的FLASH中。<br />把RO段、RW段、ZI段,以及程序加载态和运行态之间的关系搞清楚应该可以做到了。
蛋蛋的老公 发表于 2007-4-8 00:46 | 显示全部楼层

看来楼主还是不大明白LPC2000的运行...

简单一点可以这样理解,,NXP的ARM7芯片在RESET信号周期内,先是运行芯片内部自带的BOOTBLOCK程序的;复位信号过后才是运行用户的程序.<br />这个BOOTBLOCK程序DATASHEET给出来的,存放的位置是在7FFFE000~7FFFE03C.但根据ARM7的内核结构,在复位后程序指针应是指向0000000H的,异常向量也是从000000H开始的,按此看来,是根据无法在复位后运行BOOTBLOCK程序.因此可以这样说,在LPC2000芯片中,BOOTBLOCK程序存放的位置应该是从0000000H开始的,而7FFFE000~7FFFE03C是在运行完复位信号结束后重新映射出来的地址;或者是说在其0000000H是存放映射处理程序的,BOOTBLOCK程序的物理位置就在7FFFE000~7FFFE03C.每次异常首先通过芯片的映射程序重新分配处理.这个通过在其DATASHEET中在描述关于各个空间地址的是这样说法可以看出.&quot;芯片复位后从用户的角度来看的映射地址是...&quot;.不过以上明白这么一回事就行了,不必理它是具体怎么做.<br />那这个BOOTBLOCK做些什么工作呢?大概如此,1.判断P0.14的状态是否为低,如为低就进入ISP模式;2.若P0.14不为低,就接着判断BOOT(1:0)这个两脚,如为&quot;11&quot;B否设MEMMAP=1(运行内部FLASH),否则设MEMMAP=3(运行外部FLASH);3.如果MEMMAP=1,则异常向量表无需重新映射;如果MEMMAP=3,则将异常向量表重新映射到80000000H开始(准确地说应该是80000000H这个地址重新映射到00000000H上,因为你的异常向量表是放在8000000H中,而人家复位信号过后开始过运行的地址是0000000H.重新映射后,异常发生(含复位)时,即可找到用户程序.)..此后就等待复位信号结束..复位信号结束后就开始运行用户的代码....<br />整个过程就是这样子,至于它内部的映射方法是怎么实现的,我们就管不着了.<br /><br />这个如果做过FPGA的人就比较清楚,芯片的内部在RESET信号内通常还有一段自己的初化始过程;这些对于我们用户来说是看不见的..这就是为什么每个芯片都要求复位信号保持一定的周期.<br />以上关于LPC2000,是我的个人理解,也不知是否完全正确,但这样理解己能帮我去设计自己的应用程序了.希望对LZ也有帮助.
yutu2 发表于 2007-4-8 11:07 | 显示全部楼层

re...

蛋蛋真幸福&nbsp;
 楼主| junovour 发表于 2007-4-13 10:14 | 显示全部楼层

明白了好多

谢谢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

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