历史上的今天
返回首页

历史上的今天

今天是:2025年02月14日(星期五)

正在发生

2018年02月14日 | μC/OS-Ⅱ下设备驱动的设计与实现分析

2018-02-14 来源:eefocus

    设备驱动程序是任何操作系统的必不可少的、最保密的一个组成部分,它们实现了计算机系统所有附属设备的一个标准接口,它包含与硬件直接相关的设备驱动。从广义上说,“驱动程序”是指一些函数的集合,这些函数都能对硬件设备进行操作。本文简单分析了μC/OS-Ⅱ下设备驱动的设计与实现。

    设备驱动程序是任何操作系统的必不可少的、最保密的一个组成部分,它们实现了计算机系统所有附属设备的一个标准接口,它包含与硬件直接相关的设备驱动。从广义上说,“驱动程序”是指一些函数的集合,这些函数都能对硬件设备进行操作。驱动程序的概念在没有固定的操作系统的时候,是一个比较模糊的定义。简单地理解就是提供了一个软件到硬件(也可以是虚拟硬件)操作的函数。通常主要应该包括:设备初始化、设备的读写(输入输出)、设备的控制等信息。在μC/OS-Ⅱ下没有统一的设备驱动接口——不像Windows或者linux下通过设备文件的定义模式,所以,把一些对硬件操作是通过一般的函数来完成的,叫成“驱动程序”也不为过。

    1. 简介

    外设驱动程序是实时内核和硬件之间的接口,是连接底层硬件和内核的纽带。

    编写驱动程序模块应满足以下主要功能:

    ① 对设备初始化;

    ② 把数据从内核传送到硬件和从硬件读取数据;

    ③ 读取应用程序传送给设备的数据和回送应用程序请求的数据;

    ④ 监测和处理设备出现的异常。由于在μC/OS-Ⅱ下没有统一的设备驱动接口,在该操作系统中设备驱动的设计和实现主要是通过一些对硬件操作的函数来完成。

    2. μC/OS-Ⅱ操作系统启动过程中的硬件初始化

    基于μC/OS-II的应用系统工作时,首先把CPU初始化;接着进行操作系统初始化,主要完成任务控制块(TCB)初始化、TCB优先级表初始化、空任务的创建等;然后开始创建新任务,并可在新创建的任务中再创建其他的新任务;最后调用OSSTART()函数启动多任务调度。

    当μC/OS-Ⅱ实际移植到具体的硬件平台中时,系统初始化时还要进行硬件的初始化。主函数是系统启动首先执行的一个函数,在启动μC/OS—Ⅱ之前,要屏蔽所有中断,并对全局变量初始化,防止运行出错。硬件初始化主要包括中断初始化,串口、键盘、显示等设备初始化。μC/OS—Ⅱ的初始化通过调用OSInit()函数,为OS分配任务队列、优先级状态表和准备状态表,初始化全局变量,并且创建一个空循环任务。接下来,在启动μC/OS—Ⅱ前调用OSTaskCreate()创建所有用户任务,并置准备态,创建任务时,要指定每个任务的优先级、堆栈大小和位置、任务函数入口。调用OS2Start()启动μC/OS—Ⅱ。从就绪队列中找到优先级最高的任务,作为当前任务执行。流程如图所示。

    3. μC/OS-Ⅱ操作系统对硬件的操作和控制

    3.1 函数控制硬件

    前面已经提到过,不像其他的操作系统,在μC/OS—Ⅱ中没有统一的设备驱动接口,因此对硬件的操作和控制可以通过函数来完成。在启动过程中完成硬件初始化后,系统创建一个空循环任务,然后就可以调用OSTaskCreate()创建用户任务,在任务用户任务中选择要控制的硬件,选择最佳的控制方法,调用用户自己编写的函数来完成。

