單片機串口DMA收發方案

  1. 概述

網上各大教程對於串口的使用基本都是輪詢發送、中斷接收,極大浪費了MCU的性能,同時中斷接收只能應付低速率的場景,對於要求波特率達到115200及以上的場景來講極其容易丟字節致使整個系統異常不穩定。html

這篇文章我先以 RT-Thread 的串口方案做爲切入點,而後給出我在STM32F1平臺上基於RT-Thread Nano 實現的方案。安全

本方案實現的是非阻塞式的收發,不涉及 posix 的對接。posix 其實也是調用這些非阻塞接口,只不過還加了些對這些接口的返回判斷再加入 wait_queue 來實現阻塞、喚醒,不詳細展開來描寫。併發

本方案的發送處理是應對的高併發場景,小內存MCU或者串口發送只在一個線程內的按你最簡單的使用方式來。小內存的 MCU 接收推薦直接使用 DMA+IDLE 方式,怎麼簡單怎麼來。並且不建議用串口框架,本身實現不只可靠還可控!!框架

  1. RT-Thread 串口框架

RT-Thread 串口框架支持用戶本身選擇如下述方案打開串口:
圖片.png
輪詢方式實際項目中基本是不用的;中斷方式的發送會致使大量的中斷,佔用太多MCU資源,並且 RT-Thread 把中斷髮送作的跟輪詢同樣;中斷方式的接收不只會致使大量的中斷並且對於高速通訊需求的場景不適用。
DMA方式不管是發送仍是接收都不須要CPU參與,解放了CPU,程序只須要對幾個中斷處理就行。高併發

2.1. DMA發送

RT-Thread 串口框架中對於 DMA 發送使用的是 dataqueue 隊列。性能

DMA 發送操做將要發送的數據指針及其長度保存在 dataqueue 成員中,發送時按照先進先出的規則從中取一塊,將其保存的數據指針賦值給 DMA 內存地址。spa

這裏不涉及數據拷貝,因此數據指針指向的內存區是局部的,用戶須要在應用程序中經過設置信號量或其餘方式來同步發送完成,不然將致使不安全的指針使用。多併發的狀況下這種就會致使各類各樣的問題了。線程

.....指針

原文連接:https://club.rt-thread.org/ask/article/2594.htmlhtm

相關文章
相關標籤/搜索