rt-thread
rt-thread copied to clipboard
[drv_spi] 将等待spi传输完成的方式从死等变为阻塞线程的形式
拉取/合并请求描述:(PR description)
[ 原来等待spi传输完成的方式为死等,在spi速度慢且传输大量数据时,会一直占用CPU,导致其他任务无法运行。 现改为通过等待事件的方式,阻塞掉当前调用spi传输的线程,使得其他任务得以运行。
在STM32F411CEU6上使用LVGL SPI1-DMA方式刷屏,并通过SPI2读取FLASH的应用上测试通过。 ]
以下的内容不应该在提交PR时的message修改,修改下述message,PR会被直接关闭。请在提交PR后,浏览器查看PR并对以下检查项逐项check,没问题后逐条在页面上打钩。 The following content must not be changed in the submitted PR message. Otherwise, the PR will be closed immediately. After submitted PR, please use a web browser to visit PR, and check items one by one, and ticked them if no problem.
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
- [ ] 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
- [x] 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
- [x] 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
- [x] 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
- [x] 没有垃圾代码,代码尽量精简,不包含
#if 0
代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up - [x] 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
- [x] 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
- [x] 本拉取/合并请求代码是高质量的 Code in this PR is of high quality
- [x] 本拉取/合并使用formatting等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
很棒👍
每个 spi 总线都有一个 struct stm32_spi 结构体变量的吧,因此,各个 wait_event 变量是独立的。 XXX_TxRxCplt_EVENT XXX_TxCplt_EVENT XXX_RxCplt_EVENT 这几个宏定义一个就够了吧。 set_wait_event 函数也不用区分是哪个总线。
每个 spi 总线都有一个 struct stm32_spi 结构体变量的吧,因此,各个 wait_event 变量是独立的。 XXX_TxRxCplt_EVENT XXX_TxCplt_EVENT XXX_RxCplt_EVENT 这几个宏定义一个就够了吧。 set_wait_event 函数也不用区分是哪个总线。
spi_event的事件控制块是所有总线共用的,假设宏定义使用统一的SPI_XXXXCplt_Event,当SPI1总线等待传输完成事件(SPI_XXXXCplt_Event)的时候,别的线程调用SPI2总线传输数据,SPI2数据量很小,很快完成了,SPI2会调用spi_event发送SPI_XXXXCplt_Event事件。此时,如果使用SPI1总线的优先级较高,则SPI1总线收到了该事件,会认为是它完成了传输,造成了冲突。
666666666
struct stm32_spi
spi1总线有个 struct stm32_spi 结构体变量对应 spi1 总线控制。spi2总线也有个 struct stm32_spi 结构体变量对应 spi2 总线控制。 struct stm32_spi 里第一个元素 handle 肯定不会是所有 spi 总线共用的吧。wait_event 元素变量也肯定不会是所有 spi 总线共用了。
抱歉,最近忙没看到。我明白你的意思的,现在我的event控制块不是定义在stm32_spi结构体中,意味着系统中所有总线共用这个event控制块,所以等待的事件需要区分开哪一个总线。你说的可以将event控制块定义在总线结构体中,这样子每个总线拥有一个事件控制块,这样子也可以,两种方式。
能否把在bus中添加一个完成量,做高层次的抽象,是否使用阻塞线程方式由底层驱动自己去实现