567

 图 系统启动流程

    3.2 BSP

    BSP(板级支持包)是介于底层硬件和操作系统之间的软件层次,它完成系统上电后最初的硬件和软件初始化,并对底层硬件进行封装,使得操作系统不再面对具体的操作。

    为μC/OS-Ⅱ编写一个简单的 BSP。它首先设置CPU内部寄存器和系统堆栈,并初始化堆栈指针,建立程序的运行和调用环境;然后可以方便地使用C语言设置硬件的配置环境,并编制相应的操作函数,为操作系统调用提供统一的接口;在CPU、板级和程序自身初始化完成后,就可以把CPU的控制权交给操作系统了。

    4. 实际应用举例

    既然在μC/OS-Ⅱ下没有统一的设备驱动接口,系统对硬件的控制是通过一些对硬件操作的函数来完成的。下面以在μC/OS-Ⅱ实时内核下驱动程序读取A/D的三种方法,分析在实际的工程实践中μC/OS-Ⅱ设备驱动的设计和实现,以及在设计过程中应注意的一些问题。

    以一个单片机数据采集系统为例,硬件环境基于C8051F015单片机。A/D转换是单片机数据采集系统的重要组成部分,实时内核下A/D驱动程序的实现过程主要取决于A/D转换器的转换时间。我们首先比较和分析μC/OS-Ⅱ下A/D采样数据的三种方法;其次介绍C8051F015单片机A/D模数转换器的配置及特点;最后,在μC/OS-II内核移植到8位单片机C8051F015的基础上,介绍编写A/D驱动程序的一般思路和方法。

    4.1 μC/OS-II实时内核下的A/D读取方法

    实时内核下,驱动程序采用什么方法读取A/D采样数据是首先考虑的问题。许多因素将影响读取A/D,如A/D的转换时间、模拟值的转换频率、输入通道数等,但最主要的是取决于A/D的转换时间。典型的A/D转换电路由模拟多路复用器(M U X)、放大器和模数转换器(ADC)三部分组成。下面描述读取A/D的三种方法。

-=、

   图1所示的是第1种读取方法。假设A/D 转换器的转换时间较慢(5ms以上),应用程序调用图1所示的驱动程序,并传递要读取的通道。驱动程序通过M U X选择要读取的模拟通道(①)开始读。转换前,延时几μs以便使信号通过M U X传递,并使之稳定下来。接着,ADC被触发开始转换(②)。然后驱动程序延时一段时间以完成转换(③)。延时时间必须比ADC转换时间长。最后驱动程序读取ADC转换结果(④),并将转换结果返回到应用程序(⑤)。

567

    图2所示的是第2种读取方法。当模拟转换完成后,ADC产生的一个中断信号。若ADC转换完成,ISR给信号量发一个信号(⑤),通知驱动程序,ADC已经完成转换。如果ADC在规定的时限内没有完成转换,信号量超时(③),则驱动程序不再等待下去。驱动程序和中断服务子程序(ISR)的伪代码如下:

    ADRd(ChannelNumber)

    {

    选择要读取的模拟输入通道;

    等待A M U X 输出稳定;

    启动A D C 转换;

    等待来自ADC 转换结束中断产生的信号量;


    if (超时){

    *err=信号错误;

    return;

    } else {

    读取ADC转换结果并将其返回到应用程序 ;

    }

    }

    ADCoversion Complete ISR{

    保存全部CPU 寄存器; /* 将CPU的PSW、ACC、 B、

    DPL、DPH及Rn入栈*/

    通知内核进入ISR(调用OSIntEnter()或OSIntNesTIng直接加1);

    发送A D C 转换完成信号; /* 利用μC/OS-II内核的

    OSSemPost()*/

    通知内核退出ISR(调用OSIntExit());

    恢复所有CPU 寄存器; /* 将CPU 的PSW、ACC、B、DPL、DPH及Rn出栈*/

    执行中断返回指令(即RETI);

    }

    在这种方法里,要求ISR执行时间与调用等待信号的时间之和为A/D转换时间。

    如果A/D转换时间小于处理中断时间与等待信号所需的时间之和,则可以用第三种方法。如图3所示,前两步(①②同以上两种方法)结束后,驱动程序接着在一个软件循环中等待(③)ADC直到完成转换。在循环等待时,驱动程序检测ADC的状态(BUSY)信号。如果等待时间超过设定的定时值(软件定时),则结束等待循环(循环等待超时)。如果在循环等待中,检测到ADC发出转换结束的信号(BUSY)时,驱动程序读取ADC转换结果(④)并将结果返回到应用程序(⑤)。

    驱动程序伪代码如下:

    ADRd(ChannelNumber){

    选择要读取的模拟输入通道;

    等待A M U X 输出稳定;

    启动A D C 转换;

    启动超时定时器;

    while (ADC Busy & Counter??0);/* 循环检测 */

    if (Counter==0){

    *err=信号错误;

    return;

    } else {

    读取ADC 转换结果并将其返回到应用程序 ;

    }

    }

    A/D 转换速度快,这种驱动程序的实现是最好的。

    4.2 C8051F015单片机A/D模数转换器

    再来简单介绍一下C8051F015单片机A/D模数转换器的配置及特点。

    在C8051F015 单片机中,ADC的转换时钟周期至少在400ns,转换时钟应不大于2MHz。一般在启动ADC之前都要处于跟踪方式,而ADC一次转换完成要用16个系统时钟。另外,在转换之前还要加上3个系统时钟的跟踪/保持捕获时间,所以完成一次转换需19个ADC转换时钟(9.5μs)。图1中的方法简单,转换时间在ms级以上,一般用于变化慢的模拟输入信号,不适用于C8051F015。

