实时系统的设备驱动实现

        第一是笔者看到了关于RTOS驱动开发介绍的文章,作者的特点是从系统的层次上分析问题(为大家铺路),好东西大家一起用(博大的胸襟);第二是笔者能够看懂一些,分享一下,争取做到准确...
        笔者一位低一年级的同学参加过嵌入式软件的培训,告诉我他学过ARM板上写Linux驱动,我很羡慕,因为写驱动是比较难的事情,这里思考的是UCOS的驱动设计 ,至今没做过Linux驱动。
        设备驱动一般包含2个方面:一个是任务级的处理,另一个是中断处理。对数据的处理以及上述2个方面的协调,是非常重要的,而且需要解决很多细节问题。
设备驱动的两个方面
许多设备驱动都支持中断。事实上,如果设备驱动编写时不考虑中断,就容易很多。这是因为编写无中断支持的设备驱动更为简单,如果学会了怎样编写支持中断的驱动,那么其他的实现也就轻而易举了。先简单回顾一下设备驱动的基础:初始化,发送,接收,控制,关闭。这根本没什么难的!大多数情况下,设备驱动就这么些内容,当然也可以添加一些额外的错误处理,或者提供一个ioctl()函数,但最主要的就是能够收发数据。没什么太复杂的!那为什么我们在编写设备驱动时,总觉得被束缚而难以开始呢?这一般是因为,在正常工作之前,除非有一些适合的工具,否则不能看到设备在做什么。但是,如果有正确的框架,让设备工作起来还是很容易的。
        在RTOS下,我们所说的设备驱动的两个方面是指什么呢?一方面是任务环境的接口(API),另一方面是中断服务及相关处理。协调这两方面的潜在问题是什么呢?一个是数据破坏;另一个是任务调度。数据破坏如没有二次访问的保护;任务调度,不合理的任务调度,可能导致系统崩溃。
