0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread SPI链式传输非法访问?揭秘致命陷阱!

RT-Thread官方账号 2025-06-24 19:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


前言

一、


在与RT-Thread BSP的开发者沟通中,发现SPI设备驱动在轮询(Polling)模式下偶发出现非法访问异常(如图)

bf68f6ea-50ef-11f0-986f-92fbcf53809c.png

问题复现场景:

开发者仅需一次单消息传输,但未显式初始化struct rt_spi_message的next指针。

由于next未赋值为RT_NULL,链式传输时触发非法内存访问(next指向不可控地址)。

修复方案 :将next显式置空后,异常消失。

借此机会,本文将深入解析RT-Thread SPI驱动的链式传输机制,并探讨BSP对RT-Thread SPI接口的适配特点与优势。

RT-Thread SPI链式传输机制解析

二、


1.核心数据结构:struct rt_spi_message

RT-Thread通过struct rt_spi_message描述SPI传输操作,支持单条或多条消息链式传输。

关键成员next

1)若为NULL,表示当前为链式传输的最后一条消息。
2)若非NULL,需确保next指向的rt_spi_message已正确初始化。

3)未初始化next的后果链式传输时,驱动会尝试访问next指向的无效地址,导致非法访问异常。

bf8a2018-50ef-11f0-986f-92fbcf53809c.png

在RT-Thread的官方wiki示例可以看到,在定义一个spi message时,需要操作next成员以便确认是否有下一条链式传输。如果没有需要赋值为NULL。在RT-Thread的wiki可以看到,在使用rt_spi_transfer_message 传输两条msg,在第二条msg的next赋值为RT_NULL代表结束。

bf94c27a-50ef-11f0-986f-92fbcf53809c.png

在RT-Thread组件SPI相关也对next进行了操作,并且做了相关注释说明

bfa9a38e-50ef-11f0-986f-92fbcf53809c.png

先楫BSP适配

三、


那么可能就有开发者问了,为什么别的BSP SPI驱动反而就没事了,可以在RT-Thread的主线看到,多数厂商(如STM32)的SPI驱动未处理next指针,仅支持单条消息传输,但链式传输时易因next未处理导致传输异常。

bfc2c940-50ef-11f0-986f-92fbcf53809c.png

而先楫BSP的SPI驱动严格按照RT-Thread规范实现链式传输逻辑,强制校验next指针。支持单条/链式传输,兼容复杂场景。

bff233b0-50ef-11f0-986f-92fbcf53809c.png

先楫BSP对DSPI和QSPI的支持

四、


不同与其他厂家的BSP,把SPI和QSPI分开两个驱动文件,先楫是集成在SPI驱动中,因为先楫SPI本身就是一个外设,可以支持SPI,DSPI,QSPI三种传输模式。

怎么开启这三种模式,可以通过menuconfig进入到对应的界面进行选择:分别是单线SPI,两线DSPI,四线QSPI。

c021c210-50ef-11f0-986f-92fbcf53809c.png

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

c033999a-50ef-11f0-986f-92fbcf53809c.png

需要注意的是:当使用四线QSPI时,对应的pinmu.c的SPI初始化需要加上QSPI的D2和D3初始化。

c04c1e2a-50ef-11f0-986f-92fbcf53809c.png

通过list device命令可看到:SPI0为单线SPI,SPI1为双线DSPI,SPI2为四线QSPI

c07f1df2-50ef-11f0-986f-92fbcf53809c.png

总结

五、


链式传输陷阱:未初始化next指针是SPI驱动异常的常见原因,开发者需严格遵循RT-Thread规范。

先楫BSP优势

1. 严格适配RT-Thread链式传输逻辑,避免非法访问。2. 集成SPI/DSPI/QSPI驱动,简化开发流程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1867

    浏览量

    99867
  • BSP
    BSP
    +关注

    关注

    1

    文章

    97

    浏览量

    27761
  • RT-Thread
    +关注

    关注

    32

    文章

    1543

    浏览量

    44295
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 6476次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    基于RT-ThreadSPI通讯

         sdk 目前还不支持 spi,没有 spi 就失去了很多乐趣,如 easyflash、spi 的屏幕,蓝讯的这次活动我接到了模拟 spi 的任务,下面介绍如何写
    的头像 发表于 08-22 09:28 2617次阅读

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT-Thread实时操作系统的编程指南
    发表于 11-26 16:06 0次下载

    RT-Thread用户手册

    RT-Thread用户手册——本书是RT-Thread的编程手册,用于指导在RT-Thread实时操作系统环境下如何进行编 程。
    发表于 11-26 16:16 0次下载

    RT-ThreadSPI的细节内容

    作为通信协议的两大基础,IIC和SPI两者的应用都非常广泛,上一篇文章讲过了RTT上IIC的移植与实践。 《一步到位!教你RT-Thread上设备IIC驱动移植》 讲完IIC,自然少不了SPI
    的头像 发表于 09-30 15:35 4588次阅读
    <b class='flag-5'>RT-Thread</b>上<b class='flag-5'>SPI</b>的细节内容

    RT-Thread全球技术大会:萤石研发团队使用RT-Thread的技术挑战

    RT-Thread全球技术大会:研发团队使用RT-Thread的技术挑战         审核编辑:彭静
    的头像 发表于 05-27 11:36 1869次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:萤石研发团队使用<b class='flag-5'>RT-Thread</b>的技术挑战

    RT-Thread全球技术大会:Kconfig在RT-Thread中的工作机制

    RT-Thread全球技术大会:Kconfig在RT-Thread中的工作机制               审核编辑:彭静
    的头像 发表于 05-27 14:49 2147次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作机制

    RT-Thread全球技术大会:RT-Thread测试用例集合案例

    RT-Thread全球技术大会:RT-Thread测试用例集合案例           审核编辑:彭静
    的头像 发表于 05-27 16:34 2660次阅读
    <b class='flag-5'>RT-Thread</b>全球技术大会:<b class='flag-5'>RT-Thread</b>测试用例集合案例

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 5530次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

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

    RT-Thread文档_RT-Thread 潘多拉 STM32L475 上手指南
    发表于 02-22 18:23 10次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread文档_SPI 设备

    RT-Thread文档_SPI 设备
    发表于 02-22 18:36 3次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>SPI</b> 设备

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 5977次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习

    【S32K146 RT-Thread】之 使用SFUD组件驱动spi flash

    【S32K146 RT-Thread】之 使用SFUD组件驱动spi flash
    的头像 发表于 11-21 01:05 1649次阅读
    【S32K146 <b class='flag-5'>RT-Thread</b>】之 使用SFUD组件驱动<b class='flag-5'>spi</b> flash