基于eCos操作系统的FLASH驱动程序分析与移植

发布者:自由探索者最新更新时间:2009-12-25 来源: 现代电子技术关键字:eCos  移植  Flash  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

0 引 言

    嵌入式系统需要支持的外部设备种类繁多,如何构造运行良好的嵌入式设备的驱动程序,对嵌入式操作系统的实际应用有重要意义。eCos是一种源代码公开的实时嵌人式操作系统,对嵌入式应用具有良好的支持,内核专门设计了便于设备驱动管理和开发的I/O包和DEV包,开发人员可以方便地将自己开发的驱动程序加入其中,与别的系统组件一起进行配置。

1 系统目标板简介

    硬件目标板是为无人机系统设计的系统开发板,它是从Arca系统测试板经过功能简化设计而来的满足无人机系统要求的目标板。硬件目标板如图1所示。

    GT2000支持SRAM,FLASH,ROM,VLIO(静态段支持可变等待时间I/O设备)和SDRAM(同步动态RAM)等外部扩展存储器。GT2000的外部地址空间是按体(bank)划分的,有四个体属于静态存储器区域,由引脚CS0~CS3选择,在将FLASH,SRAM,VLIO(用作其他外设接口)等静态I/O设备地址分别设计在CS0~CS2区域内,由GT2000内部的外部内存访问接口(EMI)控制器中的静态内存访问控制寄存器(SMCR)进行访问控制,分配地址访问接口。

    系统目标板选用两片Intel公司的TE28F320的FLASH(16位)并联获得32位总线宽度。Intel公司的TE28F320是32 Mb(2 M×16 b)多功能FLASH,2.7~3.6 V单电源供电,读取时间为70 ns,封装格式为48-Pin TSoP(12 mm×20 mm)或48-Ball TFB-GA,可被擦写10 000次。方舟的JTAG仿真器支持TE28F320 FLASH,可以通过JTAG接口进行在线读写和擦除,这给调试程序和硬件提供了方便。

    FLASH的电路原理图以及GT2000的引脚“DACK[2..1]/MD_MEM[1..0]”设置如图2所示。

2 eCos驱动程序的体系结构与驱动程序设计模式

    eCos操作系统的设备驱动程序通常包含以下内容:提供一些底层函数,负责完成设备初始化与配置、注册设备,从设备收发数据、控制设备、处理设备中断等,并进行设备管理。eCos操作系统内核支持设备驱动程序的同步、计时、内存管理、缓冲区管理、设备名空间及资源管理等。

    eCos系统的I/O包中包含了设备的驱动程序接口模块,全部是以组件的形式存在。设备驱动程序模块支持系统设计的分层结构。设备I/O包中的程序需要使用设备DEV包中的程序,而设备DEV包中的程序需要调用eCos的硬件抽象层包中的底层接口函数,如图3所示。

2.1 设备驱动程序用户API

    eCos为应用程序提供了一组用户API函数,这些操作包括对设备进行初始化和配置,获取配置信息,对设备进行读写等。设备驱动程序必须使用设备句柄进行设备操作,通过cyg_io_lookup()函数把设备在系统中的惟一名字映射成设备句柄。

