RW 段起始地址 ImageRWLimit RW 段结束地址加 1 ImageZIBase ZI 段起始地址 ImageZILimit ZI 段结束地址加 1这些标号的值是通过编译器设定来确定的 如编译软件中对 ro-base 和 rw-base 的设定分别为:ro-base0xc000000 rw-base0xc5f0000 IMPORT ImageROLimit End of ROM code start of ROM data IMPORT ImageRWBase Base of RAM to initialise IMPORT ImageZIBase Base and limit of area IMPORT ImageZILimit to zero initialise下面语句是声明引用外部函数 IMPORT Main C 程序在 2410test.c The main entry of mon program AREA InitCODEREADONLY Init 初始化程序 异常中断矢量表(每个表项占 4 个字节) 下面是中断向量表 一旦系统运行时就可能有中断发生 即使移植了操作系统如 linux,处理器已经把控制权交给了操作系统,但如果发生中断,处理器还是会跳转到从 0x0 开始的 中断向量表中某个中断表项(依据中断类型)开始执行。
具体中断向量布局请参考 s3c44b0 spec 例如 adc 中断向量为 0x000000c0 下面对应表中第 49 项位置 向量地址 0x0449-10x000000c0板子上电和复位后程序开始从位于 0x0 处开始执行,硬件刚刚上电复位后程序从这里开始执行跳转到标为 ResetHandler 处执行DCD 用于分配一段字内存单片,并用后面的伪指令初始化,分配字节由 expr 个数决定 ENTRY 程序入口 1The code which converts to Big-endian should be in little endian code. 2The following little endian code will be compiled in Big-Endian mode. The code byte order should be changed as the memory bus width. 3The pseudo instructionDCD cant be used here because the linker generates error. ASSERT :DEF:ENDIAN_CHANGE ASSERT 断言错误伪指令,这里表示是否定义过 ENDIAN_CHANGE ENDIAN_CHANGE 如果定义了 ENDIAN_CHANGE ASSERT :DEF:ENTRY_BUS_WIDTH 这里表示是否定义过 ENTRY_BUS_WIDTH ENTRY_BUS_WIDTH32 if ENTRY_BUS_WIDTH32 b ChangeBigEndian ,执行 DCD 0xea000007 改变大小端数据模式 跳转到 ChangeBigEndian (见下面红色代码) end if ENTRY_BUS_WIDTH16 if ENTRY_BUS_WIDTH16 andeq r14r7r0lsl 20 当标志状态寄存器 CPSR 的 Z 位1 时r14r7r0 逻辑左移 20 位,执行 DCD 0x0007ea00 改变大小端模式 end if ENTRY_BUS_WIDTH8 if ENTRY_BUS_WIDTH8 streq r0r0-r10ror 1 当标志状态寄存器 CPSR 的 Z 位1 时…,执行 DCD 0x070000ea 改变大小端模式 end if ELSE 即如果没定义 ENDIAN_CHANGE b ResetHandler 复位处理模式 b HandlerUndef handler for Undefined mode 处理为定义模式 b HandlerSWI handler for SWI interrupt 处理软中断模式 b HandlerPabort handler for PAbort 处理终止程序访问终止模式 b HandlerDabort handler for DAbort 处理数据访问终止模式 b . reserved 保留,quot.quot代表指令的地址 ,即表示进行死循环 b HandlerIRQ handler for IRQ interrupt 处理中断模式 b HandlerFIQ handler for FIQ interrupt 处理快速中断模式0x20 quotquot 存储区位置计数器的当前值 b EnterPWDN 进入掉电模式,见下面的标号ChangeBigEndian 改变大小端数据模式0x24下面是大小端格式内存设置??? ENTRY_BUS_WIDTH32 if ENTRY_BUS_WIDTH32 DCD 0xee110f10 0xee110f10 gt mrc p150r0c1c00 DCD 0xe3800080 0xe3800080 gt orr r0r00x80 //Big-endian DCD 0xee010f10 0xee010f10 gt mcr p150r0c1c00 ENTRY_BUS_WIDTH16 if ENTRY_BUS_WIDTH16 DCD 0x0f10ee11 DCD 0x0080e380 DCD 0x0f10ee01 ENTRY_BUS_WIDTH8 if ENTRY_BUS_WIDTH8 DCD 0x100f11ee DCD 0x800080e3 DCD 0x100f01ee DCD 0xffffffff swinv 0xffffff is similar with NOP and run well in both endian mode. DCD 0xffffffff DCD 0xffffffff DCD 0xffffffff DCD 0xffffffff b ResetHandler 复位处理程式进入掉电模式功能 1. SDRAM 必须在自刷新模式. 2. 所有中断必须屏蔽 for SDRAM/DRAM self-refresh. 3. LCD 关闭 for SDRAM/DRAM self-refresh. 4. The I-cache 可能需要开启. 5. The location of the following code may have not to be changed.void EnterPWDNint CLKCON 进入掉电模式EnterPWDN mov r2r0 r2rCLKCON CLKCON3 power_off bit 0:disable 1:transition to power_off mode tst r00x8 判断 POWER_OFF 是否为 0 r0 和0X8 相与 更新 CPSR 位 bne ENTER_POWER_OFF NE 不相等则表示 power_off 不为 O 标志位 Z0ENTER_STOP 不进入掉电模式 ldr r0REFRESH 0x48000024 DRAM/SDRAM refresh DRAM/SDRAM 刷新控制器 ldr r3r0 r3rREFRESH mov r1 r3 r1r3 orr r1 r1 BIT_SELFREFRESH BIT_SELFREFRESH EQU 1ltlt22 bit22 TREFMD 位 0:CBR/AUTO REFRESH 1:SHIF REFRESH str r1 r0 R1-gtR0 Enable SDRAM self-refresh mov r116 延时 wait until self-refresh is issued. may not be needed.0 subs r1r11 0 为局部标号(延时) bne B0 表示局部标号引用 B:指示编译器向后搜索 0 为局部标号 ldr r0CLKCON enter STOP mode. CLKCON Clock generator control str r2r0 mov r1320 subs r1r11 1延时 wait until the STOP mode is in effect. bne B0 2 Or wait here until the CPUampPeripherals will be turned-off Entering POWER_OFF mode only the reset by wake-up is available. ldr r0REFRESH exit from SDRAM self refresh mode. str r3r0 MOV_PC_LR 调用宏 MOV_PC_LRENTER_POWER_OFF 进入掉电模式 NOTE. 1 rGSTATUS3 should have the return address after wake-up from POWER_OFF mode. ldr r0REFRESH ldr r1r0 r1rREFRESH orr r1 r1 BIT_SELFREFRESH str r1 r0 Enable SDRAM self-refresh mov r116 Wait until self-refresh is issuedwhich may not be needed.0 subs r1r11 延时 bne B0 ldr r1MISCCR Miscellaneous control ldr r0r1 orr r0r07ltlt17 Make sure that SCLK0:SCLK-gt0 SCLK1:SCLK-gt0 SCKEL during boot-up str r0r1 ldr r0CLKCON str r2r0 b. CPU will die here. quot.quot当前指令的地址 CPU 死在这WAKEUP_POWER_OFF 掉电唤醒 Release SCLKn after wake-up from the POWER_OFF mode. ldr r1MISCCR Miscellaneous control ldr r0r1 bic r0r07ltlt17 SCLK0:0-gtSCLK SCLK1:0-gtSCLK SCKE:L-gtH str r0r1 Set memory control registers ldr r0SMRDATA ldr r1BWSCON BWSCON Address 起始位置 依次为 BANKCON0 BANKCON1 BANKCON2.
上一篇:
【精品】面向对象
下一篇:
试析P2P网络应用层多播树的建立及维护