基于ARM的Windows CE内核启动分析

[复制链接]
 楼主| high 发表于 2007-12-30 22:48 | 显示全部楼层 |阅读模式
写点小文,,或许有帮助.到下面链接获得更好阅读效果.<br />http://groups.google.com/group/wince_cn/web/armwindows-ce?hl=zh-CN<br /><br />基于ARM的Windows&nbsp;CE内核启动分析<br />移植或者创建一个BSP,也许需要先熟悉Windows&nbsp;CE的内核启动过程.<br /><br /><br />目录<br />基于ARM的Windows&nbsp;CE内核启动分析&nbsp;&nbsp;&nbsp;&nbsp;1<br />1.startup.s&nbsp;&nbsp;&nbsp;&nbsp;2<br />2.KernelStart&nbsp;&nbsp;&nbsp;&nbsp;2<br />2.1&nbsp;ARMInit()&nbsp;&nbsp;&nbsp;&nbsp;3<br />2.1.1&nbsp;OALIntrInit&nbsp;&nbsp;&nbsp;&nbsp;3<br />2.1.2&nbsp;OALTimerInit&nbsp;&nbsp;&nbsp;&nbsp;4<br />2.1.2.1&nbsp;Variable&nbsp;Tick&nbsp;Scheduler&nbsp;&nbsp;&nbsp;&nbsp;4<br />2.2&nbsp;KernelInit()&nbsp;&nbsp;&nbsp;&nbsp;4<br />2.3&nbsp;FirstSchedule&nbsp;&nbsp;&nbsp;&nbsp;5<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />&nbsp;<br />1.startup.s&nbsp;&nbsp;&nbsp;&nbsp;<br />内核入口点startup.S,内核从这里启动.因为内核经过bootloader加载,内核运行时候,已经由bootloader完成了硬件的基本初始化(关闭watchdog,&nbsp;pll设置等等)所以,startup.S的任务比较简单,只是将oemaddrtab_cfg.inc里面的g_oalAddressTable数组地址作为参数,传递给KernelStart,这个数组用来描述和实现物理地址到虚拟地址的映射.<br /><br /><br /><br /><br /><br />(.&nbsp;+&nbsp;8)是流水线处理.KernelStart()位于<br />PRIVATEWINCEOSCOREOSNKKERNELARMarmtrap.s<br /><br /><br /><br /><br />2.KernelStart<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br /><br /><br /><br />ARMInit()位于本目录的mdram.c文件.<br />KernelInit()位于PRIVATEWINCEOSCOREOSNKKERNELkwin32.c中.<br />FirstSchedule()位于armtrap.s的一个label.<br />主要关注ARMInit()和KernelInit(),前一个进行目标板的初始化,后一个负责内核的初始化.FirstSchdule()开始调度第一个程序.<br /><br /><br /><br /><br />2.1&nbsp;ARMInit()<br />先看看ARMInit()它的几个关键性动作如下:<br /><br /><br /><br /><br /><br /><br /><br />KernelRelocate()是进行重定位.KernelFindMemory()是查找系统可用内存,并分成应用内存和object&nbsp;store两部分.这2个函数都已由MS自己实现.我们需要添加的函数是名字以OEM开头的函数.<br />OEMInitDebugSerial()初始化一个调试口,我们一般使用一个串口来作为调试口,这个函数需要自己实现,在&nbsp;PLATFORMSMDK2440ASrcKernelOaldebug.c中定义这个函数.比如可以将串口0设置为调试口,在这个函数中对串口0进行初始化.<br /><br />OEMInit()是一个比较重要的函数,<br /><br /><br /><br /><br /><br /><br /><br /><br />OALCacheGlobalsInit()在PLATFORMCOMMONSRCARMCOMMONCACHEinit.s中实现,这部分代码以PQOAL的形式提供.<br />OALIntrInit()初始化中断.<br />OALTimerInit()初始化定时器TIMER4,作为系统时钟(tick),<br />configGPIO()初始化gpio口,设置相关寄存器.<br />InitDisplay()初始化LCD.有时候,我们希望在oal启动和内核加载期间显示一副等待图片或者显示**,为达到这个目的,需要先初始化LCD.<br />OALKitlStart()准备启动KITL.<br />此外,在ARMInit还会通过调试口打印一些基本信息,开始时候打印”Windows&nbsp;CE&nbsp;Kernel&nbsp;for&nbsp;ARM….”字样,&nbsp;中间打印处理器类型等等信息.结束时候打印”&nbsp;ARMInit&nbsp;done.”<br /><br />2.1.1&nbsp;OALIntrInit<br />调用OALIntrMapInit()初始化2个数组g_oalSysIntr2Irq,g_oalIrq2SysIntr,这2个数组表征irq和逻辑中断SysIntr的映射关系.<br />然后初始化中断寄存器,<br />最后,留一个接口给oem:&nbsp;BSPIntrInit(),如果oem需要在这个阶段初始化一些中断,可以定义这个函数并实现.<br /><br /><br /><br /><br />2.1.2&nbsp;OALTimerInit<br />这个函数比较重要.&nbsp;都知道所有WinCE系统都需要一个定时器来提供一个heartbeat,<br />&nbsp;<br /><br /><br /><br /><br /><br /><br />g_oalTimer包含各种系统时钟相关的变量.<br /><br />curridlehigh,&nbsp;curridlelow,这2个32位的DWORD变量合起来实现一个64位的计数器,反映了系统处于空闲模式(Idle&nbsp;mode)的时间。一般在OEMIdle()函数内更新。用户程序通过调用GetIdleTime()函数可以得到这个值。<br /><br />初始化内核函数指针:pQueryPerformanceFrequency,&nbsp;pQueryPerformanceCounter.通过这两个函数实现高精度的计时器.&nbsp;这两个函数的原型也已经由PQOAL实现.<br /><br />初始化TIMER4作为系统时钟.TIMER4是一个16bit的定时器.此函数将TIMER4设置成为自动转载模式.<br /><br />2.1.2.1&nbsp;Variable&nbsp;Tick&nbsp;Scheduler<br /><br />可变的系统时钟节拍,这个是WinCE5.0中增加的新的性能.<br />每一次定时器中断时候,内核分析所有线程后决定切换到哪个线程运行.假如所有线程都在等待状态,系统将进入idle状态.在这个状态的时候,任何中断都会唤醒系统重新开始调度.一般系统大部分时间是处于idle状态的,内核会调用OEMIdle()进入idle状态,我们已经知道这个状态会被任何中断唤醒.&nbsp;在以前的版本中,系统中断(即上面的TIMER4中断)每毫秒产生一次,查看系统是否需要重新调度.&nbsp;为了节电,不希望中断那么频繁.于是WinCE5.0中,在调用OEMIdle()之前会先调用pOEMUpdateRescheduleTime().通过这个函数重新设置侠义次系统时钟中断的时间.<br />2.2&nbsp;KernelInit()<br />再看看KernelInit()函数<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;不过多关注KernelInit().<br />2.3&nbsp;FirstSchedule<br />位于armtrap.s的一个label.开始第一个线程调度.整个内核开始运行.<br /><br /> 相关链接:<a href='http://groups.google.com/group/wince_cn/web/armwindows-ce?hl=zh-CN'>http://groups.google.com/group/wince_cn/web/armwindows-ce?hl=zh-CN</a>
老狼 发表于 2008-1-2 00:54 | 显示全部楼层