使用UCOS的互斥信号量机制实现串口驱动的设计
void OutputByte(char c)
{
 OSMutexPend(&Recmutex,0,&err);
 USARTSendChar(c);
 while(status);                //等待发送完毕
 OSMutexPost(&Recmutex);
}
这里串口资源只有一个,互斥信号也是一个,以下串口资源等同于一个互斥信号。
1.互斥信号量申请到资源时会锁定该信号(flag = 0),使用完成后用OSMutexPost来释放信号(flag = 1)。
2.如果当前任务申请该信号时,该资源未被释放(flag = 0),就将当前任务放到消息等待队列中并挂起当前任务。
3.OSMutexPost函数首先检查有无任务等待该信号,有则唤醒等待队列中优先级最高的任务,没有就释放信号(flag = 1)。
这里面为什么看不到中断服务呢?
Colin Walls给的中断例子
void OutputCharacter(char c)
{
 if(PortReadyFlag != TRUE)
 {
  AddToPortWait(ThisTaskID);  //
  SuspendTask();
 }
 PORTOUTPUT = c;
}
这段代码检查现在是否可以输出字符。如果不能,他将建立一个机制,使得当该端口就绪时,中断服务(ISR)例程能通知该任务,然后当前任务被挂起,直到知道端口有效,输出字符。这里所谓的机制(端口就绪时,触发中断服务,ISR例程能通知该任务)可以通过配置相应的串口中断实现。
针对这个端口的ISR
interrupt void WriterPort(void)
{
 TASKID tid;
 PortReadyFlag = TRUE;
 tid = GetFromPortWaitList();
 if(tid!=NULL)
 {
  PortReadyFlag = FALSE;
  ResumeTask(tid);  //使该任务就绪
  RunScheduler(); //任务调度
 }
}
这是另一种设备驱动的实现方式,由于使用了中断,实时性很高。这里也回答了上面的例子看不到中断,原因是UCOS是抢占式任务调度,只需将对应任务设为就绪状态,就能执行到该任务(当无更高优先级的就绪任务时),无需自行切换到该任务。
总结:这里介绍的是实时系统的设备驱动实现,当用到多任务调度时,应该对相应的外设包装,确保不会发生冲突和系统崩溃。对于Windows和Linux设备驱动的实现原理,笔者没见过。不论哪种系统,如果所以设备驱动都按统一的模板来编写,可以减少很多麻烦。
所涉及内容参考书籍
Colin Walls的《嵌入式软件概论》(我见过最好的“概论”了)
邵贝贝译的uc/os II (第二版)
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DSP和标准外设库: 资源编号 : STSW-STM32065 资源名称 : STM32F4 DSP and standard peripherals library 文件名 : stm32_f105-07_f2_f4_usb-host-device_lib.zip 下载地址 : http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257901# USB库: 资源编号 : STSW-STM32046 资源名称 : STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device library (UM1021) 文件名 : stm32_f105-07_f2_f4_usb-host-device_lib.zip 下载地址 : http://www.st.com/web/en/catalog/tools/PF257882 ETH以太网库: 资源编号 : STSW-STM32046 资源名称 : LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers (AN3966) 文件名 : stsw-stm32070.zip 下载地址 : http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257906 【CMSIS】 Cortex微控制器软件接口程序(Cortex Microcontroller Software Interface Standard (CMSIS). ) 版本: V4.2 发布日期: 31. July 2014 【STM32F4xx_StdPeriph_Driver】 STM32F40x系列CPU标准外设驱动程序 版本: V1.5.0 发布日期: 06-March-2015 【STM32_USB_OTG_Driver】 STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library 版本: V2.1.0 发布日期: 2012-03-19 【STM32_USB_Device_Library】 STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library 版本: V1.1.0 发布日期: 2012-03-05 【STM32_USB_HOST_Library】 STM32F105/7xx, STM32F2xx and STM32F4xx USB Host Library 版本: V2.1.0 发布日期: 2012-03-19 【STM32F4x7_ETH_Driver】 STM32F4x7 Eth Library 版本: V1.1.0 发布日期: 31-July-2013 ********************************************************************************************************* * * 版 本 : V1.0 * 说 明 : 本实验主要实现FreeRTOS+STemWin+FatFS+USB Host综合 * 实验目的: * 1. 学习FreeRTOS+STemWin+FatFS+USB Host综合 * 2. 这里的USB Host主要实现U盘相关处理,支持U盘热插拔。 * 用户可以根据需要在usb_usr.c文件中的插入检测函数: * USBH_USR_Configuration_DescAvailable或者函数USBH_USR_Init函数加入插入标志 * 拔出检测函数: * USBH_USR_DeviceDisconnected * 实验内容: * 1. 按下按键K1可以通过串口打印任务执行情况(波特率115200,数据位8,奇偶校验位无,停止位1) * ================================================= * 任务任务状态 优先级 剩余栈 任务序号 * vTaskUserIF R 2 272 2 * vTaskGUI R 1 657 1 * IDLE R 0 113 6 * vTaskMsgPro B 4 1957 4 * vTaskLED B 3 483 3 * vTaskStart B 5 489 5 * * * 任务名 运行计数 使用率 * vTaskUserIF 5583 1% * vTaskGUI 10782 2% * IDLE 355589 91% * vTaskLED 0 <1% * vTaskMsgPro 16770 4% * vTaskStart 17 <1% * 串口软件建议使用SecureCRT(V6光盘里面有此软件)查看打印信息。 * 各个任务实现的功能如下: * vTaskGUI 任务: emWin任务 * vTaskTaskUserIF 任务: 接口消息处理 * vTaskLED 任务: LED闪烁 * vTaskMsgPro 任务: U盘中文件处理和浏览 * vTaskStart 任务: 启动任务,也就是最高优先级任务,这里实现按键扫描和触摸检测 * 2. 任务运行状态的定义如下,跟上面串口打印字母B, R, D, S对应: * #define tskBLOCKED_CHAR ( 'B' ) 阻塞 * #define tskREADY_CHAR ( 'R' ) 就绪 * #define tskDELETED_CHAR ( 'D' ) 删除 * #define tskSUSPENDED_CHAR ( 'S' ) 挂起 * 3. 本实验的USB Host主要是对U盘的操作,通过电脑端的串口软件SecureCRT软件, * 给板子发送相关命令实现操作,具体实现在demo_fatfs文件里面。 * printf("请选择操作命令:\r\n"); * printf("1 - 显示根目录下的文件列表\r\n"); * printf("2 - 创建一个新文件armfly.txt\r\n"); * printf("3 - 读armfly.txt文件的内容\r\n"); * printf("4 - 创建目录\r\n"); * printf("5 - 删除文件和目录\r\n"); * printf("6 - 读写文件速度测试\r\n"); * printf("7 - 挂载U盘\r\n"); * printf("8 - 卸载U盘\r\n"); * 注意事项: * 1. 本实验推荐使用串口软件SecureCRT,要不串口打印效果不整齐。此软件在 * V5开发板光盘里面有。 * 2. 务必将编辑器的缩进参数和TAB设置为4来阅读本文件,要不代码显示不整齐。 * * 修改记录 : * 版本号 日期 作者 说明 * V1.0 2016-03-15 Eric2013 1. ST固件库到V1.5.0版本 * 2. BSP驱动包V1.2 * 3. FreeRTOS版本V8.2.3 * 4. STemWin版本V5.28 * 5. FatFS版本V0.11a * * Copyright (C), 2016-2020, 安富莱电子 www.armfly.com * *********************************************************************************************************

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值