浅析μC/OS-Ⅱ设备驱动的设计与实现
设备驱动程序是任何操作系统的必不可少的、最保密的一个组成部分,它们实现了计算机系统所有附属设备的一个标准接口,它包含与硬件直接相关的设备驱动。从广义上说,“驱动程序”是指一些函数的集合,这些函数都能对硬件设备进行操作。本文简单分析了μ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()创建用户任务,在任务用户任务中选择要控制的硬件,选择最佳的控制方法,调用用户自己编写的函数来完成。
![](../img/eep/emb/emb-30286zk3qjgzjyhm.jpg)
图 系统启动流程
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 &m
- 3DES算法的FPGA高速实现(06-21)
- 基于DSP的Max-Log-MAP算法实现与优化(05-27)
- DSP中DMA操作的无阻塞请求实现(06-18)
- 二维DCT编码的DSP实现与优化(09-08)
- 基于DSP处理器上并行实现ATR算法(01-29)
- 基于DSP的H.324终端设计(05-27)