怎么没人捧场呀?

支持一下!继续!
hotpower 发表于 2008-1-2 01:52 | 显示全部楼层

很好~~~俺也喜欢WINCE~~~因为按喜欢WINAPI...

有机会跑跑WINCE~~~
老狼 发表于 2008-1-2 17:06 | 显示全部楼层

我现在算是看透了,还是裸奔最爽!

但是用wince做界面,的确效率快呀,改动起来也方便!外加触摸屏,说实在的,就是傻瓜都会操作,写说明书省事儿多了,
 楼主| high 发表于 2008-1-2 19:15 | 显示全部楼层

有没有弄个.net mf

据说都不要mmu.
yangfanyh 发表于 2008-1-2 21:41 | 显示全部楼层

不错

不错<br />
老狼 发表于 2008-1-2 23:13 | 显示全部楼层

.NET Micro Framework

没用过,你用过?
老狼 发表于 2008-1-3 20:35 | 显示全部楼层

老大,这个东东不太好!

我看了这个东东资料,感觉不太好,不是实时的,没太大意思。本意是哪种CPU都可以用,连8位机都可以用,8位机上操作系统,有点扯蛋。低档的设备上操作系统,没啥搞头,还不如直接裸奔,wince&nbsp;的最大看点就是界面,感觉上这个还不如上&nbsp;uc/os&nbsp;or&nbsp;threadx.
 楼主| high 发表于 2008-1-3 22:40 | 显示全部楼层