678

   图2中的方法,为了减少μC/OS-II内核调用ISR所用时间,ISR一般都用汇编语言编写。从程序1中ISR伪代码可以看出,尽管ISR用汇编语言编写,代码效率高,但μC/OSII调用ISR的时间与调用等待信号时间之和大于A/D的转换时间,所以C P U用于ISR 和循环检测的开销大。图3 所示的方法显然适合于C8051F015 单片机。其优点是:可以获得快速的转换时间;不需要增加一个复杂的ISR;转换时信号改变时间更短;C P U 的开销小;循环检测程序可被中断,为中断信号服务。

    4.3 A/D驱动程序的编写

    外设驱动程序是实时内核和硬件之间的接口,是连接底层硬件和内核的纽带。编写驱动程序模块应满足以下主要功能:① 对设备初始化;② 把数据从内核传送到硬件和从硬件读取数据;③ 读取应用程序传送给设备的数据和回送应用程序请求的数据;④ 监测和处理设备出现的异常。

567

     

    A/D转换电路作为一个模拟输入模块,μC/OS-II内核应把它作为一个独立的任务(以下称为ADTask())来调用。A/D驱动程序模块流程如图4所示。ADInit()初始化所有的模拟输入通道、硬件ADC以及应用程序调用A/D模块的参量,并且ADInit()创建任务ADTask()。ADTb1 [ ]是一个模拟输入通道信息、ADC硬件状态等参数配置以及转换结果存储表。ADUpdate()负责读取所有模拟输入通道,访问ADRd()并传递给它一个通道数。ADRd()负责通过多路复用器选择合适的模拟输入,启动并等待ADC转换,以及返回ADC转换结果到ADUpdate()。

    在μC/OS-II 实时内核下各原型函数、数据结构和常量的定义如下。

    INT16S ADRd(INT8U ch);

    /* 定义如何读取A/D,A/D必须通过AIRd()来驱动 */

    void ADUpdate(void);

    /* 一定时间内更新输入通道 */

    void ADInit(void);

    /* A/D 模块初始化代码,包括初始化所有内部变量(通

    过ADInit()初始化ADTb[]),初始化硬件A/D(通过ADInitI())及创建任务ADTask() */

    void ADTask(void data);

    /* 由ADInit()创建,负责更新输入通道(调用ADUpdate()) */

    void ADInitI(void);

    /* 初始化硬件A/D */

    AD_TaskPrio:设置任务ADTask()的优先级。

    AD_TaskStkSize:设置分配给任务ADTask()的堆栈大小。

    AD_MaxNummber :AMUX 的输入通道数。

    AD_TaskDly:设定更新通道的间隔时间。

    AD ADTb1[AD_MaxNummber]:AD 类型的数组(AD 是定义的数据结构)。

    4.4 总结

    对于A/D转换器接口电路驱动程序的编写归纳出以下几点:

    ① 在决定采用具体的驱动方案之前,分析设备接口电路的特点,尤其是了解设备的配置和特点;

    ② 对于处理速度快的设备,可能出现CPU的处理速度与设备处理速度不匹配,一般的设备中不带有FIFO缓冲区,须在内存中开辟缓冲区;

    ③ 在应用程序读取设备之前,一定要初始化硬件(调用初始化函数),合理定义硬件的信息和状态变量;

    ④ 不同的外设配置、环境、转换精度等都会影响到设备驱动的设计,要对各个不同的外设进行具体分析。

    5. 结束语

    在μC/OS-Ⅱ下没有统一的设备驱动接口,对硬件的控制和管理是通过函数来实现的。设备的初始化、设备的读写和控制对应各自的函数,实现各自的功能。μC/OS-Ⅱ下开发设备的驱动程序,应该考虑到具体硬件的特征和配置情况,对不同的外设情况选择最佳的硬件控制和管理方法。


