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

問題復(fù)現(xiàn)場景:
開發(fā)者僅需一次單消息傳輸,但未顯式初始化struct rt_spi_message的next指針。
由于next未賦值為RT_NULL,鏈?zhǔn)絺鬏敃r觸發(fā)非法內(nèi)存訪問(next指向不可控地址)。
修復(fù)方案 :將next顯式置空后,異常消失。
借此機(jī)會,本文將深入解析RT-Thread SPI驅(qū)動的鏈?zhǔn)絺鬏敊C(jī)制,并探討B(tài)SP對RT-Thread SPI接口的適配特點(diǎn)與優(yōu)勢。
RT-Thread SPI鏈?zhǔn)絺鬏敊C(jī)制解析
二、
1.核心數(shù)據(jù)結(jié)構(gòu):struct rt_spi_message
RT-Thread通過struct rt_spi_message描述SPI傳輸操作,支持單條或多條消息鏈?zhǔn)絺鬏敗?/p>
關(guān)鍵成員next
1)若為NULL,表示當(dāng)前為鏈?zhǔn)絺鬏數(shù)淖詈笠粭l消息。
2)若非NULL,需確保next指向的rt_spi_message已正確初始化。
3)未初始化next的后果鏈?zhǔn)絺鬏敃r,驅(qū)動會嘗試訪問next指向的無效地址,導(dǎo)致非法訪問異常。
在RT-Thread的官方wiki示例可以看到,在定義一個spi message時,需要操作next成員以便確認(rèn)是否有下一條鏈?zhǔn)絺鬏?。如果沒有需要賦值為NULL。在RT-Thread的wiki可以看到,在使用rt_spi_transfer_message 傳輸兩條msg,在第二條msg的next賦值為RT_NULL代表結(jié)束。
在RT-Thread組件SPI相關(guān)也對next進(jìn)行了操作,并且做了相關(guān)注釋說明
先楫BSP適配
三、
那么可能就有開發(fā)者問了,為什么別的BSP SPI驅(qū)動反而就沒事了,可以在RT-Thread的主線看到,多數(shù)廠商(如STM32)的SPI驅(qū)動未處理next指針,僅支持單條消息傳輸,但鏈?zhǔn)絺鬏敃r易因next未處理導(dǎo)致傳輸異常。
而先楫BSP的SPI驅(qū)動嚴(yán)格按照RT-Thread規(guī)范實(shí)現(xiàn)鏈?zhǔn)絺鬏斶壿?,?qiáng)制校驗(yàn)next指針。支持單條/鏈?zhǔn)絺鬏?,兼容?fù)雜場景。
先楫BSP對DSPI和QSPI的支持
四、
不同與其他廠家的BSP,把SPI和QSPI分開兩個驅(qū)動文件,先楫是集成在SPI驅(qū)動中,因?yàn)橄乳甋PI本身就是一個外設(shè),可以支持SPI,DSPI,QSPI三種傳輸模式。
怎么開啟這三種模式,可以通過menuconfig進(jìn)入到對應(yīng)的界面進(jìn)行選擇:分別是單線SPI,兩線DSPI,四線QSPI。
如果想在RT-Thread Studio操作,可以參考下圖:
需要注意的是:當(dāng)使用四線QSPI時,對應(yīng)的pinmu.c的SPI初始化需要加上QSPI的D2和D3初始化。
通過list device命令可看到:SPI0為單線SPI,SPI1為雙線DSPI,SPI2為四線QSPI
總結(jié)
五、
鏈?zhǔn)絺鬏斚葳澹何闯跏蓟痭ext指針是SPI驅(qū)動異常的常見原因,開發(fā)者需嚴(yán)格遵循RT-Thread規(guī)范。
先楫BSP優(yōu)勢
1. 嚴(yán)格適配RT-Thread鏈?zhǔn)絺鬏斶壿?,避免非法訪問。2. 集成SPI/DSPI/QSPI驅(qū)動,簡化開發(fā)流程。
-
SPI
+關(guān)注
關(guān)注
17文章
1790瀏覽量
95203 -
BSP
+關(guān)注
關(guān)注
1文章
92瀏覽量
26816 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1385瀏覽量
41663
發(fā)布評論請先 登錄
基于RT-Thread的SPI通訊
RT-Thread編程指南
RT-Thread用戶手冊
RT-Thread上SPI的細(xì)節(jié)內(nèi)容

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

RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機(jī)制

RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述

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

基于RT-Thread Studio學(xué)習(xí)

評論