前言
一、
在與RT-Thread BSP的開發(fā)者溝通中,發(fā)現(xiàn)SPI設(shè)備驅(qū)動在輪詢(Polling)模式下偶發(fā)出現(xiàn)非法訪問異常(如圖)

問題復現(xiàn)場景:
開發(fā)者僅需一次單消息傳輸,但未顯式初始化struct rt_spi_message的next指針。
由于next未賦值為RT_NULL,鏈式傳輸時觸發(fā)非法內(nèi)存訪問(next指向不可控地址)。
修復方案 :將next顯式置空后,異常消失。
借此機會,本文將深入解析RT-Thread SPI驅(qū)動的鏈式傳輸機制,并探討B(tài)SP對RT-Thread SPI接口的適配特點與優(yōu)勢。
RT-Thread SPI鏈式傳輸機制解析
二、
1.核心數(shù)據(jù)結(jié)構(gòu):struct rt_spi_message
RT-Thread通過struct rt_spi_message描述SPI傳輸操作,支持單條或多條消息鏈式傳輸。
關(guān)鍵成員next
1)若為NULL,表示當前為鏈式傳輸?shù)淖詈笠粭l消息。
2)若非NULL,需確保next指向的rt_spi_message已正確初始化。
3)未初始化next的后果鏈式傳輸時,驅(qū)動會嘗試訪問next指向的無效地址,導致非法訪問異常。

在RT-Thread的官方wiki示例可以看到,在定義一個spi message時,需要操作next成員以便確認是否有下一條鏈式傳輸。如果沒有需要賦值為NULL。在RT-Thread的wiki可以看到,在使用rt_spi_transfer_message 傳輸兩條msg,在第二條msg的next賦值為RT_NULL代表結(jié)束。

在RT-Thread組件SPI相關(guān)也對next進行了操作,并且做了相關(guān)注釋說明

先楫BSP適配
三、
那么可能就有開發(fā)者問了,為什么別的BSP SPI驅(qū)動反而就沒事了,可以在RT-Thread的主線看到,多數(shù)廠商(如STM32)的SPI驅(qū)動未處理next指針,僅支持單條消息傳輸,但鏈式傳輸時易因next未處理導致傳輸異常。

而先楫BSP的SPI驅(qū)動嚴格按照RT-Thread規(guī)范實現(xiàn)鏈式傳輸邏輯,強制校驗next指針。支持單條/鏈式傳輸,兼容復雜場景。

先楫BSP對DSPI和QSPI的支持
四、
不同與其他廠家的BSP,把SPI和QSPI分開兩個驅(qū)動文件,先楫是集成在SPI驅(qū)動中,因為先楫SPI本身就是一個外設(shè),可以支持SPI,DSPI,QSPI三種傳輸模式。
怎么開啟這三種模式,可以通過menuconfig進入到對應的界面進行選擇:分別是單線SPI,兩線DSPI,四線QSPI。

如果想在RT-Thread Studio操作,可以參考下圖:

需要注意的是:當使用四線QSPI時,對應的pinmu.c的SPI初始化需要加上QSPI的D2和D3初始化。

通過list device命令可看到:SPI0為單線SPI,SPI1為雙線DSPI,SPI2為四線QSPI

總結(jié)
五、
鏈式傳輸陷阱:未初始化next指針是SPI驅(qū)動異常的常見原因,開發(fā)者需嚴格遵循RT-Thread規(guī)范。
先楫BSP優(yōu)勢
1. 嚴格適配RT-Thread鏈式傳輸邏輯,避免非法訪問。2. 集成SPI/DSPI/QSPI驅(qū)動,簡化開發(fā)流程。
-
SPI
+關(guān)注
關(guān)注
17文章
1900瀏覽量
102133 -
BSP
+關(guān)注
關(guān)注
1文章
105瀏覽量
28092 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1640瀏覽量
45210
發(fā)布評論請先 登錄
基于RT-Thread的SPI通訊
RT-Thread編程指南
RT-Thread用戶手冊
RT-Thread上SPI的細節(jié)內(nèi)容
RT-Thread全球技術(shù)大會:螢石研發(fā)團隊使用RT-Thread的技術(shù)挑戰(zhàn)
RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機制
RT-Thread學習筆記 RT-Thread的架構(gòu)概述
RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
RT-Thread v5.0.2 發(fā)布
RT-Thread SPI鏈式傳輸非法訪問?揭秘致命陷阱!
評論