B2、WINCE6.0内核的启动过程----------之OAL解释

WinCE6.0的EBOOT概要 在开发的过程中使用EBOOT,可以提高开发效率。前一篇介绍NBOOT加载EBOOT的方法时提到,NBOOT必须将EBOOT放在内存中指定的位置,这个位置是由EBOOT的来决定的。本文粗略的介绍了WinCE6、0下EBOOT的内容,但没有涉及具体的代码实现,相关代码可以参考目录C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT。EBOOT在实现必备功能的前提下,我们还可以扩展其功能,譬如说初始化LCD,并显示特定的启动画面,显示加载映像的进度等。 阅读详情
[移植OAL]
WinCE6.0的内核启动过程:

image

OAL不能调用内核的KernelStart()函数了, 所以自己要实现一个KernelStart() (nkldr.lib替我们完成了这个, 把nkldr.lib链接到OAL),调用nkldr.lib中的KernelStart().然后执行的ARMInit()函数有一个很重要的任务,它将位于OAL的OEMinitGlobals()函数指针赋值到Kdata中, 后面内核需要这个指针.接下来根据Kdata找到并跳转到内核kernel.dll的入口点NKStartup().

Kernel.dll开始执行NKStartUp(),首先要把和OAL的桥梁打通.也就是把内核的NKGlobal数据结构指针交给OAL,并且获得OAL的OEMGlobal的数据结构指针. 怎么实现的? 内核根据Kdata找到OAL中一个函数OEMInitGlobals(),把OEMInitGlobals函数指针赋值给了Kdata,然后,把NKGlobal指针作为参数执行这个函数, 这个函数返回OAL的OEMGlobal的指针.(OAL要实现OEMInitGlobals(), oemmain.lib替我们完成了这个,把oemmain.lib链接到OAL).

这个Kdata 它是内核数据结构, 简单理解成共享内存好了, oal 和 kernel都可访问到.再往后没啥好说了,内核可以访问OAL了,痛快的调用OEM函数. 最后调用KernelStart(),这回这个函数可是在内核里面了,WinCE6.0起来了……

[编译OAL]

开始编译WinCE6.0的OAL. 第一步:编译oal.lib.第二步:编译oal.exe.

第一步的oal.lib可以就是原来版本的,你拷贝原来的oal目录代码到OALLIB目录编译一个oal.lib吧.关键是第二步,原来在WinCE5.0时候,把oal.lib+nk.lib编译成了kern.exe,然后改名成nk.exe.现在,要把oal+nkstub.lib,编译成oal.exe.nk.lib也不是说不要就可以直接不要的.在编译oal.lib时候可是大量使用了nk.lib的东东. 你不会想全文重新改变函数和变量的调用形式吧? ok,把nkstub.lib链接上.这么一来, 在OALEXE目录下的SOURCES文件里面,这4个库被添加进来.

TARGETLIBS= oal.lib oemmain.lib nkldr.lib nkstub.lib ……(路径省略)

Nkldr.lib和oemmain.lib是干吗的? nkldr.lib提供了KernelStart()的实现, oemmain.lib提供了OEMInitGlobals()的实现.当然还有更多的,不罗列了.

[定制OAL]

没有oal.lib咋办?做一个吧……前面提到OAL和Kernel分离,使得接口更加明显了,kernel到底需要OEMs提供哪些函数,可以参照着oemglobal.h文件里面OEMGLOBAL结构体来完成.并且在oemglobal.c里面对这个结构体初始化.这个文件位于oemmain.lib.下面根据我的2440来分析最重要的必须的几个接口:

[Init相关接口]

要提供OEMInit(), OEMInitDebugSerial(),

OEMInit()函数,建立一个init.c,然后实现这个函数.

OEMInitDebugSerial()放到下面debug.c中实现.

[Debug相关接口]

OEMWriteDebugString

OEMInitDebugSerial

OEMWriteDebugByte

OEMReadDebugByte

OEMWriteDebugLED

