以下文章內(nèi)容由CW32生態(tài)社區(qū)用戶提供:
https://gitee.com/teletubbies-die-of-murder/lightweight-serial-framework
介紹
輕量級跨平臺串口通信框架,專為資源受限的嵌入式設(shè)備設(shè)計。單個對象RAM占用最小68字節(jié)左右(不算緩沖區(qū)),ROM占用1-2k字節(jié)左右,功能支持裁剪,資源占用小并不代表低性能,該庫參考了freeRTOS的隊列實現(xiàn),進行簡化處理,保留最核心的功能,對于數(shù)據(jù)的FIFO操作,分析了拷貝原數(shù)據(jù)的劣勢,采用了類似拷貝指針的方式,減少內(nèi)存占用,提高效率。同時代碼風(fēng)格較好,有配套注釋以及作者開發(fā)過程中的思考。
demo
demo使用CW32F030C8 ARM Cortex-M0+ 內(nèi)核單片機,該例程充分發(fā)揮了單片機的性能,提供了單字節(jié)中斷和DMA的框架例程,用戶可參考此例程來快速開始。
例程請復(fù)制以下鏈接至網(wǎng)頁端打開:
https://gitee.com/teletubbies-die-of-murder/lightweight-serial-framework
后期可能會更新的內(nèi)容
發(fā)送同樣增加緩沖區(qū)FIFO方式,先就緒到緩沖區(qū)后,在另一個線程發(fā)送,不在原地發(fā)送
引入DMA半滿全滿中斷API
線程安全的實現(xiàn)方式會再增加一種
特色
面向?qū)ο笏枷?,高?nèi)聚低耦合
資源占用極低,效率高,ROM占用1-2k字節(jié)
數(shù)據(jù)溢出保護,自動切換或鎖定緩沖區(qū)
支持串口單字節(jié)中斷,適配沒有dma的單片機
支持串口DMA或DMA+IDLE中斷
支持輕量級printf,使用第三方xprintf庫節(jié)省內(nèi)存
支持變量轉(zhuǎn)字符串庫,省去printf,進一步減小內(nèi)存
日志輸出功能,在初始化時為用戶提示錯誤信息以及初始化詳情
線程安全設(shè)計,用戶根據(jù)所使用的RTOS實現(xiàn)lock和unlock后,使用外設(shè)是非常安全的
無malloc函數(shù),零動態(tài)內(nèi)存申請
兼容C89版本編譯器
功能上通過配置支持僅發(fā)送,僅接收,或發(fā)送接收都支持
配置項
| 配置項 | 作用 |
|---|---|
| USE_ONE_BYTE_IT_MODE | 串口單字節(jié)中斷模式 1-啟用,0-不啟用 |
| USE_DMA_MODE | 串口DMA模式 1-啟用,0-不啟用 |
| USE_DMA_NOT_HAVE_RX_IDLE_MODE | 不支持DMA空閑中斷模式 1-啟用,0-不啟用 |
| USE_DMA_RX_CNT_MODE | DMA接收計數(shù)器模式選擇 |
| USE_UART_TX_BIN_DATA | 串口發(fā)送二進制數(shù)據(jù)接口 1-啟用,0-不啟用 |
| USE_UART_TX_STR_DATA | 串口發(fā)送字符串?dāng)?shù)據(jù)接口 1-啟用,0-不啟用 |
| USE_UART_PRINTF | 串口格式化輸出接口 1-啟用,0-不啟用 |
| UART_PRINTF_BUFFER_SIZE | 串口printf緩存區(qū)大小 |
| USE_UART_PRINTF_BUF_STATIC | 串口printf靜態(tài)緩存區(qū) 1-使用,0-不使用 |
| USE_INFO_LOG | 啟用日志打印 1-啟用,0-不啟用 |
| USE_CHECK_INPUT_HANDLE_PARA | 檢查輸入?yún)?shù)合法性 1-啟用,0-不啟用 |
| USE_STD_LIB | 使用標(biāo)準(zhǔn)庫printf 1-啟用,0-不啟用 |
| USE_STRING_EX_LIB | 使用字符串?dāng)U展庫 1-啟用,0-不啟用 |
| USE_UART_TX_RX_MODE_SELECT | 串口發(fā)送接收模式選擇 1-啟用,0-不啟用 |
倉庫架構(gòu)
| 文件 | 功能 |
|---|---|
| demo | 示例工程 |
| lib | 庫文件 |
| other | 其他文件 |
庫文件說明
| 文件 | 功能 |
|---|---|
| uart_obj | 串口收發(fā)框架核心文件 |
| xprintf | 第三方輕量級printf庫 |
| string_ex | 自定義擴展字符串庫 |
多緩沖區(qū)的意義
在生產(chǎn)消費模型中,如果生產(chǎn)的數(shù)據(jù)能在下一次生產(chǎn)之前及時消費,則并不需要多緩沖區(qū),否則需要,因為不加多緩沖區(qū)會發(fā)生數(shù)據(jù)覆蓋或者數(shù)據(jù)丟失的情況。多緩沖區(qū)的意義在于,短時間內(nèi)生產(chǎn)速度大于消費速度,對這種情況進行數(shù)據(jù)緩存,如果一直是生產(chǎn)速度大于消費速度,緩沖區(qū)再大也會被填滿,該問題不是緩沖區(qū)的問題了,是性能跟不上,考慮降低生產(chǎn)速度,優(yōu)化代碼或者更換高性能芯片。多緩沖區(qū)結(jié)合DMA是最優(yōu)的,在解析期間,DMA可以繼續(xù)接收數(shù)據(jù),兩者并行。因此FIFO深度為2為最低標(biāo)準(zhǔn),設(shè)置為1將沒有緩存和并行的效果,實際設(shè)置多少根據(jù)項目需求選擇。
緩沖區(qū)FIFO策略
完全型緩沖區(qū)策略:無論數(shù)據(jù)量大小,收到一包數(shù)據(jù)都固定消耗一個緩沖區(qū),該方式內(nèi)存利用率低,但管理起來簡單,代碼量少。
緊湊型FIFO策略:根據(jù)數(shù)據(jù)量大小,消耗的緩沖區(qū)大小為動態(tài),該方式內(nèi)存利用率高,但管理起來麻煩,需要更多代碼。
tips:目前的FIFO策略為完全型緩沖區(qū)策略,后期看情況更新緊湊型策略
審核編輯 黃宇
-
串口通信
+關(guān)注
關(guān)注
34文章
1662瀏覽量
57994 -
CW32
+關(guān)注
關(guān)注
1文章
299瀏覽量
1854
發(fā)布評論請先 登錄
【CW32】uart_obj_fw 輕量級串口框架
評論