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

問(wèn)題復(fù)現(xiàn)場(chǎng)景:
開(kāi)發(fā)者僅需一次單消息傳輸,但未顯式初始化struct rt_spi_message的next指針。
由于next未賦值為RT_NULL,鏈?zhǔn)絺鬏敃r(shí)觸發(fā)非法內(nèi)存訪問(wèn)(next指向不可控地址)。
修復(fù)方案 :將next顯式置空后,異常消失。
借此機(jī)會(huì),本文將深入解析RT-Thread SPI驅(qū)動(dòng)的鏈?zhǔn)絺鬏敊C(jī)制,并探討B(tài)SP對(duì)RT-Thread SPI接口的適配特點(diǎn)與優(yōu)勢(shì)。
RT-Thread SPI鏈?zhǔn)絺鬏敊C(jī)制解析
二、
1.核心數(shù)據(jù)結(jié)構(gòu):struct rt_spi_message
RT-Thread通過(guò)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(shí),驅(qū)動(dòng)會(huì)嘗試訪問(wèn)next指向的無(wú)效地址,導(dǎo)致非法訪問(wèn)異常。

在RT-Thread的官方wiki示例可以看到,在定義一個(gè)spi message時(shí),需要操作next成員以便確認(rèn)是否有下一條鏈?zhǔn)絺鬏敗H绻麤](méi)有需要賦值為NULL。在RT-Thread的wiki可以看到,在使用rt_spi_transfer_message 傳輸兩條msg,在第二條msg的next賦值為RT_NULL代表結(jié)束。

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

先楫BSP適配
三、
那么可能就有開(kāi)發(fā)者問(wèn)了,為什么別的BSP SPI驅(qū)動(dòng)反而就沒(méi)事了,可以在RT-Thread的主線看到,多數(shù)廠商(如STM32)的SPI驅(qū)動(dòng)未處理next指針,僅支持單條消息傳輸,但鏈?zhǔn)絺鬏敃r(shí)易因next未處理導(dǎo)致傳輸異常。

而先楫BSP的SPI驅(qū)動(dòng)嚴(yán)格按照RT-Thread規(guī)范實(shí)現(xiàn)鏈?zhǔn)絺鬏斶壿?,?qiáng)制校驗(yàn)next指針。支持單條/鏈?zhǔn)絺鬏?,兼容?fù)雜場(chǎng)景。

先楫BSP對(duì)DSPI和QSPI的支持
四、
不同與其他廠家的BSP,把SPI和QSPI分開(kāi)兩個(gè)驅(qū)動(dòng)文件,先楫是集成在SPI驅(qū)動(dòng)中,因?yàn)橄乳甋PI本身就是一個(gè)外設(shè),可以支持SPI,DSPI,QSPI三種傳輸模式。
怎么開(kāi)啟這三種模式,可以通過(guò)menuconfig進(jìn)入到對(duì)應(yīng)的界面進(jìn)行選擇:分別是單線SPI,兩線DSPI,四線QSPI。

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

需要注意的是:當(dāng)使用四線QSPI時(shí),對(duì)應(yīng)的pinmu.c的SPI初始化需要加上QSPI的D2和D3初始化。

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

總結(jié)
五、
鏈?zhǔn)絺鬏斚葳澹何闯跏蓟痭ext指針是SPI驅(qū)動(dòng)異常的常見(jiàn)原因,開(kāi)發(fā)者需嚴(yán)格遵循RT-Thread規(guī)范。
先楫BSP優(yōu)勢(shì)
1. 嚴(yán)格適配RT-Thread鏈?zhǔn)絺鬏斶壿?,避免非法訪問(wèn)。2. 集成SPI/DSPI/QSPI驅(qū)動(dòng),簡(jiǎn)化開(kāi)發(fā)流程。
-
SPI
+關(guān)注
關(guān)注
17文章
1885瀏覽量
101187 -
BSP
+關(guān)注
關(guān)注
1文章
99瀏覽量
27971 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1611瀏覽量
44811
發(fā)布評(píng)論請(qǐng)先 登錄
RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程)
基于RT-Thread的SPI通訊
RT-Thread編程指南
RT-Thread用戶手冊(cè)
RT-Thread上SPI的細(xì)節(jié)內(nèi)容
RT-Thread全球技術(shù)大會(huì):螢石研發(fā)團(tuán)隊(duì)使用RT-Thread的技術(shù)挑戰(zhàn)
RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制
RT-Thread全球技術(shù)大會(huì):RT-Thread測(cè)試用例集合案例
RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述
RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
基于RT-Thread Studio學(xué)習(xí)
【S32K146 RT-Thread】之 使用SFUD組件驅(qū)動(dòng)spi flash
RT-Thread SPI鏈?zhǔn)絺鬏敺欠ㄔL問(wèn)?揭秘致命陷阱!
評(píng)論