PQOAL的oal_other.lib提供了OEMWriteDebugString()

在OALLIB下创建debug.c ,然后实现OEMInitDebugSerial, OEMWriteDebugByte, OEMReadDebugByte, OEMWriteDebugLED这4个函数.

[Cache相关接口]

需要提供OEMCacheRangeFlush, 根据自己的架构去已有的PQOAL找吧,我的是oal_cache_arm920t.lib

[Time相关接口]

需要提供

InitClock

OEMGetRealTime

OEMSetRealTime

OEMSetAlarmTime

OEMQueryPerfCounter

OEMQueryPerfFreq

OEMGetTickCount

InitClock,这个功能已经废除了, 相关功能被移到OEMPowerOff中.所以可以实现一个空函数,在初始化OemGlobal时候,把这个指针赋值RetuanFalse()函数也是一样的效果.OEMGetRealTime ,OEMSetRealTime是设置读取rtc的日期功能.OEMSetAlarmTime是设置rtc的报警时刻,找到oal_rtc_s3c2440a.lib

OEMQueryPerfCounter,和OEMQueryPerfFreq是提供更高精度时间的查询,

OEMGetTickCount返回当前CurMSec值,系统运行了多少毫秒.在oal_time.lib中已经有实现.特别强调的是,这个函数在WinCE5.0里面是SC_GetTickCount.需要把名字改了.这个是OAL的一个区别.

[Scheduler相关接口]

OEMIdle, OEMNotifyThreadExit, OEMNotifyIntrOccurs, OEMUpdateReschedTime, 一个变量DefaultThreadQuantum.

[power相关接口]

OEMPowerOff, 这个还要说啥, 挂起时候会执行这个函数. PQOAL的oal_power_s3c2440a.lib已经帮忙实现了最基础的工作,会调用BSPPowerOff来完成平台相关的动作,建立一个文件power.c来实现这个BSPPowerOff.

[DRAM相关接口]

OEMGetExtensionDRAM, OEMEnumExtensionDRAM, CalcFSPages, 变量MainMemoryEndAddress

这组函数询问扩展RAM的情况,如果OEMEnumExtensionDRAM函数提供了, 就执行这个函数,否则执行OEMGetExtensionDRAM, CalcFSPages计算pages, 这个功能内核自己实现了,已经不要了,指向一个空函数即可.

[interrupt相关接口]

OEMInterruptEnable, OEMInterruptDisable, OEMInterruptDone,

OEMIniterruptMask,OEMInterruptHandler

基本工作PQOAL已经做好了,PQOAL下面几个接口完成平台相关工作,BSPIntrInit, BSPIntrRequestIrq, BSPINtrEnableIrq, BSPIntrDisableIrq, BSPIntrDoneIrq, BSPIntrActiveIrq.最后一个OEMInterruptHandler就是系统ISR, 将物理irq转换成逻辑中断SYSINTR_XXX.

[other ]

OEMIoControl .PQOAL里面已经实现了这个功能.如果OEMs要添加新的控制命令, 建立一个ioctl.c,定义一个全局数组g_oalIoCtlTable, 然后往数组里面填入命令字和对应命令执行的函数的名称.这个对应命令的执行函数当然要自己实现了. 驱动或者应用使用KernelIOControl这个api时候,相应命令的函数就会执行.

[总结]

1.WinCE6.0不只是将OAL和kernel分离.还将kitl也分离成为了kitl.dll. 所以,OAL也不能直接使用kitl的资源. 首先把kitl.c和kitl相关代码从OAL里面给放到kitl目录去.然后在OEMInit中不能调用OALKitlStart()了,用KITLIoctl(IOCTL_KITL_STARTUP, NULL, 0, NULL, 0, NULL);这一句来替代.

2.OAL需要使用的数据结构定义,和外部函数声明都在头文件nkexport.h中.可以在oal.h中include这个nkexport.h头文件.

3. PQOAL的oal_log库有了变化,如果使用了这个库的要注意,它不在使用g_oalLogMask这个全局变量了.

