文章分类

当前位置:首页>技术文章>WinCE EBOOT的入口Startup.s

WinCE EBOOT的入口Startup.s

这里要多说的一件事情就是在 BSP 当中存在两个 Startup.s 文件,一个是 EBOOT 的 Startup.s 用于 EBOOT 本身,另一个是 OAL 的 Startup.s 用于 WinCE 内核。在很多情况下,两个 Startup.s 所完成的任务非常的相近,所以一般都会合并成一个 Startup.s 来完成相应的功能。比如你在 EBOOT 的 Startup.s 中完成了相关的初始化操作以后,在 OAL 的 Startup.s 中只需要 include 位于 EBOOT 下的 Startup.s 就可以了。

当然,这两个 Startup.s 也许不能完全一样,所以不管是真的存在两个 Startup.s 文件还是共用一个 Startup.s 文件,你可能都需要在 Startup.s 中通过条件编译或者判断某个变量的方法来区分。 下面具体说一下在 Startup.s 中,到底应该做些什么事情:

1. 在系统上电或者复位时,先将 CPU 设置到正确的模式下面。深圳 pcb 抄板一般 CPU 本身会有几种模式,比如对于 ARM 来说,这个时候一般会设置为管理模式。2. 关闭所有的 CPU 中断。3. 关闭内存管理单元 MMU 和 TLB。4. 关闭写缓冲和 Cache。5. 初始化内存控制器。6. 设置 CPU 的 PLL,设置时钟。7. 创建堆栈。8. 设置并打开 MMU 和 Cache。

9. 如果需要,自己拷贝 EBOOT 从 Flash 到 RAM 中。

10. 跳转到 C 代码中,一般是 Main 函数或者 EBootMain 函数。 下面以 ARM 为例,来看一个 Startup.s 的模板: STARTUPTEXT LEAF_ENTRY StartUp ; 设置 ARM 的 CPSR 寄存器来设置 ARM 为管理模式并屏蔽所有中断 mov r0, #(SVC32Mode :OR: NoINTS) msr cpsr_c, r0 ; 设置 CP15 协处理器,关闭 MMU 和 Cache ldr r0, =CP15ControlInit WRMMU_STATE r0 ldr r0, =CP15AuxControlInit WRMMU_AUX_STATE r0 ; 刷新 TLB 表和 Cache mov r0, #0x0 WRMMU_FlushTB r0 WRCACHE_FlushIDC r0 ; 释放写缓冲 mov r0, #0 mcr p15, 0, r0, c7, c10, 4 CPWAIT ; 创建一个临时的堆栈,使用 SRAM 中的头 32KB ldr sp, =(CPU_SRAM0 + SZ_32K -

4) bl disableInts ; 屏蔽外部中断 bl initUART ; 初始化串口 bl initClocks ; 初始化系统时钟 bl initStaticMem ; 初始化 Flash 片选控制器 bl initSDRAM ; 初始化 SDRAM 控制器 bl sizeSDRAM ; 返回 SDRAM 的大小 IF EBOOT ; 重定位 Flash 中的代码到 RAM 中 bl EverythingRelocate ; 重定位成功后,跳转到 RealStartup 新地址运行,否则接着运行 cmp r0, #-1 movne pc, r0 ENDIF RealStartup IF EBOOT bl EbootMain ; 跳转到 EbootMain 函数,就是 EBOOT 的 C 语言代码中 ELSE adr r0, OEMAddressTable ; r0 = physical address of OEMMemoryMap bl KernelStart ; 跳转到 KernelStart 函数,并传入物理虚拟地址映射表 ENDIF ; 这里是一个死循环,代码应该永远也执行不到这里 spin b spin ENTRY_END


© 星光电子技术工作室 2021 All Rights Reserved.
如有任何问题、建议、业务、合作,请联系手机/微信:13713820066