×
嵌入式 > 技术百科 > 详情

WinCEOAL层的结构与开发

发布时间:2023-10-18 发布时间:
|

引 言 windows ce是微软针对嵌入式领域推出的一款全新的操作系统。之所以说它是一款全新的操作系统,是因为尽管windows ce的ui非常接近其它的桌面版windows操作系统,但是它的内核完全是重新写的,并不是任何一款桌面版windows的精简版本。 windows ce是一种支持多种cpu架构的操作系统,这其中包括arm、x86、mips和shx,极大地减轻了0em开发过程中移植操作系统的工作量。 操作系统移植包含两个层面上的工作:一个层面是cpu级的,另一个层面是板级的。cpu级的移植通常由微软或芯片制造商来完成;板级移植则是由oem来完成的。0al正是0em完成这一系统移植的工作核心!1 b10s不同的是,0al隶属于操作系统,是操作系统的一部分。从存在方式上,讲oal是一组函数的集合体,这些函数体现出0al的功能,如图1所示。

2 最小化的oal width=308 border=0>

首先来看一下os的启动顺序。 ①cpu执行引导向量,跳转到硬件初始化代码,即startup函数; ②在start up函数完成最小硬件环境初始化后跳转到kernelstart函数(当cpu为x86架构时为kernel initial-ize函数),来对内核进行初始化; ③kernelstart函数调用oeminitdebugserial完成对调试串口的初始化,调用0eminit函数来完成硬件初始化工作以及设置时钟、中断,调用oemgetextensiondram函数来判断是否还有另外一块dram。 至此,内核加载完毕。由此可见,os启动的重中之重是startup函数的正确加载。2.1 startup startup阶段的特点是kernel还没有加载起来,调试工作比较困难。startup函数的两大核心任务分别是把cpu初始化到一已知状态和调用内核初始化函数来初始化内核。以下是startup函数中通常包含的内容: ①把处理器置为监控模式; ②禁止cpu的irq和fiq输入; ③禁止内存管理单元mmu和指令、数据cache; ④刷新指令和数据cache、tlb、清空写buffr; ⑤确定启动的原因一hard reset,wake from sleep, gpio reset,watchdog reset,eboot handoff; ⑥根据目标板需要配置gpio,比如连接led的gpio; ⑦配置内存管理器,设置刷新频率,使能时钟; ⑧配置中断控制器; ⑨初始化实时时钟(rtc)为0,使能实时时钟; ⑩设置电源管理寄存器; ⑾打开所有板级时钟和片内外部时钟; ⑿取得oemaddresstable的物理基地址并把它存在r0中; ⒀跳转到kernelstart。 bootloader和oal中均包含startup函数。它的功能大致相同,都是要初始化最小硬件环境。bootloader是在为自己的执行准备硬件环境,oal则是为kernel的执行准备硬件环境。由于这两种硬件环境要求基本相同,所以它们的代码也有很大部分可以相互借鉴。但应该明白,bootloader与oal在物理上是独立的,它们并不是同一段代码。而且,如果可以确定这一硬件部分bootloader已经初始化过,则在oal中不必重复。当然,前提是每次加载都要经过bootloader这一环节。最典型的例子就是x86 数码管要直观得多,是调试oal层代码不可或缺的一组工具。这个函数组由四个函数组成,分别是0 e m i width=464 border=0>

①创建中断标识符。下面代码节选自samsung2410的oalintr.h。中断映射表通常位于\platform\\inc。#define sysintr usb (syslntr firmware+11) #define sysintr usbd (syslntr_firmware+12) ② 创建并注册isr。isr的主要任务是返回中断标识符。isr代码通常位于\platform\\kernel\hal下。 下面代码节选自samsung2410的armint.c。if(intpendval==intsrc_adc){ s2410int.>rlntsubmskl=bit_sub_tc; s2410int_>rintmsk |=bit_adc; s2410int_>rsrcpnd |=bit_adc; s2410int_>rintpnd =bit_adc; return(sysintr_touch);} 在中断处理中,还有三个函数也起着至关重要的作用。它是oeminterruptenable()、oeminterruptdisable()和oeminterruptdone()。 ◇oeminterruptenable()用于执行允许设备产生中断的硬件操作; ◇oeminterruptdisable()禁止设备发出中断申请; ◇oeminterruptdone()中断处理结束。3.2 以太网口调试函数 以太网口调试函数与串口调试函数相比,具有更快的速度。 ◇oemethinit 初始化以太网调试口; ◇oemethenableints开以太网适配器中断; ◇oemethdisableints关以太网适配器中断; ◇oemethisr 以太网适配器中断服务例程; ◇oemethgetframe从以太网调试口收数据; ◇oemethsendframe从以太网调试口发数据; ◇oemethqueryclientlnfo获取平台相关信息; ◇oemethgetsecs 返回从某一特定时间开始的计时值。本函数用于处理超时。3.3 kitl kitl全称为kernel independent transportlayer。它的主要用途是提供更方便的调试手段,如图4所示。kitl出现在windows ce.net之后,把软件传输协议与硬件传输层隔离开。kitl使得开发者不必了解硬件传输层如何与软件协议层接口。 以下是应该在oeminit函数中加入的kitl初始化代码。 ①初始化所有pci桥和设备,枚举它们并且给它们分配资源,然后使能,使他们能正常工作。注:此条适于有kitl网络接口卡(nic)和nic桥的情况。 ② 对相关总线进行初始化,使得cpu能够正确识别nic。 ③通过调用kitlinit函数来初始化kitl。这部分代码可参照其它平台,代码文件为halkitl.c。 ④执行0emkitlinit函数,进行相关的硬件初始化工作。搜索是否存在kitl 网口、串口或并口连接。 ⑤执行完oemkitlinit后,把kitl.1ib和kitleth.1ib包含入平台资源文件\\kernel\buildexe\kernkitl,以便把kitl打包进内核。有关kitl的其它函数请参考微软msdn。

3.4 switch(dwlocontrolcode) {caseioctl_hal_set_device_info: case10ctl_hal_reboot: ……default: return false; } return true: } 硬件资源利用和调试手段的加强大大丰富了oal的功能,但是嵌入式系统通常会面临的功耗问题和由于网络功能的日益普及而带来的安全性问题并没有涉及到。4 完整oal 完整oal是指在加强oal的基础上扩充了功耗和安全性验证的oal。所以这一阶段的主要工作集中在电源管理与模块认证两部分。4.1 电源管理 target=_blank>零八我的爱


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机