基于PXA255的windows ce.net的bootloader的开发

   2023-06-15 互联网3010
核心提示:  引言  随着嵌入式系统应用的发展,传统的嵌入式系统因为速度慢,操作麻烦已经越来越不适应人们生活和生产的需要。为了解决

  引言

  随着嵌入式系统应用的发展,传统的嵌入式系统因为速度慢,操作麻烦已经越来越不适应人们生活和生产的需要。为了解决这些问题,需要采用速度快的处理器,并使系统的操作人性化。ARM体系结构的PXA255和Mcriosoft的Windows ce .NET的应用能有效的解决这些问题,促进嵌入式系统的发展。在基于PXA255的windows ce.NET的嵌入式系统中,Bootloader的开发具有举足轻重的作用。

  1. Windows CE.NET 与PXA255简介

  Intel XScale微体系结构提供了一种全新的,高性价比,低功耗且基于ARMv5TE体系结构的解决方案,支持16位的Thumb指令和DSP扩充,基于XScale技术开发的微处理器可用于手机,便携式终端(PDA),网络存储设备,路由器等。Intel PXA255微处理器芯片就是一款集成了32位Intel XScale处理器核,多通信信道,LCD控制器,增强型存储控制器和PCMCIA/CF控制器以及通用I/O口的应用处理器,并支持MMU,使系统对内存的管理更加方便。

  Windows CE.NET是微软公司向嵌入式领域推出的一款嵌入式系统,它最大程度继承了桌面版Windows操作系统的丰富功能,同时又融入了新的特性,以适应嵌入式领域的实际情况和要求。在多种多样的嵌入式设备中,CE.NET是针对特定硬件的操作系统。所以作为OEM(原始设备生产商),必须根据自己的硬件平台和应用场合定制CE,其中最主要的工作是开发适合自己平台的BSP(板级支持包),而Bootloader是BSP中的重要组成部分。在使用Windows CE.NET的嵌入式系统中,创建功能完善的bootloader,是定制Windows CE.NET的首要步骤。

  2. 定制CE操作系统

  运用Microsoft提供的Platform builder来定制操作系统。PB根据用户的要求,选择不同的组件加入内核,从而生成不同的CE.NET操作系统。另外,PB也是一个集成编译环境,可以为所有CE支持的CPU目标代码编译C/C++程序,Bootloader就是在该环境下编译的。当成功编译了CE系统之后,得到一个NK .bin的映象文件,把此文件下载到目标平台,就可以运行CE平台了。

  3. Bootloader的开发

  Bootloader就是引导装载器,用来初始化目标板的硬件,给嵌入式操硬件作系统提供板上硬件资源信息,并进一步装载,引导嵌入式操作系统的运行。它是一段简单的代码,存放于平台的非易失存储介质中,比如ROM或FLASH,本文介绍的Bootloader存储在FLASH中。在Windows CE.NET操作系统的嵌入式系统中,它主要用于启动硬件,建立内存空间的映射图和下载NK.bin到目标板上,并起到一定的监控作用。Bootloader在整个系统中一般位于如图1所示的位置,由图1可以看出Bootloader是HAL的一部分。

  

  3.1 Bootloader的结构

  Bootloader为了使系统能够稳定运行,它应该为Windows ce.net的运行提供各个方面的基础,其工作流程如下图2所示。

  

  3.2 启动部分

  启动部分主要实现的是必要硬件的初始化,由汇编语言完成,并且与所选用的CPU关系密切,本文详细介绍了基于PXA255的Bootloader启动代码的开发。

  作为ARM体系结构的PXA255,支持多种模式的复位启动,主要包括硬件复位,GPIO复位,Watchdog复位。我们以硬件复位为例,详细地叙述PXA255的启动过程,也就是bootloader的启动部分。

  在硬件复位中,CPU的所有的控制器寄存器都恢复到预先定义好的Reset状态,需要被重新初始化。启动代码的具体工作流程如下图3所示,其中也包括了CPU从睡眠状态唤醒的情况,在这种情况下要从寄存器中恢复睡眠前的状态。

  首先需要初始化中断向量。一般ARM嵌入式系统的程序都是固化在从00000000H开始的低端FLASH空间中,中断向量表VectorTable也是固化在FLASH中,因此其中断向量表是提前设置完成,一般不允许在运行的时候动态改变。PXA255跟其他ARM体系结构的芯片一样,具有固定的七个中断向量,这个步骤跟其他所有的ARM芯片是一样的。

  接下来的工作是初始化片上系统,PXA255包括很多片上控制器,但在Bootloader中,只对必要的片上系统进行初始化,主要按以下步骤完成:

  1) PXA255进入管理模式。通过操作协处理器CP15,使CPU进入管理模式,关闭MMU,及数据/指令Caches,并排空数据/指令Caches和缓冲器。

  2) 初始化GPIO口。PXA255具有84个GPIO,但因为芯片的高集成性,大部分GPIO口是多功能复用的,为了是用户更好的使用这些GPIO,Intel公司为用户提供了大量的寄存器,用户根据自己的需要,通过读写相关的寄存器来对这些GPIO的方向,状态,功能进行配置,以达到特定要求。

  3) 初始化存储控制器。这部分主要包括对对静态和动态存储空间以及卡空间进行配置。在对存储控制器的初始化中,对SDRAM控制器的初始化是非常重要的。对SDRAM的时钟进行配置,并使能及运行之后,禁止所有的SDRAM分区,关闭Cache及MMU,对禁止分区进行访问,引起自动刷新,然后再重新开启Cache并使能所有的分区。

  4) 初始化中断控制器及时钟。在中断控制器中,禁止所有的中断之后,根据系统的要求,写内核时钟配置寄存器,写入L,M,N的值以设定CPU的存储器时钟以及在Run模式和Turbo模式的时钟频率,然后执行一个时钟变化序列,并重新启动存储控制器。

  5) 初始化系统定时器,实时时钟RTC以及电源管理器。对系统定时器和实时时钟的初始化,主要是把各自的计数器寄存器清零;对电源管理器的初始化则是对电源管理器器寄存器对睡眠模式进行设置。

  6) 使能时钟并向串口显示CPU的基本信息。使能所有片上系统的时钟,并初始化一个串口,并向串口输出CPU的其版本信息,时钟信息等。这个串口同时也将用于主控程序中调试信息的输出。

  7) 初始化存储管理单元MMU。MMU的功能主要是实现对内存的管理,特别实现物理地址与虚拟地址的映射。在Windows ce.NET的BSP中有一个OEMaddressTable,MMU就是根据这个表完成虚拟地址与成物理地址的映射。下面我们就对MMU的初始化进行详细的介绍:

  I. 加载OEMaddressTable的相对虚拟地址。

  II. 搬运Bootloader到动态存储器SDRAM。Bootloader虽然要在RAM中运行,但最初是安装在FLASH中启动地址处,现在SDRAM已经配置,所以要把整个Bootloader映像拷贝到SDRAM中。

  III. 根据OEMaddressTable建立MMU的第一级段描述符,包括可缓存和不可缓存的两部分,从SDRAM的起始地址分别映射到0x80000000和0xA0000000两个虚拟地址,并保存描述府保存在SDRAM中。

  IV. 使能MMU,并排空数据/指令快表以及缓冲器;为PXA255的管理模式建立栈空间,跳转到Bootloader主控部分的main()函数。

  对于同一种CPU来说,其初始化流程和对寄存器的定义可以不加改动。对存储空间的初始化要根据系统选择的存储器,对配置进行修改,特别是时序的配置;对MMU的初始化,就是用汇编语言完成虚拟地址映射并且把得到的描述符保存的过程。启动部分是Bootloader中重要的一部分,因为与PXA255的寄存器关系密切,所以这里只描述需完成的工作,对寄存器的具体操作不作详细介绍。

  3. 3 主控部分

  从这部分开始,所有功能都是有C语言实现的。

  主控部分来实现OEM平台的初始化,映象下载,调试串口以及写FLASH代码的实现。

  根据图2可知,Bootloader都设计成支持命令输入的方式,通过串口来显示启动信息并接收用户的命令,这样用户可以控制系统的启动过程,并可以根据需要添加控制命令。一般情况下,为了调试串口的命令界面包括加载已有的Windows ce.net系统映象,从网口下载新的系统映象,对网口的IP选项设置,以及对FLASH格式化等。通过这些命令,用户可以更好的调试系统。

  在代码中我们把它分为公用函数,FLASH函数,下载函数三部分,在Microsoft提供的代码中,可以找到几乎所有的代码模型,用户可以根据自己的需要进行修改,这里就不作详细的叙述。

  通过Platform Builder编译产生的操作系统,通过网口下载到目标板上。CE的映象文件为NK.bin,它是Windows ce.net的二进制数据格式文件,在下载的过程中,用户需要初始化以太网的设置,建立TFTP连接,通过UDP数据包实现映像文件的传输。需要特别注意的是如果映像直接下载到RAM空间,则可以直接参考例程实现,若是下载到FLASH ,应该先下载到RAM然后再导到FLASH中。

  3. 4 Bootloader的编译,链接与下载

  与其他的Windows ce .NET的系统文件一样,Bootloader通过.bib文件来来配置其编译链接过程。.bib文件一般包括MEMORY, MODULE, CONFIG三部分, 如下所示

  MEMORY

  EBOOT 80078000 00040000 RAMIMAGE

  RAM 80068000 00008000 RAM

  STACK 80000000 00068000 RESERVED

  SECTBUFF 80077C00 00000400 RESERVED

  DRV_GLB 83CC3000 00001000 RESERVED

  BLOCK_BUF 83E30000 00080000 RESERVED

  CONFIG

  COMPRESSION=ON

  SRE=ON

  ROMSTART=80078000

  ROMWIDTH=32

  ROMSIZE=00040000

  MODULES

  nk.exe $(_TARGETPLATROOT)arget$(_TGTCPU)$(WINCEDEBUG)eboot.exe EBOOT

  MEMORY部分定义了生成映像的目标地址,对程序运行时内存空间的使用做了定义。CONFIG部分:COMPRESSION用来定义是否对目标代码进行压缩;SRE定义是否生成格式位sre的目标代码;ROMSTART,ROMWIDTH,ROMSIZE定义了FLASH中存放bootloader的起始地址,大小,宽度。MODULES部分定义了Bootloader中所包含的文件。

  在PB中,通过build –c 和romimage 两个命令行,生成对bootloader映像。

  对于Bootloader的下载,用户可以根据自己的需要选择用仿真器下载,调试程序下载也可以直接写入FLASH。

  4. 结论

  本文以PXA255为例,介绍了Windows ce.net的Bootloader的开发。针对不同的CPU开发Bootloader,首先要了解CPU的内核结构,指令系统以及片上资源;其次要了解Windows ce.net的基本原理和运行模式;在具体的设计中要根据自己的需要灵活变通。通过以上方法开发的Bootloader,充分提高了电能校验仪系统的稳定性,完全达到了预期效果。


 
举报收藏 0打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  隐私政策  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  RSS订阅