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

問題復現(xiàn)場景:
開發(fā)者僅需一次單消息傳輸,但未顯式初始化struct rt_spi_message的next指針。
由于next未賦值為RT_NULL,鏈式傳輸時觸發(fā)非法內存訪問(next指向不可控地址)。
修復方案 :將next顯式置空后,異常消失。
借此機會,本文將深入解析RT-Thread SPI驅動的鏈式傳輸機制,并探討B(tài)SP對RT-Thread SPI接口的適配特點與優(yōu)勢。
RT-Thread SPI鏈式傳輸機制解析
二、
1.核心數(shù)據(jù)結構:struct rt_spi_message
RT-Thread通過struct rt_spi_message描述SPI傳輸操作,支持單條或多條消息鏈式傳輸。
關鍵成員next
1)若為NULL,表示當前為鏈式傳輸?shù)淖詈笠粭l消息。
2)若非NULL,需確保next指向的rt_spi_message已正確初始化。
3)未初始化next的后果鏈式傳輸時,驅動會嘗試訪問next指向的無效地址,導致非法訪問異常。
在RT-Thread的官方wiki示例可以看到,在定義一個spi message時,需要操作next成員以便確認是否有下一條鏈式傳輸。如果沒有需要賦值為NULL。在RT-Thread的wiki可以看到,在使用rt_spi_transfer_message 傳輸兩條msg,在第二條msg的next賦值為RT_NULL代表結束。
在RT-Thread組件SPI相關也對next進行了操作,并且做了相關注釋說明
先楫BSP適配
三、
那么可能就有開發(fā)者問了,為什么別的BSP SPI驅動反而就沒事了,可以在RT-Thread的主線看到,多數(shù)廠商(如STM32)的SPI驅動未處理next指針,僅支持單條消息傳輸,但鏈式傳輸時易因next未處理導致傳輸異常。
而先楫BSP的SPI驅動嚴格按照RT-Thread規(guī)范實現(xiàn)鏈式傳輸邏輯,強制校驗next指針。支持單條/鏈式傳輸,兼容復雜場景。
先楫BSP對DSPI和QSPI的支持
四、
不同與其他廠家的BSP,把SPI和QSPI分開兩個驅動文件,先楫是集成在SPI驅動中,因為先楫SPI本身就是一個外設,可以支持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
總結
五、
鏈式傳輸陷阱:未初始化next指針是SPI驅動異常的常見原因,開發(fā)者需嚴格遵循RT-Thread規(guī)范。
先楫BSP優(yōu)勢
1. 嚴格適配RT-Thread鏈式傳輸邏輯,避免非法訪問。2. 集成SPI/DSPI/QSPI驅動,簡化開發(fā)流程。
-
SPI
+關注
關注
17文章
1791瀏覽量
95221 -
BSP
+關注
關注
1文章
92瀏覽量
26817 -
RT-Thread
+關注
關注
32文章
1385瀏覽量
41671
發(fā)布評論請先 登錄
基于RT-Thread的SPI通訊
RT-Thread編程指南
RT-Thread用戶手冊
RT-Thread上SPI的細節(jié)內容

RT-Thread全球技術大會:螢石研發(fā)團隊使用RT-Thread的技術挑戰(zhàn)

RT-Thread全球技術大會:Kconfig在RT-Thread中的工作機制

RT-Thread學習筆記 RT-Thread的架構概述

RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

評論