4. timer和timer_dvs目录下的watchdog.c文件和nkexport.h中重复定义了pfnOEMRefreshWatchDog,dwOemWatchDogPeriod等.一个解决办法是去掉watchdog.c.反正也可以不使用这个接口.默认传过去的是空接口ReturnFalse()

5. 编译smflash.dll出错,需要fal.lib一起编译成为smflash.dll. fal的源代码位于private\winceos\driver\msflash\src.这个fal.lib.好像和以前的不一样.从错误信息中观察,好像多出来2个接口.在fmd.cpp里面增加这2个接口:

LPVOID FMDHOOK_HookInterface(PFMDInterface pInterface)

{ return (LPVOID) pInterface;}

Void FMDHOOK_UnhookInterface(LPVOID pContext, FMDInterface *pInterface){}

至此, 在给oal加上一个启动代码startup.s. 一个oal.lib就完成了.

基于WinCE 6.0的2416板级支持包(BSP)开发实战 BSP全称为“板级支持包”,它并非操作系统的组成部分,而是作为操作系统与具体硬件之间的适配层存在。在WinCE架构中,操作系统本身被设计为高度模块化和可裁剪的微内核系统,而BSP则负责将这些模块与实际物理设备进行绑定。以S3C2416为例,该处理器采用ARM926EJ-S架构,集成了多种外设控制器(如UART、I²C、USB、PWM等),但WinCE内核并不直接知道这些外设的存在或地址映射方式。 阅读详情

相关推荐

WinCE6.0嵌入式系统移植实战详解

WinCE6.0是微软推出的一款模块化、可裁剪的嵌入式操作系统,广泛应用于工业控制、智能设备及手持终端等领域。其核心架构采用微内核设计,包含OAL(OEM适配层)、内核(Kernel)、设备驱动(Drivers)与上层应用接口(GWES、Filesys等),具备良好的实时性与可移植性。系统通过模块化组件实现灵活配置,开发者可根据硬件平台特性进行定制化裁剪与功能扩展。移植WinCE6.0至新硬件平台,需完成Bootloader引导、OAL适配、驱动开发及系统集成等关键步骤。

weixin_36078669的博客 957

wince6.0 扩展DRAM方法

折腾了一个礼拜,终于在高人的指点下从5.0 扩展DRAM的圈圈里跳了出来。 wince6.0扩展内存的办法出现了一些变化,主要是将5.0的pNKEnumExtensionDRAM重新封装到OEMGLOBAL中,命名为pfnEnumExtensionDRAM,与5.0的完全不同,调用的方法也不一样。 所以在使用OEMEnumExtensionDRAM来进行内存扩展时,必须将值赋给pf

king_sundi的专栏 1084

wince6内核启动过程

详细讲解了wince6.0内核启动过程,并且还有部分代码讲解。

WinCE OAL中的RAM定制函数

在WinCE系统中,Kernel是如何使用内存的,如何知道内存的大小?是通过config.bib文件的描述,我们会在config.bib文件中MEMORY段定义WinCE内核所占用RAM的起始地址和大小,比如: MEMORY NK 80001000 01E00000 RAMIMAGE BIB文件的格式以前介绍过,这里不重复了,在config.bib中定义的是一个物理上连续...

weixin_30736301的博客 126

Dev C++调试程序方法详解

Dev C++调试程序方法详解

weixin_70641798的博客 1万+

避坑指南:麒麟系统ARM架构下PostGIS离线安装常见问题解析

本文深度解析了在国产麒麟系统ARM64架构下进行PostGIS离线安装的完整路径与核心避坑点。通过对比Docker容器化与源码编译两种部署方式的优劣,详细阐述了离线Docker环境搭建、ARM64镜像获取验证、容器化配置及常见故障排查的全流程,为在特殊环境下稳定部署空间数据库提供了一套可靠的实践指南。

Python的专栏 287

