BSP之OAL

先看看前辈们的讲解~

 

WinCE OAL架构分析:http://blog.csdn.net/nanjianhui/archive/2009/01/18/3830452.aspx

 

WinCE OAL中的Startup.s介绍:http://blog.csdn.net/nanjianhui/archive/2009/01/31/3855686.aspx

 

WinCE OAL中的OEMInit函数:http://blog.csdn.net/nanjianhui/archive/2009/02/12/3882799.aspx

 

WinCE OAL中的Global Variables介绍:http://blog.csdn.net/nanjianhui/archive/2009/02/21/3917839.aspx

 

WinCE OAL中的Cache操作函数介绍:http://blog.csdn.net/nanjianhui/archive/2009/02/25/3937207.aspx

 

 WinCE OAL中的中断处理:http://blog.csdn.net/nanjianhui/archive/2009/03/03/3953466.aspx

 

WinCE OAL的系统Timer分析:http://blog.csdn.net/nanjianhui/archive/2009/03/20/4007259.aspx

 

WinCE OAL中的电源管理函数:http://blog.csdn.net/nanjianhui/archive/2009/03/25/4024279.aspx

 

WinCE OAL中的Memory函数介绍:http://blog.csdn.net/nanjianhui/archive/2009/03/31/4038734.aspx

 

WinCE OAL中的RAM定制函数:http://blog.csdn.net/nanjianhui/archive/2009/04/12/4067295.aspx

 

WinCE OAL中的Profiler的实现:http://blog.csdn.net/nanjianhui/archive/2009/04/15/4076593.aspx

 

WinCE OAL中的OEMIoControl函数:http://blog.csdn.net/nanjianhui/archive/2009/04/22/4100835.aspx

 


 

1 OAL的结构

OEM适配层(OEM Adaptation Layer,简称OAL)是逻辑上驻留在Windows CE内核和目标设备硬件之间的代码层,在物理上OAL与内核库连接来产生内核可执行文件。OAL代码用来处理中断、计时器、电源管理、总线抽象、通用IO控制等。

从物理上说OAL代码是内核的一部分,系统被构建时OAL被编译成OAL.lib,然后和其他的和Windows CE系统相关的库文件链接,最后形成Windows CE操作系统内核可执行文件NK.exe

Windows CE系统内核运行在目标硬件上时需要访问系统硬件,例如中断、实时时钟、Cache等。而OAL则将对目标平台硬件的访问抽象成函数或者库,当操作系统访问硬件时就调用OAL的函数或者库完成对硬件的访问,从而实现了操作系统和硬件的无关。因此从功能上来说OAL是对硬件的抽象。OAL的体系结构如图34CPU以外的其他所有具体硬件相关的代码都在OAL中,OAL是运行在核心态的,可以直接访问硬件资源。而Windows CE的内核只与CPU相关,与其他硬件都无关。

2 OAL的启动

在开发OAL之前必须清楚的了解OAL的运行过程,OAL的执行过程实际上就是Windows CE的启动过程。OAL的启动过程如图35

Boot Loader一样,OAL的入口函数也是用汇编编写的Startup()函数,其主要功能也还是基本硬件的初始化,但是Startup()函数的执行有两种可能:第一种是不运行Boot Loader,直接从OAL启动,则Startup()函数执行基本硬件初始化功能后跳转到KernelStart();第二种情况是系统从Boot Loader启动,然后再运行OAL,则这是硬件初始化已经在Boot Loader中完成,OAL中不需要再重复,直接跳转到KernelStart()

KernelStart()函数是OAL启动过程的主控函数,它是系统内核的一部分,由微软提供。由于KernelStart()函数涉及到CPU硬件的操作,所以KernelStart()函数也是用汇编语言实现的。KernelStart()函数的主要作用有:初始化页表、打开MMUCache、设置异常向量跳转表、初始化每个模式下的栈。

之后进入了第一个C语言代码函数ARMInit()ARMInit()函数进行ARM硬件平台的初始化,主要工作有:

l  调用KernelRelocate()函数进行内核重定位

l  调用OEMInitDebugSerial()函数初始化调试串口

l  调用OEMInit()函数初始化硬件

l  调用KernelFindMemory进行内存处理。

其中,KernelRelocate()KernelFindMemory()是由微软提供的函数,在进行系统移植时,不需要自己实现。OEMInitDebugSerial()的实现和在Boot Loader中对调试串口的实现是一样的,重点需要关注的是OEMInit()函数。OEMInit()初始化硬件设备,主要初始化中断、系统计时器、KITL接口、总线接口。OEMInit()函数根据硬件设备的不同,需要OEM实现。