这个不是操作系统也不需要操作系统吧

我那天看资料好像是这么说的.
老狼 发表于 2008-1-4 00:04 | 显示全部楼层

在.NET MF中,操作系统倒成了可选的组成部分

来源链接:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1515918<br /><br />2月12日,微软发布了.NET家族中的新成员——.NET&nbsp;Micro&nbsp;Framework(简称.NET&nbsp;MF)。而就在短短的几天之内,这款新品已经收到业界的广泛关注。<br /><br />.NET&nbsp;MF面向的是CPU处理能力和存储能力极其有限的设备。虽然微软拥有Windows&nbsp;CE、Windows&nbsp;XP&nbsp;Embedded和.NET&nbsp;Compact&nbsp;Framework,可以完成绝大多数嵌入式开发,但对于更普遍的家用电器领域(如电视、手表、洗衣机等),这些平台还是显得太大了些。可以想象,给你的电冰箱装块硬盘是多么搞笑的事。而.NET&nbsp;MF的出现,则标志着微软又向百姓生活迈进了一步,让所有家电都“智能”起来,已经是一个不远的梦。因为所需要的仅仅是便宜的,ARM处理器和一些RAM、Flash存储器。<br /><br />够了。Anders&nbsp;Liu是搞技术的,至少目前还是,作评论和展望不是Anders的强项。目前很多关于.NET&nbsp;MF的介绍都是面向业界的新闻、评述性的,而本文中Anders&nbsp;Liu将从技术人员的角度上,对.NET&nbsp;MF进行简要介绍。本文主要介绍的是.NET&nbsp;MF的技术特性,暂时还不包含开发技术。因为Anders也是刚刚接触这个东西不久。<br /><br />概述<br /><br />.NET&nbsp;MF是微软最新推出的嵌入式平台、专门用于处理能力和存储能力都更加有限的设备。既然微软已经拥有.NET&nbsp;Compact&nbsp;Framework(简称.NET&nbsp;CF),为什么还要再提供.NET&nbsp;MF呢?设备的限制是一个很重要的原因,.NET&nbsp;CF毕竟还是要求设备有比较强的处理和存储能力。两者重要的一个区别在于,.NET&nbsp;CF需要有Windows&nbsp;CE系列OS的支持才能得以运作,而.NET&nbsp;MF则提供了一个可引导的运行时环境。<br /><br />在.NET&nbsp;MF中,操作系统倒成了可选的组成部分。在本文后面内容中,Anders&nbsp;Liu还会提及这一点。<br /><br />既然.NET&nbsp;MF是可引导的,那么它实际上也相当于一个带有运行时环境的操作系统。那么,它又和Windows&nbsp;CE、Windows&nbsp;XP&nbsp;Embedded操作系统有哪些区别呢?下面的表格对比了几种平台的区别。<br /><br />&nbsp;<br />&nbsp;.NET&nbsp;Micro&nbsp;Framework<br />&nbsp;Windows&nbsp;CE<br />&nbsp;Windows&nbsp;XPe<br />&nbsp;<br />Example&nbsp;Devices<br />&nbsp;Sensor&nbsp;Nodes,&nbsp;Aux&nbsp;displays,&nbsp;Health&nbsp;Monitoring,&nbsp;Remote&nbsp;Controls,&nbsp;Robotics<br />&nbsp;GPS&nbsp;Handhelds,&nbsp;PDAs,<br /><br />Automotive,&nbsp;Set&nbsp;Top&nbsp;Boxes<br />&nbsp;Thin&nbsp;Clients,&nbsp;ATMs,&nbsp;Kiosks<br />&nbsp;<br />Device&nbsp;Features<br />&nbsp;Connected,&nbsp;Small,&nbsp;Wearable,&nbsp;Graphical&nbsp;UI<br />&nbsp;Connected,&nbsp;Graphical&nbsp;UI,&nbsp;Server,&nbsp;Browser,&nbsp;RAS,&nbsp;DirectX<br />&nbsp;PCclass&nbsp;performance,<br /><br />PC&nbsp;networking<br />&nbsp;<br />Footprint<br />&nbsp;250-500KB&nbsp;managed&nbsp;code<br /><br />Full&nbsp;featured<br />&nbsp;300KB+&nbsp;without&nbsp;managed&nbsp;code<br /><br />12MB&nbsp;with&nbsp;managed&nbsp;code<br />&nbsp;40MB&nbsp;+&nbsp;Depending&nbsp;on&nbsp;features<br />&nbsp;<br />Power<br />&nbsp;Very&nbsp;low&nbsp;power<br />&nbsp;Low&nbsp;power<br />&nbsp;Mains&nbsp;power<br />&nbsp;<br />CPU<br />&nbsp;ARM7,&nbsp;ARM9,&nbsp;No&nbsp;MMU<br />&nbsp;X86,&nbsp;MIPS,&nbsp;SH4,&nbsp;ARM,<br /><br />with&nbsp;MMU<br />&nbsp;X86<br />&nbsp;<br />Real-time<br />&nbsp;Not&nbsp;Real-time<br />&nbsp;Hard&nbsp;Real-time<br />&nbsp;Real-time&nbsp;capable&nbsp;through&nbsp;3rd&nbsp;party&nbsp;extensions<br />&nbsp;<br />Managed&nbsp;vs.&nbsp;Native&nbsp;Code<br />&nbsp;Managed&nbsp;via&nbsp;.NET&nbsp;Micro&nbsp;Framework,<br /><br />native&nbsp;code&nbsp;through&nbsp;interop&nbsp;only.<br />&nbsp;Supports&nbsp;both,<br /><br />managed&nbsp;code&nbsp;requires&nbsp;.NET&nbsp;Compact&nbsp;Framework<br />&nbsp;Supports&nbsp;both,&nbsp;managed&nbsp;code<br /><br />requires&nbsp;.NET&nbsp;Framework<br />&nbsp;<br /><br /><br />&nbsp;<br /><br />表1:各种嵌入式平台对比(资料来源:http://msdn2.microsoft.com/en-us/embedded/bb278106.aspx)<br /><br />&nbsp;<br /><br />从上表可以看出,无论是资源占用还是耗电,.NET&nbsp;MF都要优于另外两种OS。但是,我们也看到了,在实时性方面,.NET&nbsp;MF并不是一款实时的运行时环境。这可能需要我们注意的一个重要方面。<br /><br />&nbsp;<br /><br />在工业应用中,实时性往往是评判一个嵌入式系统的重要因素,这就意味着,.NET&nbsp;MF并不适用于重要的控制领域。不过,一般工业用系统都不会面临硬件过分有限的困境,完全可以使用WinCE或XPe作为基础OS。<br /><br />&nbsp;<br /><br />反观民用领域,嵌入式应用正在逐渐渗透人们的生活。而当面对普通消费者时,评判一个嵌入式系统的重要标准——AndersLiu认为——就应该是:低成本。这包括两个方面,一是低的造价(软硬件成本,价格),另外一方面就是易用(这可以理解为学习成本和时间成本)。毕竟老百姓买不起和机床一样价格的洗衣机,也不希望像操作机床那样操作微波炉。<br /><br />&nbsp;<br /><br />因此,民用嵌入式设备往往通过较低的硬件配置来降低价格,并通过适量(通常比较少)的按键和显示内容来降低使用复杂度。而这一切,都是.NET&nbsp;MF得以大显身手的地方。<br /><br />&nbsp;<br /><br />可以看出,微软关于.NET&nbsp;MF的定位还是相当明确的——面向民用低成本嵌入式市场。下图是一两年前流行过一阵的新闻图片,传闻Gates腕上的SmartWatch中安装的,就是.NET&nbsp;MF的原型。<br /><br />&nbsp;<br /><br /><br /><br />&nbsp;<br /><br />图1:Bill&nbsp;Gates和Smart&nbsp;Watch(资料来源:http://www.microsoft.com/presspass/press/2003/jan03/01-08ces2003overallpr.mspx)<br /><br />&nbsp;<br /><br />下图给出了.NET&nbsp;MF的技术架构。相较于.NET&nbsp;Framework,.NET&nbsp;MF多出了CLR之下的PAL(平台适配层,Platform&nbsp;Adaptation&nbsp;Layer)和HAL(硬件适配层,Hardware&nbsp;Adaptation&nbsp;Layer,这两层使得.NET&nbsp;MF可以直接运行在硬件上,并提供基本的Timer、IO和内存管理等功能。而HAL也可以通过OS代替,在硬件资源相对充裕的情况下,这可以降低.NET&nbsp;MF的设计复杂度,并提供更多功能。<br /><br />
老狼 发表于 2008-1-4 00:05 | 显示全部楼层

图2:NET MF技术架构

老狼 发表于 2008-1-4 00:37 | 显示全部楼层

high:我犯错误了。

得学习呀,得向老大学习!我一直以为微软的东西就一定得有操作系统!只看到不是实时的,就妄下断言!我错了,我有罪!<br /><br />老大,你下载了吗?哪天下载玩玩!<br /><br />Microsoft&nbsp;.NET&nbsp;Micro&nbsp;Framework&nbsp;SDK&nbsp;2.0&nbsp;SP1<br /><br />Microsoft&reg;&nbsp;.NET&nbsp;Micro&nbsp;Framework&nbsp;综合了托管代码的可用性和更高的效率以及优秀的Visual&nbsp;Studio开发工具,为嵌入式程序开发人员提供了简便的方法.<br />该SDK支持利用C#开发代码,设备I/O,调用.NET&nbsp;libraries,完全兼容Visual&nbsp;Studio开发环境(该版本需要Visual&nbsp;Studio&nbsp;2005&nbsp;SP1以上)<br />该下载包含完整的SDK,可以让你直接编写代码并运行在扩展设备上,并部署到真实设备.<br /><br /><br /><br /> <br /> 相关链接:<a href='http://down.zdnet.com.cn/detail/9/81562.shtml'>http://down.zdnet.com.cn/detail/9/81562.shtml</a>
 楼主| high 发表于 2008-1-4 19:29 | 显示全部楼层

那个vs2005的sp1恐怖的要死!

上次安装过一次.太变态了.太痛苦了.
老狼 发表于 2008-1-4 23:02 | 显示全部楼层

真冷呀!

他娘的,就俺俩人,你打板,我来唱,连个看客都没有!连你那两个小弟都不来。老hotpower&nbsp;也不来!
老狼 发表于 2008-1-4 23:06 | 显示全部楼层

改名吧。没出路了!

就叫&nbsp;wince驱动开发/编程。
john1986 发表于 2008-1-4 23:43 | 显示全部楼层

没办法

写给高手看滴,俺们这些菜鸟没法懂啊
liguojun06 发表于 2008-3-9 14:37 | 显示全部楼层

行行好啊

你们几位老大可不可以写点简单易懂的啊,让像我这类的菜鸟一看就忽地医生对WCE有了感觉的那种东东啊,不然得话你们就是说的再好我们也像听天书啊!!嘿嘿!!!<br />&nbsp;
sasinop 发表于 2008-3-9 22:15 | 显示全部楼层

先占着慢慢看 呵呵

其实对用户来说只要&nbsp;关心OEM&nbsp;就可以<br /><br />
sasinop 发表于 2008-3-9 22:17 | 显示全部楼层

呵呵

还有裸奔是方便,对地层来说,控制方便,加上系统,老烦呢<br /><br />但为了二次开发或应用层开发,还是用系统的好嘿嘿<br />
xiaoaihua 发表于 2008-3-10 20:38 | 显示全部楼层

来凑个热闹!

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

1078

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部