WinCE EBOOT的入口Startup.s

在Startup.s文件中包含一个startup的入口函数,该函数为EBOOT的最开始的入口。在系统上电或者冷启动的时候,这是第一个被执行的函数。该函数都是由汇编语言编写的,完成基于硬件平台的最初的初始化,也就是CPU的相关初始化,如果有必要,也可以在这里对外围的设备进行初始化。该函数执行到最后,会跳转到C语言的入口,一般是Main函数,或者叫做EBootMain函数。

这里要多说的一件事情就是在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设置到正确的模式下面。一般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_ENTRYStartUp

;设置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的大小

时间: 2024-11-02 06:56:54

WinCE EBOOT的入口Startup.s的相关文章

WinCE Eboot中的OEM Flash函数

在EBOOT中提供了操作Flash的功能,可以将下载的WinCE image烧到Flash当中,这需要实现一些Flash相关的OEM函数. 这些OEM函数会在BLCOMMON模块中被调用,也就是在blcommon.c文件的DownloadImage函数中被调用.在DownloadImage函数中,一般image文件的header会被先下载并进行解析.然后调用OEMIsFlashAddr判断image所在的区域,如果是在Flash的地址空间内,那么接下来会下载image文件并调用Flash相关的O

WinCE Eboot中的OEM控制函数

在EBOOT中有很多以OEM开头的函数,这些函数都会直接或间接的被BLCOMMON模块调用,来完成相应的功能.这些OEM函数就是我们需要根据自己的平台来实现的.可以说,实现了这些OEM函数,EBOOT的功能就完成了. 在EBOOT中有很多OEM函数,有些是必须实现的,有些是不必实现的,而有些是根据你的EBOOT的功能需求来决定是否要实现的.下面会介绍一下直接由BLCOMMON调用的OEM控制函数: 1. void OEMDebugInit(void) 这应该是第一个被调用的OEM函数,用来初始化

WinCE Eboot中的BLCOMMON

在EBOOT中,从Startup.s跳转到C程序入口以后,程序就可以用C语言来编写了,这样感觉就好多了.一般C语言的入口就是一个Main函数,也可能叫其他的名字.在这个Main函数中会掉用BootloaderMain函数,该函数在BLCOMMON模块中被定义的.一般Main函数的写法如下: void (void) { // Common boot loader (blcommon) main routine. BootloaderMain(); // Should never get here.

WinCE Eboot中的网络函数

一般使用EBOOT下载WinCE image都是通过网络,就是指以太网,当然也有通过USB下载的,不过网络下载是最常用的了.实际上下载的工作是在BLCOMMON模块中完成的,它会调用OEMReadData函数来下载数据,OEMReadData由用户来实现,一般如果是网络下载,都会在OEMReadData中直接调用EbootEtherReadData函数来从网络读取数据,该函数由微软实现,这个函数会再调用OEMEthGetFrame函数从网卡读取数据,这个函数是要用户根据自己使用的网卡芯片实现的网

WinCE EBOOT中的Optional函数

在WinCE的EBOOT中,有一些函数属于Optional的OEM函数,也就是可选择实现的.这些函数会在BLCOMMON模块中被调用,我们需要在EBOOT中实现它们,然后把实现的函数赋值给BLCOMMON中的相应的函数指针上面就可以了,这样BLCOMMON模块在调用这些Optional函数的时候,会首先检查他们是否为NULL,如果为NULL就不执行,如果不是NULL就运行这些函数. 可以先看一下BLCOMMON模块的代码,在blcommon.c中有如下的定义: PFN_OEMVERIFYMEMO

WinCE EBOOT中的BootPart分析

应该说BootPart算是微软提供的一个用于分区的模块,可以在EBOOT中使用.不过说实话,我很少使用它,知道有些厂商的BSP里面支持这个功能,而且也算是EBOOT的一部分,所以还是介绍一下.先看一下架构,如图: 在EBOOT中,BLCOMMON处于最上层,这个在以前已经介绍过,BootPart模块会被OEM函数来调用,而BootPart模块要操作存储设备需要Flash Driver的支持.这里要说的是Flash Driver是指WinCE下的Flash驱动,也就是FMD_xxx接口的驱动.所以

WinCE EBOOT中的Boot Args与Driver Globals

在EBOOT中包含的一个重要的缓冲区叫Driver Globals,它用于在设备驱动和WinCE OS之间共享数据.而在EBOOT中会用到的启动参数结构被称为Boot Args,是指用于EBOOT和WinCE OS之间共享一些参数信息.一般来说Boot Args会在EBOOT运行的时候被赋值或者更新,最常用的就是网络设备的相关信息设置,比如IP地址,MAC地址,中断等信息. Driver Globals包含了Boot Args,也就是说Driver Globals是一块内存缓冲区,其中里面也包含

学习ASP.NET Core, 怎能不了解请求处理管道[4]: 应用的入口——Startup

一个ASP.NET Core应用被启动之后就具有了针对请求的处理能力,而这个能力是由管道赋予的,所以应用的启动同时意味着管道的成功构建.由于管道是由注册的服务器和若干中间件构成的,所以应用启动过程中一个核心的工作就是完成中间节的注册.由于依赖注入在ASP.NET Core应用这得到非常广泛的应用,框架绝大部分的工作都会分配给我们预先注册的服务,所以服务注册也是启动WebHost过程的另一项核心工作.这两项在启动过程中必须完成的核心工作通过一个名为Startup的对象来承载. [本文已经同步到<A

WinCe开发专题

Windows CE下驱动开发基础 模拟器和远程调试工具(二) 模拟器和远程调试工具(一) 配置Windows CE下浏览器 在基于CE的产品上使用手机模块 解析Windows CE下浏览器源码 让自己编写的DLL加载到Slot1 WinCE应用程序开机自动运行的又一种方法 加密Windows CE系统 WinCE开发中Boot Loader点点滴滴 OAL点点滴滴(二) OAL点点滴滴(一) Windows CE下中文输入法编辑器 WinCE Eboot中的网络函数 WinCE Eboot中的