2.2 eCos驱动程序与内核及HAL的接口

    应用程序在使用设备的时候,通过驱动程序的用户API函数访问设备驱动程序,设备驱动程序又调用设备内核API函数与内核和硬件抽象层HAL进行交互,设备驱动程序和内核又通过硬件抽象层HAL对硬件平台进行操作。

    eCos内核向设备驱动程序提供调度、时钟、同步、中断等内核服务的支持。在某些嵌入式应用中,部分内核服务并不是必需的。在配置时不选择Kernel包,设备驱动程序的内核服务支持由硬件抽象层提供。

    HAL包含所有与平台相关的代码,是eCos操作系统对硬件进行的抽象定义,它直接控制和访问硬件,为eCos内核和高层代码提供服务。

    I/O包和DEV包构成了eCos驱动程序的基本框架。设备驱动程序一般分为三个部分,分别为设备表入口DEVTAB_ENTRY、设备I/O函数表DEVIO_TAB和设备I/O函数。I/O包提供抽象的设备操作支持,应用程序访问设备时使用逻辑设备名,每个设备都对应一个惟一的逻辑设备名。DEV包提供设备操作的底层实现,对硬件通过HAL直接操作。

    eCos中的所有设备驱动程序都使用设备表入口进行描述。设备表入口使用宏DEVTAB_ENTRY()可以生成一个设备表入口数据结构。其中,_handlers指向DEVIO_TABLE入口函数。提供用户应用程序的调用支持;_priv指向设备真正的硬件操作数据结构,提供硬件设备与上层软件的交互。设备I/O入口宏定义如下:

2.3 设备驱动程序的设计模式

    一般来说,eCos提供了三种驱动程序设计模式。设备驱动程序与内核和HAL之间的API接口主要对中断以及中断处理程序的ISR,DSR和线程的同步进行控制和管理。eCos设备驱动程序的中断模块分为三个层次,分别是中断服务程序ISR,中断滞后服务程序DSR和中断线程。中断服务程序ISR在响应中断时立即调用,中断滞后服务程序DSR由ISR发出调用请求后执行,中断线程为驱动程序的客户程序。具体为硬件抽象层HAL对硬件中断源译码,并在最短的时间内调用ISR中断服务程序,ISR对硬件中断可以立即处理,但限于与中断线程交互较少的设备。大多数情况下,需要请求相应的中断滞后服务程序DSR进入线程调度运行,DSR将在ISR执行完成后立即运行。如果需要复杂的中断服务则要用户自己定义中断线程。对于一个具有中断的设备驱动程序,必须提供ISR和DSR。

3 基于方舟开发板的Inter FLASH驱动程序分析与移植

3.1 Inter公司的TE28F320的FLASH芯片驱动程序分柢

    Inter FLASH驱动程序FLASH_28fxxx.inl文件定义了FLASH设备低层的管理设备I/O函数,FLASH_28fxxx_parts.inl文件定义了FLASH设备逻辑信息。eCos系统I/O包使用DEVTAB_ENTRY()和DEVIO_TABLE()定义的_priv指针对FLASH设备低层I/O函数进行调用。具体定义如下:

3.2 系统地址空间的分配方案

    当MMU内存管理单元的控制寄存器MCR.ATE为0时,地址映射方式变为直接映射物理方式,如图4所示。

    直接映射方式的映射关系是:在使用高速缓存方式时将虚拟地址A1区域(0x80000000~0xA0000000)映射到实际物理地址0x00000000~0x20000000的区域;根据目标开发板的设计规范,系统的FLASH的物理地址从0x00000000开始,系统设计编写程序时使用相应的虚拟地址空间为0x80000000~0x80FFFFFF。SRAM的物理地址从0x04000000开始,使用相应的虚拟地址空间为0x84000000~0x84200000。

3.3 修改eCos硬件抽象层中FLASH和SRAM的配置信息以及FLASH设备驱动程序

    不同的两块开发板所采用的芯片,特别是FLASH芯片有可能是不一样的。由于为无人机专门设计开发的目标板使用的是Inter公司的TE28F320的FLASH芯片,与Arca公司使用的FLASH驱动程序不一样,必须修改FLASH驱动及FLASH和SRAM的配置信息。

    (1)SRAM布局文件修改如下:

   

    (3)FLASH驱动程序FLASH_28fxxx.inl文件中的数据定义修改如下:

        


    (4)修改平台抽象层文件plf_hci.h文件

    由于目标开发板上没有采用EEPROM和HCI(硬件配置接口)的方式存储系统硬件信息,而是采用在eCos平台抽象层中把开发板上的硬件信息静态存储在文件中。在平台抽象层文件plf_hci.h中修改如下:

4 驱动测试

4.1 Redboot简介

    Redboot是一个标准的嵌入式系统引导和Debug环境,是基于eCos的一个应用程序,使用eCos的硬件抽象层作为它的基础。内含GDBstub,允许从应用程序调试的GDB宿主机链接目标平台,通过串口或网口进行调试。既可以用在产品的开发阶段(调试功能),也可以用在最终的产品上。

4.2 系统测试结果

    使用eCos图形配置工具对修改好的eCos硬件抽象象层和FLASH设备驱动程序进行裁剪,并用串口进行系统测试,通过minicom显示Redboot运行的FLASH和SRAM地址结果如图5所示。

5 结语

    本文通过裁剪和移植FLASH驱动程序到目标开发板上,展示上具体的修改硬件抽象层和设备驱动程序代码方法。通过实际裁剪,配置一个具有实际应用价值的Redboot,对于嵌入式技术的学习和应用具有现实的意义。本文的难点在于eCos硬件抽象层和设备驱动程序源代码的理解和修改。

关键字:eCos  移植  Flash  驱动程序 引用地址:基于eCos操作系统的FLASH驱动程序分析与移植

上一篇:基于S3C2410A的嵌入式系统的U-Boot移植
下一篇:嵌入式OS烽火再起 微软称霸胜算几何?

推荐阅读最新更新时间:2024-05-02 20:57

