浅析μC/OS-Ⅱ设备驱动的设计与实现
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-Ⅱ下开发设备的驱动程序,应该考虑到具体硬件的特征和配置情况,对不同的外设情况选择最佳的硬件控制和管理方法。
- 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)