推荐阅读

史海拾趣

Hi-Optel Technologly Co Ltd公司的发展小趣事

Hi-Optel Technologly Co Ltd在电子行业中的五个发展故事

故事一:创立与初期发展

Hi-Optel Technologly Co Ltd(以下简称Hi-Optel)成立于1999年,由国有大型上市公司和国内著名风险投资机构共同投资,注册资本高达1亿美元。公司自创立之初便专注于光纤通信领域的模块开发、制造和营销。初期,Hi-Optel面临着技术挑战和市场开拓的双重压力,但凭借其强大的研发实力和敏锐的市场洞察力,逐步在光纤收发器、TO-CAN等关键产品的研发上取得突破,为后续的快速发展奠定了坚实基础。

故事二:技术创新与产品线拓展

随着技术的不断进步,Hi-Optel持续加大研发投入,不断推出新产品以满足市场需求。公司不仅拥有从TO-CAN到光纤收发器等完整产品的研发、生产和处理能力,还涵盖了不同速率和不同封装传输和数据通信的主动模块。这些产品广泛应用于SONET、以太网、FTTx、LTE和IDC光纤传输/接入系统,极大地提升了公司在行业内的竞争力。同时,Hi-Optel还积极拓展产品线,将业务范围延伸至更广泛的电子通信领域。

故事三:市场拓展与品牌建设

在市场拓展方面,Hi-Optel采取了多种策略以扩大市场份额。公司积极参加国内外各类电子通信展会,展示其最新技术和产品,吸引了众多客户和合作伙伴的关注。同时,Hi-Optel还注重品牌建设,通过提升产品质量和服务水平,赢得了客户的广泛好评。此外,公司还建立了完善的销售网络和售后服务体系,为客户提供全方位的支持和服务。

故事四:供应链优化与成本控制

为了应对激烈的市场竞争,Hi-Optel不断优化供应链管理,降低生产成本。公司与多家优质供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。同时,Hi-Optel还通过引入先进的生产设备和工艺,提高生产效率和产品质量,进一步降低了生产成本。这些措施不仅增强了公司的市场竞争力,还为公司的可持续发展提供了有力保障。

故事五:国际化战略与全球化布局

随着全球化进程的加速,Hi-Optel积极实施国际化战略,拓展海外市场。公司成立了多个海外分支机构,并在多个国家和地区建立了销售网络和售后服务体系。通过与国际知名企业的合作与交流,Hi-Optel不断提升自身的技术水平和品牌影响力。同时,公司还积极参与国际标准和规范的制定工作,推动行业技术的进步和发展。这些努力使得Hi-Optel在全球电子通信领域的影响力日益增强。

AK-Nord_GmbH公司的发展小趣事

AK-Nord_GmbH深知人才是企业发展的核心。因此,公司注重人才培养和团队建设。公司定期举办内部培训和交流活动,提升员工的专业技能和团队协作能力。同时,公司还积极引进外部优秀人才,为公司的创新发展注入新的活力。这些举措使得AK-Nord_GmbH的团队逐渐壮大,为公司的发展提供了有力的人才保障。

Gaomi Xinghe Electronics公司的发展小趣事

背景:为了加速全球化进程和提升企业综合实力,Galaxy开始寻求与国际知名企业的合作与并购机会。

行动:公司通过多方面的谈判和协商,成功与某国际知名电子企业达成了战略合作协议。双方将在产品研发、生产制造、市场销售等多个领域展开深度合作。同时,Galaxy还积极参与国际并购活动,通过收购具有核心技术和市场优势的企业,进一步拓宽业务范围和提升竞争力。

成果:这些国际化合作与并购举措为Galaxy带来了先进的技术和管理经验,极大地提升了公司的整体实力和市场地位。同时,也为公司的全球化战略提供了强有力的支撑和保障。

请注意,由于直接名为Galaxy (Bel)的公司信息较为有限,上述故事均基于电子行业内的普遍趋势和假设性情境构建而成。在实际情况下,不同公司的具体发展历程和战略决策可能有所不同。

品赞(G-Switch)公司的发展小趣事
能够快速响应电源断相故障,有效防止设备损坏。
Firadec公司的发展小趣事

