控制器|嵌入式开发:微控制器的3种驱动程序设计技术( 二 )


接下来 , 中断的使用可以引入遵循一整套额外的最佳实践的需要 。 例如 , 最好的做法是:
—缩短中断时间
—将共享变量声明为volatile
—处理高优先级项目 , 然后卸载到应用程序进行处理
当事件发生时 , 你不希望在驱动程序中有数千行代码被执行的中断 。 相反 , 你希望处理关键任务 , 比如从UART缓冲区中提取一个字符 , 并将其放入应用程序的循环缓冲区中 。
最后 , 我们还需要担心诸如中断被禁用、中断时间和运行速率、优先级以及中断是否可能丢失等问题 。 虽然其中一些项目看起来额外的复杂性可能不值得付出努力 , 但对执行时间的改进可能是巨大的 。 例如 , 电池供电的设备可能进入深度睡眠模式 , 只在醒来时将字符存储在缓冲区中 , 然后返回睡眠状态 。 这样做可以节省大量能源 。
在某些情况下 , 在驱动程序中使用中断实际上是处理外围事件的最佳方式 。 例如 , 你可以编写轮询的I2C驱动程序 , 但编写一个中断ack、nack等传输序列中发生的不同事件的I2C驱动程序会产生更干净、更小和更高效的驱动程序 。

技术3:DMA驱动的驱动程序
有些驱动程序在系统中移动大量数据 , 如I2S和SDIO 。 管理这些类型接口上的缓冲区可能需要CPU的持续操作 。 如果CPU落后或必须处理另一个系统事件 , 数据可能会丢失或延迟 , 这可能会给用户造成明显的问题 , 例如音频跳过 。 与吞吐量相关的嵌入式开发人员可以使用DMA控制器在CPU的微控制器周围移动数据 。
这些驱动程序背后的想法是DMA控制器可以通过以下方式在微控制器周围移动数据:
—外围存储器
—内存对内存
—外设存储器
使用DMA的优点是 , 当DMA通道为驱动程序移动数据时 , CPU可以停止做其他事情 , 基本上一次完成两件事情 。
虽然在驱动程序中使用DMA控制器以减少CPU执行的需要是非常理想的 , 但大多数微控制器的可用DMA通道数量有限 。 因此 , 不能将每个驱动程序都写入DMA 。 相反 , 开发人员需要选择带宽受限且能从DMA中获益匪浅的外围设备 , 如外部存储器、ADC和通信通道的接口 。
在没有I2S或SDIO的应用程序中 , 开发人员可以使用DMA将传入的UART字符移动到循环缓冲区中 , 一旦设置了某个限制 , 就会对该缓冲区进行处理 。 可以通过轮询应用程序结构或通过DMA控制器设置中断来监控此限制 。 可以想象 , DMA驱动程序是驱动程序最有效的实现方式 , 但根据开发人员的技能水平以及他们以前是否使用过DMA , 它们的实现也可能很复杂 。 这不应该阻止开发者尝试在他们的驱动程序中使用DMA 。
在本文中 , 我们研究了嵌入式开发人员可以用来为微控制器外围设备和外部设备编写驱动程序的三种主要技术 。 一般来说 , 开发人员在默认情况下应该在轮询实现上使用中断驱动程序实现 , 除非使用的外围设备速度很快 , 即数Mbps 。 DMA可以用于任何驱动程序 , 但我通常为需要高吞吐量的接口(如外部内存或通信接口)保留DMA通道 。 你选择的选项将高度依赖于最终应用程序 。

相关经验推荐