[翻译]WINCE6.0下配置BSP内存映射

配置BSP内存映射 作者:FLandY1982(flandy1982@sina.com) 日期:2010-8-23 版本:1.0 修改: 出处:http://blog.csdn.net/FLandY1982/ 格式有点乱,pdf版本在: 课程2: 配置BSP的内存映射 Windows CE6.0的

FLandY的专栏 3961

从USB 2.0到USB 3.x:Synopsys SVT USB VIP配置避坑与接口选择指南

本文详细解析了从USB 2.0到USB 3.x的Synopsys SVT USB VIP配置要点,涵盖协议版本选择、物理接口匹配及UVM层次化架构实现。重点介绍了layering sequence的配置技巧和常见问题解决方案,帮助验证工程师高效避坑并优化验证流程。

weixin_42653691的博客 238

S3C2410-WinCE6.0-OAL的启动代码分析

Code 1 INCLUDE kxarm.h 2 3 IMPORT KernelStart 4 5 TEXTAREA 6 7 ;Include memory configuration file with g_oalAddressTable 8 9 INCLUDE oemad

龙图腾的博客 1129

vue项目基于WebRTC实现一对一音视频通话

vue项目基于WebRTC实现一对一音视频通话。完整代码gitee地址: https://gitee.com/wade-nian/wdn-webrtc.git。

qq_920189602的博客 6648

【Tiny_CD】Tiny_CD变化检测网络详解(含python代码)

tiny-cd网络详解,含论文下载、代码下载地址。

向上生长的程序媛的博客 2161

WINCE OAL层简介

    Windows CE是微软针对嵌入式领域推出的一款全新的操作系统。之所以说它是一款全新的操作系统,是因为尽管Windows CE的UI非常接近其它的桌面版Windows操作系统,但是它的内核完全是重新写的,并不是任何一款桌面版Windows的精简版本。 Windows CE是一种支持多种CPU架构的操作系统,这其中包括ARM、x86、MIPS和SHx,极大地减轻了0EM开发过程中移植操作系

chenyt2007的专栏 3123

为Ollama本地大模型添加持久化记忆层:openclaw-ollama-memory项目详解

在构建基于大型语言模型(LLM)的对话应用时,上下文管理是核心技术挑战之一。其原理在于模型本身不具备跨会话的持久化记忆能力,每次请求都是独立的。这导致在多轮对话中,模型无法有效利用历史信息,用户体验割裂。从技术价值看,独立的记忆层通过解耦推理与存储,能突破模型固定上下文窗口的限制,实现更智能、连贯的交互。其核心应用场景包括聊天机器人、智能助手及需要长期记忆的复杂代理。本文聚焦的 openclaw-ollama-memory 项目,正是为 Ollama 生态提供的记忆层解决方案,它通过向量检索和智能摘要等机制

weixin_42521558的博客 312

S3C2410下WinCE6.0的启动过程详解

通过前两篇文章的介绍,我们已经知道NBOOT用来引导EBOOT,继而EBOOT加载并引导WinCE操作系统(NK)。那么,WinCE6.0的启动过程又是怎样的呢?本文基于S3C2410的平台做一个详细的分析。需要说明的是,WinCE6.0的整个启动过程对于同一类型的MCU来说大同小异,如S3C2410和PXA270同属ARM平台的MCU,所以他们的启动过程是类似的,可以说唯一的不同就在OAL处,而

codemanrock 851

基于Simulink的永磁同步电机三闭环(位置/速度/电流)伺服仿真

本文详细介绍了基于Simulink的永磁同步电机三闭环伺服控制系统的设计与实现,针对机器人关节控制场景。系统采用位置环(外环)、速度环(中环)和电流环(内环)的嵌套结构,通过精确的带宽匹配(电流环1kHz、速度环200Hz、位置环20Hz)实现亚微米级位置跟踪。文中提供了完整的Simulink建模步骤,包括主电路搭建、三环PI控制器实现及坐标变换模块,并验证了系统性能:阶跃响应时间35ms,位置误差<0.05°,正弦跟踪误差<0.15°,负载突加恢复时间0.08s。最后提出了参数自适应整定、前馈

