资源描述:
《bootloader启动代码分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、bootloader启动代码分析1,bootloader(第一部分)主要完成以下工作:1,设置CPU工作模式;2,关闭中断;3,关闭Cache和Writebuffer;4,初始化SDRAM,配置存储设备;5,复制FLASH中的代码和数据到SDRAM中;6,内存重映射,配置存储设备;7,把RM和ZI从LOADADDR复制到executeADDR.8,设置栈空间指针,跳转到C语言函数入口(启动代码第二部分)。2,具体代码分析1,设置CPU工作模式MRSr0,cpsr#读取CPSR状态寄存器的值CPSR状态寄存器结构:NZCVIFTModeBICr0,r0,#M
2、ASK_MODE&定义值为0x0000003F,把MODE清零;ORRr0,r0,#MODE_SVC32&宏定义值为0x00000013,把MODE设置为SVC模式;ORRr0,r0,#I_BIT&宏定义值为0x80,关IRQ;ORRr0,r0,#F_BIT&宏定义值为0x40,关FIQ;MSRcpsr_c,r0&回写cpsr状态寄存器设置完CPSR后,状态寄存器中的值:NZCV11T100112,关闭中断LDRr2,=ARM7_INTMASK&ARM7_INTMASK宏定义值为ASIC_BASE+0x4008,读取interruptcontroller寄
3、存器MVNr1,#0&FFFFFFFFSTRr1,[r2]&回写interruptcontroller寄存器,之后寄存器的值为全1,既关闭所有的中断源;LDRr2,=ARM7_INTPEND&ARM7_INTPEND宏定义值为ASIC_BASE+0x4004,取interruptpend寄存器.MVNr1,#0&FFFFFFFFSTRr1,[r2]&回写ARM7_INTPEND寄存器,之后寄存器的值为全1,既关闭所有的中断标志位;3,关闭Cache和WritebufferASIC_BASE宏定义值为0x03ff0000LDRr0,=ARM7_SYSCFG&
4、宏定义值为ASIC_BASE+0x0000LDRr1,=0x87ffffA00X87ffffA0的二进制为10000111111111111111111110100000SEMustbesettozero.CEWhensetto'1',cacheoperationsareenabled.设置为0,将CACHE禁用。WEWhensetto"1",writebufferoperationsareenabled.设置为0,将writebuffer禁用。CMThis2-bitvaluedetermineshowinternalmemoryistobedevided
5、intocacheandSRAM.00=4-KbyteSRAM,4Kbytecache01=0-KbyteSRAM,8Kbytecache10=8-KbyteSRAM,0Kbytecache设置为10,将CACHE大小设置为0。InternalSRAM基地址为3FE(1111111110)寄存器的基地址为3FF《16为变成3FF0000,所以ASIC_BASE宏定义值为0x03ff0000。STRr1,[r0];将设置写入SYSCFG寄存器4,初始化SDRAM,配置存储设备IMPORT
6、Image$$RO$$Base
7、IMPORT
8、Image$$RO$$L
9、imit
10、IMPORT
11、Image$$RW$$Base
12、IMPORT
13、Image$$RW$$Limit
14、IMPORT
15、Image$$ZI$$Base
16、IMPORT
17、Image$$ZI$$Limit
18、Image$$RO$$Base为RO段基地址,Image$$RO$$Limit为RO段结束地址;Image$$RW$$Base为RW段基地址,Image$$RW$$Limit为RW段结束地址;Image$$ZI$$Base为ZI段基地址,Image$$ZI$$Limit为ZI段结束地址;导入这些内置变量,这些变量由编译器产生。初始化数据总线寄存器LDRr1,=r
19、EXTDBWTH;EXTDBWTH宏定义值为0x00003001。即[1:0]DatabuswidthforROM/SRAM/FLASHbank0(DSR0)01=Byte(8bits)(FLASH数据总线宽度为一个字节)[13:12]DatabuswidthforDRAMbank0(DSD0)11=Word(32bits)(DRAM数据总线宽度为4个字节)初始化FLASHLDRr2,=rROMCON0;ROMCON0宏定义值为0x02000060(00000010000000000000000001100000),即FLASH基地址为0,结束地址为200
20、000(20〈〈16)(0-2M)LDRr3,=rROMCON1;