KernelInit()函数的功能是内核初始化。KernelInit()初始的内核组件有:堆、内存池、内核进程、内核调度器。KernelInit()调用HeapInit()函数初始化堆,InitMemoryPool()函数初始化内存池,ProcInit()函数初始化内核进程,SchedInit()函数初始化内核调度器并且创建SystemStartupFunc()线程,调用FirstSchedule()函数来启动调度器。这些函数的实现都是由微软提供的,不需要开发者自己实现。

OAL启动完成后,Windows CE操作系统才开始运行,开始加载文件系统Filesys.exe,设备管理器Device.exe等系统进程,然后加载驱动程序,最后才运行应用程序。

3 OAL的实现

OAL的代码最终和操作系统编译成一体,成为Windows CE内核的一部分,所以OAL代码编写的好坏会直接影响Windows CE系统运行的稳定性、安全性和性能,对驱动程序和应用程序都会产生直接的影响。在OAL的开发过程中,OEM需要实现的主要功能有:

l  Startup()函数

Startup函数是内核启动期间调用的第一个函数,它负责将CPU初始化到一个已知的状态,OAL可以共享Boot LoaderStartup函数;

l  调试串口

用于对OAL进行调试以便随时掌握系统的运行情况;

l  OEMInit()函数

由内核初始化函数调用,它的最小任务是设置在Startup函数中没有进行初始化的其余硬件并注册中断,开发者可以添加附加的代码来初始化可选的函数指针和变量,从而增强系统的功能;

l  系统计时器

以每毫秒一个Tick的固定速率产生System tick,这个速率是计时器中断产生的速率,实现系统定时器函数是OAL开发的重要任务之一;

l  中断处理

为内核提供打开、服务和完成中断的处理。当一个设备驱动程序调用InterruptInitializeInterruptDisableInterruptDone函数时,将触发内核分别调用OEMInterruptEnableOEMInterruptDisableOEMInterruptDone函数

l  KITL

通过通信服务协议与内核通信,使开发者可以使用不同类型的硬件传输端口与Platform Builder进行通信来更容易的支持调试服务。

Startup()函数的前面已经分析过,主要功能是初始化基本硬件环境,由于在本次设计的基站中采用了Boot Loader来启动系统,所以在OAL中的Startup()函数只是将地址映射表OEMAddressTable传递给内核初始化函数KernelInit(),由KernelInit()根据地址映射表建立物理地址和虚拟地址的映射。

在基站的开发过程中,采用S3C2410的串口1作为调试串口,串口2用于其他应用。OAL调试串口的功能和Boot Loader中调试串口的实现基本一样,主要实现OEMInitDebugSerial()OEMReadDebugByte()OEMWriteDebugByte()OEMWriteDebugString()四个函数来初始化调试串口和对串口进行读写操作。

S3C2410的平台上,OEMInit()函数的主要功能是初始化Startup()函数中没有初始化的所有硬件。OEMInit()首先调用OALIntrInint()函数初始化物理中断和逻辑中断的映射表,然后关闭除定时器4以外的所有中断(定时器4用作系统时钟),OALIntrInint()函数输入系统内部函数,由微软实现。紧接着OEMInit()函数调用OALTimerInit()函数初始化系统时钟,Windows CE采用了S3C2410Timer 4作为系统时钟,产生系统调度需要的时钟源。然后OEMInit()函数进行KITL的初始化,流程为:OALKitlStart()OALKitlInit()KitlInit()StartKitl()OEMKitlInit()OALKitlEthInit()KITL的初始化过程比较复杂,大部分都是调用OAL函数和操作系统内核函数。

Windows CE操作系统中采用S3C2410Timer 4作为系统计时器,系统计时器是Windows CE进行任务调度的单位,Windows CE以每毫秒产生一个tick的固定频率来产生系统调度单位,在OAL的开发中,需要将Timer 4设置成每毫秒产生一个中断,并且使能Timer 4的中断功能。

中断处理是OAL开发的重点,也是Windows CE实时性的核心。与中断处理相关的函数有:InterruptHandler()InterruptInitialize()InterruptEnable()InterruptDisable()InterruptDone(),这五个函数分别完成了中断处理、中断初始化、中断使能、中断禁止和中断服务完成五个功能,当调用这五个函数时,将触发内核分别调用OEMInterruptHandler()OEMInterruptInitialize()OEMInterruptEnable()OEMInterruptDisable()OEMInterruptDone()五个OEM函数,这五个函数需要OEM实现。中断部分的具体实现将在下一章具体介绍。

在完成了OAL的开发和移植工作后,接下来的任务就是在PlatformBuilder集成开发环境下根据项目的实际情况,选择需要的Windows CE模块和组件,编译出合适的Windows CE操作系统映像。在编译的过程中如果出现错误,则有可能是在OALOEM函数的编写有错误,仔细检查OAL函数后再进行编译,直到编译正确,得到能稳定运行的Windows CE操作系统映像。

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值