后奇梦达时代来临 DRAM、SDRAM、Flash得利
奇梦达(Qimonda)向德国政府申请破产后,全球将近10%的DRAM产能确定人间蒸发,激励农历春节假期后的开工首日,DRAM品牌和eTT的颗粒价格即大涨25%,创下近年来最剧烈的单日涨幅,各家DRAM厂虽然不意外,但仍是掩不住笑意,认为全球DRAM产业Bottom Fire机制终于有人出局!存储器模块厂也毫不迟疑地着手调涨DRAM合约价,1GB容量的DDR2模块价格大涨20%,而2GB模块价格也调涨至21美元,大赚库存利益,且带动DRAM产业走出最黑暗的谷底。 DRAM产业殊死战打了将近1年之久,各界都在打赌,是台湾的DRAM业者会先弃甲投降?还是德系业者会先被判出局?或是双双携手走向夕阳余晖?然2009年开春不久
[焦点新闻]
人工智能医学获突破 AI可助力器官移植匹配度预测
据悉,澳洲墨尔本奥斯汀肝移植健康中心的主管Jones跟他的同事Lawrence Lau一起开发出一个算法,可以帮助医疗机构更好地匹配器官捐赠者和器官接受者。他们计划利用特别设计的人工智能程序来提高肝脏移植匹配的准确性,进而最大程度避免移植失败和病人死亡的情况。 (人工智能医学获突破 AI可助力器官移植匹配度预测 图片来源:百度图片) 回望1988年,当Bob Jones正在做一台肝脏移植手术时,他一定想不到29年以后,他会对人工智能充满兴趣。 Jones是澳洲墨尔本奥斯汀肝移植健康中心的主管,他跟他的同事Lawrence Lau一起开发出一个算法,可以帮助医疗机构更好地匹配器官捐赠者和器官接受者。Jone表示,他们计划利用特别设
[嵌入式]
把GuiLite移植到STM32上
1 Gui移植结果 一些演示效果: 2 GuiLite介绍 GuiLite是一个开源的图形用户界面框架,只依赖于一个单一的头文件库(GuiLite.h),不需要很复杂的文件管理,代码量平易近人。 GuiLite由4千行C++代码编写,单片机上也能流畅运行,其最低的硬件运行要求如下: GuiLite具有很强的跨平台特性: 支持的操作系统:iOS/macOS/WatchOS,Android,Linux(ARM/x86-64),Windows(包含VR),RTOS… 甚至无操作系统的单片机 支持的开发语言:C/C++, Swift, Java, Javascript, C#, Golang… 支
[单片机]
把GuiLite<font color='red'>移植</font>到STM32上
OK6410A 开发板 (七) 1 OK6410A 文件系统 busybox和buildroot 移植
存在问题, kernel 是用 Linaro GCC 7.4-2019.02) 7.4.1 20181213 编译的 但是 Linaro GCC 7.4-2019.02) 7.4.1 20181213 编译 busybox和buildroot 出来, 执行 linuxrc 的时候 ,会出现 段错误 VFS: Mounted root (ext3 filesystem) on device 179:2. Freeing unused kernel memory: 1024K Run /linuxrc as init process random: fast init done Kernel panic - not syncing
[单片机]
OK6410A 开发板 (七) 1 OK6410A 文件系统 busybox和buildroot <font color='red'>移植</font>
如何判断CPU是否正在执行中断函数?
1.这是一个有许多经验的攻城狮都遇到过的坑,本文教你正确绕过这个坑; 2.教大家了解__get_CONTROL的用法,及xQueueSend和xQueueSendFromISR的区别; Ⅰ 问题来源 今天在FreeRTOS系统上移植了部分别人写的代码,移植前仔细看了下源码,确认没问题后,编译,下载,运行,突然“死机了”······ 于是,我又再次确认了移植的代码,没有发现Bug所在。此时,我开启了在线调试功能,发现程序死在了“vPortEnterCritical”函数中的断言语句里。如下: Ⅱ 解决问题的过程 我解决问题还是按照常规思维,一步一步跟踪,很多问题其实都是类似道理,有规律可循
[单片机]
如何判断CPU是否正在执行中断函数?
段式LCD液晶显示屏的底层驱动程序
本次任务用瑞赛单片机R7C004驱动定制的段式液晶,4COM,18seg,1/3偏压。由于单片机本身有段式液晶驱动,根据数据手册可以知道其工作过程及控制方法。 过程分2步:1,配置硬件驱动寄存器。2,根据具体液晶情况,取模,定义联合结构体。 步骤1可以查看数据手册,根据步骤配置写程序配置程序如下:4COM,18个seg从seg0到seg18(出去seg11) void LCD_Init(void) { HB_LCDM1=0;nop(); HB_LCDM0=0x4D; HB_PFSEG0=0xf0;HB_PFSEG1=0xF7;HB_PFSEG2=0x07; HB_PFSEG3=0x00;HB_PFSEG4=0x
[单片机]
stm32入门笔记(三)RT-Thread 当中spi和SFUD的移植问题解决方案
系统的方便性,让我开始了rtt的学习。 但是在添加spi来读取外部FLASH的时候,遇到了一些情况。 例如,找不到设备,或者说无法读取FLASH的ID。 下面通过介绍一套完整的流程来帮助大家熟悉。 首先。 cube mx。配置spi 2为打开 然后在menuconfig当中实现对驱动的定义和添加。 最后在里面添加,关于spi的驱动和sfud。 然后生成工程。 最后添加代码测试:https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/ 可以得到结果。
[单片机]
stm32入门笔记(三)RT-Thread 当中spi和SFUD的<font color='red'>移植</font>问题解决方案
u-boot-2016.09移植(2)-uboot启动简易分析
注:此文与下面关于uboot的移植都参考了《嵌入式linux学习笔记(基于s5pv210、tq210)》 不管什么版本的uboot都是在arch/arm/cpu/u-boot-spl.lds和arch/arm/cpu/u-boot.lds中制定了入口函数ENTRY(_start),u-boot-2016.09也不例外,搜索发现_start在arch/arm/lib/vectors.S中实现: _start首先执行reset,然后定义异常向量表,reset在arch/arm/cpu/armv7/start.S中实现 在reset中只执行了一条跳转指令,save_boot_params的功能是跳转到save_boot_pa
[单片机]
u-boot-2016.09<font color='red'>移植</font>(2)-uboot启动简易分析
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved