0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

几种常见的单片机驱动程序设计模式

科技观察员 来源:英锐恩 作者:英锐恩 2023-07-10 11:09 次阅读

单片机开发人员需要掌握的一项基本技能是,了解如何编写驱动程序。在嵌入式系统中,通常有两种类型的驱动程序:单片机外围设备驱动程序和通过I2C,SPI或UART接口连接的外部设备驱动程序。

如今,在许多情况下,单片机供应商都提供了其芯片的示例驱动程序,这些驱动程序可以按原样使用,或者可能需要进行生产修改。外部驱动程序可能包含伪代码,但是单片机开发人员几乎总是自己编写驱动程序。

针对这个问题,重要的是要意识到,我们有多种方法可以编写驱动程序,并且编写驱动程序的方式会极大地影响系统性能,能耗以及我们在开发产品时希望跟踪的许多其他因素。在本文中,单片机开发工程师将探讨几种常见的单片机驱动程序设计模式,以及它们如何影响应用程序代码

一、轮询驱动程序

首先是开发驱动程序,用于对外围设备进行轮询以查看其是否准备发送或接收信息。轮询驱动程序非常易于实现,因为它们通常只轮询标志而已。例如,模数转换器ADC)驱动程序可能会启动转换序列,然后简单地阻止处理器执行并不断检查ADC完成标志。这段代码如下所示:

Adc_Start();
while(ADC_COMPLETE_FLAG == FALSE);
AdcResults = Adc_ReadAll();
return AdcResults;

如上面的案例,代码不断轮询ADC_COMPLETE_FLAG,大概将其映射到硬件位,以查看何时有数据可用。在将这样的硬件测试称为轮询时,它会产生一些值得讨论的特性。

首先,当我们有一个使用轮询的驱动程序时,在大多数实现中,该驱动程序将成为阻塞驱动程序。这意味着一旦调用驱动程序,它将不会从驱动程序返回,直到获得所需的结果为止。在其他实现中,我们只需让驱动程序检查一次结果然后返回即可。在这种情况下,应用程序负责轮询驱动程序,我们将认为驱动程序是非阻塞的。从设计的角度来看,由开发人员决定应在何处进行轮询。在驱动程序中可以减轻应用程序的负担,但是如果应用程序这样做,则可以灵活地执行其他活动并以较低的速率轮询驱动程序。

接下来,一般来说,轮询非常容易实现。通常,开发人员所需要做的就是观察寄存器中的几位并监视它们,以决定何时与设备进行交互。最后,虽然易于实现,但通常认为轮询效率低下。其他技术(例如使用中断)仅在需要执行某些操作时才通知CPU,这会使轮询效率非常低下。我经常将民意调查与一个长途旅行中坐车的孩子不断询问“我们到了吗?”联系起来。轮询不断问:“你准备好了吗?现在怎么样?现在?”。

这使我们可以使用中断来实现更高效但稍微复杂的驱动程序。

二、中断驱动程序

在驱动程序中使用中断非常有用,因为它可以大大提高代码执行效率。中断告诉处理器现在已经准备好驱动程序,而我们跳转以处理该中断,而不是不断检查是否该做某事。通常,我们可以使用两种类型的中断驱动程序机制:事件驱动程序和调度程序。当外围设备中发生需要处理的事件时,事件驱动的驱动程序将触发中断。例如,我们可能有一个UART驱动程序,当在缓冲区中接收到新字符时,该驱动程序将触发中断。另一方面,我们可能有一个ADC驱动器,该驱动器使用计时器来安排访问以开始采样或处理接收到的数据。

使用中断驱动的驱动程序虽然效率更高,但可能会增加设计的实现复杂性。首先,单片机开发人员需要启用适当的中断以在驱动程序中使用,例如接收,发送和缓冲区已满。我通常发现,由于现代中断控制器的复杂性,单片机开发人员很难使中断起作用。它们通常需要在外围设备级别的通用寄存器中设置中断,然后有时甚至需要配置优先级和其他设置。几年前,我整理了有关配置中断的分步指南,可以在此处下载

接下来,使用中断可能会导致需要遵循一些额外的因素。例如:

1.中断时间短;

2.将共享变量声明为volatile;

3.处理高优先级项目,然后卸载到应用程序进行处理。

谁都不想在驱动程序中发生事件时,执行数千行代码的中断。相反,应该处理的是关键任务,例如从UART缓冲区中提取字符并将其放入应用程序的循环缓冲区中。

最后,我们还需要担心诸如中断被禁用,中断时序和运行速率,优先级以及是否有可能错过中断之类的问题。尽管其中一些项目似乎不值得付出额外的复杂性,但执行时间的改善却是巨大的。例如,电池供电的设备可以进入深度睡眠模式,仅唤醒后将字符存储在缓冲区中,然后返回睡眠状态。这样做可以节省大量的电量。

在某些情况下,在驱动程序中使用中断确实是处理外围事件的最佳方法。例如,您可以编写一个轮询的I2C驱动程序,但编写一个在传输序列中发生的不同事件(如ack,nack等)时中断的驱动程序,则驱动程序将更干净,更小,更高效。

三、DMA驱动的驱动程序

有些驱动程序会通过I2S和SDIO等系统移动大量数据。在这些类型的接口上管理缓冲区可能需要CPU不断采取措施。如果CPU落后或必须处理其他系统事件,则数据可能会丢失或延迟,这可能会给用户带来明显的问题,例如音频跳跃。与吞吐量相关的开发人员可以改用DMA控制器在单片机中为CPU移动数据。

这些驱动程序背后的想法是,DMA控制器可以通过以下方式在单片机周围移动数据:

(1)外围到内存;

(2)内存到内存;

(3)内存到外围。

使用DMA的好处是,当DMA通道为驱动程序移动数据时,CPU可以关闭其他操作,本质上可以同时完成两件事。

迫切需要在驱动程序中使用DMA控制器以减少执行CPU的需要,但大多数单片机具有有限数量的可用DMA通道。因此,不能将每个驱动程序都编写为使用DMA。取而代之的是,开发人员需要选择带宽受限的外围设备,这些外围设备将受益于DMA,例如外部存储器,ADC和通信通道的接口。

在没有I2S或SDIO的应用程序中,开发人员可以使用DMA将传入的UART字符移动到循环缓冲区中,一旦设置了特定限制,该缓冲区将被处理。可以通过轮询应用程序结构或通过DMA控制器设置中断来监视此限制。您可以想象,DMA驱动程序是驱动程序最有效的实现,但是根据开发人员的技术水平以及他们以前是否使用过DMA,实现起来也可能很复杂。但是,单片机开发人员可以尝试在其驱动程序中使用DMA。

结论

在本文中,我们研究了嵌入式开发人员可以用来为单片机外围设备和外部设备编写驱动程序的三种主要技术。为了比较地总结这些技术,下表为我们讨论的每种技术以及实现的相对复杂性和执行效率。

20200730111732.png

通常,除非使用的外设速度很快(即几Mbps),否则开发人员默认情况下应在轮询实现上使用中断驱动程序实现。DMA可以用于任何驱动程序,但是我通常为需要高吞吐量的接口(例如外部存储器或通信接口)保留DMA通道。但是,怎么选择在很大程度上取决于最终应用程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44516

    浏览量

    633004
  • 驱动程序
    +关注

    关注

    19

    文章

    826

    浏览量

    47958
收藏 人收藏

    评论

    相关推荐

    单片机C语言应用程序设计

    单片机C语言应用程序设计针对目前最通用的单片机8051和最流行的程序设计语言——C语言,以KEII。公司8051单片机开发套件讲解
    发表于 10-09 17:53 171次下载
    <b class='flag-5'>单片机</b>C语言应用<b class='flag-5'>程序设计</b>

    单片机系统中PS/2键盘驱动程序的设计

    摘 要:介绍了PS/2协议及PS/2标准键盘的第2套扫描码和命令集,给出了在单片机系统中支持PS/2键盘的硬件连接方式以及利用KeilC51语言实现的驱动程序设计和部分代码.驱动程序单片机
    发表于 07-12 10:13 94次下载

    单片机驱动蜂鸣器原理与程序设计

    通过3个单片机驱动蜂鸣器的编程和电路设计,详细给各位介绍了单片机驱动蜂鸣器电路的程序设计,旨在给各位设计人员一些启发和帮助,降低开发难度。
    发表于 12-23 14:36 8次下载

    单片机系统中PS/2键盘驱动程序设计

    本文分析了PS/2协议介绍了PS/2标准键盘的第二套扫描码和命令集,并给出在单片机系统中支持PS/2键盘的硬件连接方式和利用Keil C51语言实现的驱动程序设计及部分代码。
    发表于 03-23 17:17 15次下载

    Windows CE驱动程序开发

    驱动开发的几种基本模式,给出了如何使用单片驱动程序设计方法,提供了提供了平台特有设备驱动程序开发
    发表于 04-18 10:13 0次下载

    单片机驱动步进电机程序设计

    单片机驱动步进电机程序设计,有需要的下来看看
    发表于 04-25 10:10 52次下载

    I2C总线的51单片机通用驱动程序

    i2c 51单片机通用驱动程序
    发表于 05-20 10:26 28次下载

    基于51单片机驱动程序的调试及应用

    在讨论工控组态软件与外部设备的数据交互途径的基础上,针对实际应用中现场设备多种多样,MCGS所提供的设备驱动程序有限的状况,设计了基于应用极为广泛的5l系列单片机外部设备的通用驱动程序,并在步进电机
    发表于 09-25 16:22 4次下载
    基于51<b class='flag-5'>单片机</b><b class='flag-5'>驱动程序</b>的调试及应用

    基于C8051F020的驱动程序设计

    简单介绍了MCGS组态软件和C8051F020单片机的特点。并以基于C8051F020单片机设计的厂房灯光控制器被背景,详细阐述了开发基于MCGS的C8051F020单片机驱动程序的方
    发表于 09-25 17:20 22次下载
    基于C8051F020的<b class='flag-5'>驱动程序设计</b>

    PIC系列单片机程序设计基础

    PIC系列单片机程序设计基础
    发表于 10-16 14:27 9次下载
    PIC系列<b class='flag-5'>单片机</b><b class='flag-5'>程序设计</b>基础

    PIC单片机原理与程序设计

    PIC单片机原理与程序设计
    发表于 10-16 14:57 16次下载
    PIC<b class='flag-5'>单片机</b>原理与<b class='flag-5'>程序设计</b>

    WinCE流驱动程序设计概述

    WinCE流驱动程序设计概述
    发表于 10-25 09:46 7次下载
    WinCE流<b class='flag-5'>驱动程序设计</b>概述

    单片机码表的驱动程序免费下载

    本文档的主要内容详细介绍的是单片机码表的驱动程序免费下载。
    发表于 08-28 17:29 0次下载
    <b class='flag-5'>单片机</b>码表的<b class='flag-5'>驱动程序</b>免费下载

    单片机C语言程序设计教程

    单片机C语言程序设计教程免费下载。
    发表于 04-15 11:12 72次下载

    AD7780-适用于单片机平台的无操作系统驱动程序

    AD7780-适用于单片机平台的无操作系统驱动程序
    发表于 05-20 13:37 11次下载
    AD7780-适用于<b class='flag-5'>单片机</b>平台的无操作系统<b class='flag-5'>驱动程序</b>