amy_mhd的博客 279

Unity3D实现自定义河流路径或泥石流路径

此工具是一个插件,插件很好用,可以根据地形编辑河流的走向以及宽度,也可以发挥想象编辑成其他的效果,比如泥石流效果,岩浆效果,小溪,或者大江或者大河等等博客将会介绍可以编辑河流的工具的使用。希望这篇博客对Unity的开发者有所帮助。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。提示:以下是本篇文章正文内容,下面案例可供参考本次总结的就是工具的使用, 有需要会继续增加功能不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!

心疼你的一切博客 5265

Windows CE OAL层的结构与开发

Windows CE是微软针对嵌入式领域推出的一款全新的操作系统。之所以说它是一款全新的操作系统,是因为尽管Windows CE的UI非常接近其它的桌面版Windows操作系统,但是它的内核完全是重新写的,并不是任何一款桌面版Windows的精简版本。 Windows CE是一种支持多种CPU架构的操作系统,这其中包括arm、x86、MIPS和SHx,极大地减轻了0EM开发过程中移植操作系统的

S5PV210开发板-保定芯灵思 580

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WinCE6.0 EBOOT概要

为一个新的硬件设备定制WinCE6、0操作系统的主要步骤如下: 1、针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须包括BOOTLOADER、OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动。 2、利用创建的BSP,定制一个系统设计(OS Design)。即通过VS2005创建一个Platform

DriverMonkey的专栏 1116

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

S3C6410的WinCE 6.0启动过程

以S3C6410为例子,S3C6410的内部SRAM地址为0x0C00 0000 ~ 0x0C00 1FFF,DRAM的Base地址为0x50000000 ,S3C6410支持NAND,SD启动,S3C6410里面有固化的ROM, 当系统上电的时候,将执行固化ROM中的代码,然后检查硬件的GPIO配置,如果配置成NAND 启动,则把NAND的前8K读入内部的SRAM(stepping Stone

hilaochen的专栏 780

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WinCE移植流程综述-基础,入门,总结,详细

本文转载,地址:http://bbs.manbu.cc/viewthread.php?tid=9636,版权问题,马上删除此帖献给喜欢<span class="t_tag" onclick="function onclick(){tagshow(event)}">折腾的G友,这是关于<span class="t_tag" onclick="function oncl

1062

(转载)巧借WinCE BSP移植,嵌入式系统开发有捷径

<br />近期,公司让我负责一个嵌入式消费产品的开发项目。此产品原来的操作系统是WinCE 5.0,现在因应市场需求不但要增加功能更加强大的硬件,而且公司也要求把操作系统升级为WinCE 6.0。在接手此项目后,我立即开始进行操作系统的定制开发,但结果却是欲速则不达。<br />   后来,我在时间和成本的多重压力因素下反思时,发现我犯了一个致命的错误,就是为了更快的把产品推向市场,在开发过程应该是移植操作系统而不是重新定制操作系统。本文根据我在此项目上得到的经验和总结,先分析BSP移植对WinCE的重要

清闲老窝的专栏 977

wince工作总结系列:系统启动

工作两年,一直稀里糊涂的,都不知道自己知道什么,一直是处于遭鄙视阶段,虽然比较淡定,但是因为工资的动力,我还是要好好的温故而知新,系统总结一下两年时间中接触过的东西。再说csdn氛围这么好,大家都很热情大方的分享自己的所知,以此表示感谢和支持。 接触过两个系统都是微软的,一个是wince5.0一个是wince7.0(其实名字有点变化了,但是为了方便我就这么写了),因为现在用的是wince7.0,

lxc19890426的专栏 819
上一篇: 分享大学期间的比赛作品
下一篇: B1、WinCE6.0内核启动流程-------之bootloader解释
__poly__
博客等级 码龄15年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值