驱动策略和效率的整理

驱动可控范畴内的:

走轮询/中断/DMA

1. 轮询模式(Polling)

  • 工作原理:CPU 主动检查串口硬件发送缓冲区的状态。如果缓冲区空,就填入一个字节;如果缓冲区满,CPU 就忙等(死循环)直到硬件发送完该字节。

  • 特点

    • 阻塞 :函数在返回前,必须等待所有数据发送完毕。如果发送长字符串,调用线程会被挂起很长时间(毫秒级)。

    • CPU 占用:在等待期间 CPU 无法做任何其他工作(除非被更高优先级任务抢占)。

    • 多任务影响 :如果不加锁,多个任务同时调用会导致输出严重交错,因为一个任务可能在等待间隙被抢占,另一个任务开始打印。

2. 中断模式(Interrupt-driven)

  • 工作原理 :驱动维护一个发送缓冲区(FIFO)。应用程序调用 printf 时,仅将数据拷贝到缓冲区,然后立即返回。硬件在发送完一个字节后触发中断,中断服务程序从缓冲区取出下一个字节发送。

  • 特点

    • 非阻塞:函数通常很快返回(仅受内存拷贝速度影响),发送过程在后台进行。

    • CPU 占用:发送本身不占用 CPU 算力,但每次中断(每个字节一次)会有短暂的中断开销。

    • 多任务影响 :如果多个任务同时向同一个缓冲区写入数据,且没有互斥保护,缓冲区数据会被破坏,同样会导致输出乱码或混乱。但相比轮询,单个任务不会因为打印而长时间阻塞。

3. DMA 模式(Direct Memory Access)

  • 工作原理:CPU 配置 DMA 控制器,指定数据源、长度和串口外设,然后 DMA 硬件自动将数据从内存搬运到串口发送寄存器,整个过程无需 CPU 干预。发送完成后触发中断通知 CPU。

  • 特点

    • 极低 CPU 占用:传输大量数据时,CPU 几乎不参与,适合高速大数据量传输。

    • 非阻塞:函数通常将数据交给 DMA 后立即返回。

    • 多任务影响:如果多个任务同时发起 DMA 传输,必须由驱动进行排队或互斥,否则硬件资源冲突

  • ==================================================================

  • 速度问题:

  • 吞吐量 (最终能发多快):由硬件波特率决定,与驱动策略无关。115200 bps 的波特率下,无论如何优化,每秒最多传输约 11.5KB 数据。

  • 响应延迟(从调用到返回的时间):

    • 轮询:延迟 = 发送时间(如 100 字节约 8.7 毫秒 @115200)。

    • 中断/DMA:延迟 = 内存拷贝时间(微秒级)。

    • 无论采用哪种策略,只要多个任务并发调用驱动未做互斥保护,都会出现输出交错:

    • 轮询:任务 A 发送到一半,被任务 B 抢占,B 开始发送,导致两段内容混杂。

    • 中断/DMA:任务 A 将数据写入共享缓冲区后返回,任务 B 随后也写入,若没有锁保护,缓冲区内容可能被覆盖或混合,导致最终输出的数据是 A 和 B 的混合。)

相关推荐
炸膛坦客9 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
华清远见IT开放实验室13 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
AI的探索之旅16 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
茯苓gao16 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
GeekArch16 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my17 小时前
STM32项目3
stm32·单片机·嵌入式硬件
国科安芯18 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
小李不困还能学19 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
CedarQR19 小时前
万字长文:从零在 RK3588 上部署 PaddleSpeech 中文 TTS 全流程(FastSpeech2 + HiFiGAN)
开发语言·c++·嵌入式硬件·ubuntu·json
萌动的小火苗20 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件