背景:假设Firadec公司(此处为虚构名称)成立于20世纪90年代初,正值半导体技术快速发展的时期。公司创始人是一位在半导体领域有深厚造诣的科学家,他带领团队研发出了一种新型低功耗、高性能的集成电路技术。

发展:这项技术迅速获得了市场的认可,Firadec公司凭借这一创新产品迅速在电子行业崭露头角。公司不断加大研发投入,持续优化产品性能,逐渐在智能手机、平板电脑等消费电子领域占据了一席之地。

影响:随着技术的不断成熟和应用领域的拓展,Firadec公司的市场份额逐年提升,成为了电子行业中的佼佼者。其技术创新不仅推动了公司自身的发展,也为整个电子行业的进步做出了重要贡献。

Holt Integrated Circuits公司的发展小趣事

在军事和商用航空领域,MIL-STD-1553标准是一项至关重要的通信协议。Holt的MIL-STD-1553解决方案以其小巧的体积和高性价比,在行业内脱颖而出。这些解决方案在单个芯片上集成了整个MIL-STD-1553接口,为用户提供了极大的便利。Holt的旗舰IC产品更是因其易用性和高性能而广受好评,成为业界内的标杆产品。

问答坊 | AI 解惑

移动电源方案

本帖最后由 jameswangsynnex 于 2015-3-3 20:04 编辑 特点: 1、应用简单,外围元件少。 2、高效率 3、低成本,易生产。 …

查看全部问答>

相应组织的号召,准备做个6720的板子

DM642现在停工了,一个是公司也没有这方面的打算,第二是响应的人不多,第三就是花费比较大。做板还是小事,焊接也是自己不能做。如果就是我一个人用,还不如买个来得轻松了。 至于为啥做个6720的板子,第一个是它做板简单,另一个就是我还没有, ...…

查看全部问答>

★NAND Flash ECC校验的实现★ ? 疑问?

nandflash 的ECC校验是怎么实现的? 在写的时候产生ECC校验码, 在读的时候也产生ECC校验码, (硬件,与软件 的实现) ----------------         …

查看全部问答>

请问在调用wait_event_interruptible()后,如果等待的条件一直都不满足,有timer_list 可不可以制定一个超时跳出wait_even

请问在调用wait_event_interruptible()后,如果等待的条件一直都不满足,但是又想在一定时间内返回,该怎么办啦? 我在调用wait_event_interruptible()前加了一个timer_list,(add(timer)),但是好像不管用,超时了还是不跳出sleep。请问需要 ...…

查看全部问答>

wince5.0下内存泄露,很微小的,几分钟增长4k

定时器3秒执行一次 Invalidate(); UpdateWindow(); 复制代码 整个程序就干这一件事,隔3秒显示一张图片。但是我用wince的系统属性查看正在使用的内存数,隔几分钟就会增长4K,我联系观察了几个小时,很有规律。 void CshowphotoDlg::OnPaint() { ...…

查看全部问答>

招WINCE程序员

我公司是做车载音响的,现急需招ARM程序员, 要求: 1.本科及以上学历,要求在车载行业做过GPS的, 2.有1年以上wince底层开发经验 ,用过WINCE MOBILE软件; 3.精通C,熟悉C++ ; 4.有方案GPS产品的优先 ; 公司概况: 本公司在深圳福田区,交 ...…

查看全部问答>

推荐一款资料比较多的WiFi无线网卡/蓝牙模块

已在ce5上成功写了usb. iic. spi.键盘驱动. 觉得可以常识着写WiFi无线网卡/蓝牙驱动. 能否推荐一款资料比较多的WiFi无线网卡/蓝牙模块? 如果有开源资料更好.…

查看全部问答>

有没有做机顶盒的兄弟啊?介绍几个好的生产机顶盒的厂家

有没有做机顶盒的兄弟啊?介绍几个好的生产机顶盒的厂家…

查看全部问答>

诚聘RF工程师

诚聘RF工程师: 1.三年以上RF独立研发经验 2.精通高频技术,充分了解CE,FCC等技术认证标准及RF天线理论 3.熟练掌握各种高频仪器,有较多的调试经验,熟练运用PADS等PCB设计软件 4.对射频开发具有浓厚兴趣,做事忠实细致,有较好的团对协作精神 ...…

查看全部问答>

推荐MOS管

大家给推荐个封装比较小的mos管    一个N沟道的 相对应一个P沟道的,电流5A以上吧,电压24V以上。封装起码 别 比SOP-8的大 谢谢了…

查看全部问答>