rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

[drv_spi] 将等待spi传输完成的方式从死等变为阻塞线程的形式

Open qingehao opened this issue 3 years ago • 7 comments

拉取/合并请求描述:(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

qingehao avatar Jan 31 '22 11:01 qingehao

很棒👍

Guozhanxin avatar Feb 09 '22 03:02 Guozhanxin

每个 spi 总线都有一个 struct stm32_spi 结构体变量的吧,因此,各个 wait_event 变量是独立的。 XXX_TxRxCplt_EVENT XXX_TxCplt_EVENT XXX_RxCplt_EVENT 这几个宏定义一个就够了吧。 set_wait_event 函数也不用区分是哪个总线。

thewon86 avatar Feb 10 '22 06:02 thewon86

每个 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总线收到了该事件,会认为是它完成了传输,造成了冲突。

qingehao avatar Feb 10 '22 08:02 qingehao

666666666

mysterywolf avatar Feb 20 '22 05:02 mysterywolf

struct stm32_spi

spi1总线有个 struct stm32_spi 结构体变量对应 spi1 总线控制。spi2总线也有个 struct stm32_spi 结构体变量对应 spi2 总线控制。 struct stm32_spi 里第一个元素 handle 肯定不会是所有 spi 总线共用的吧。wait_event 元素变量也肯定不会是所有 spi 总线共用了。

thewon86 avatar Feb 21 '22 01:02 thewon86

抱歉,最近忙没看到。我明白你的意思的,现在我的event控制块不是定义在stm32_spi结构体中,意味着系统中所有总线共用这个event控制块,所以等待的事件需要区分开哪一个总线。你说的可以将event控制块定义在总线结构体中,这样子每个总线拥有一个事件控制块,这样子也可以,两种方式。

qingehao avatar Mar 09 '22 17:03 qingehao

能否把在bus中添加一个完成量,做高层次的抽象,是否使用阻塞线程方式由底层驱动自己去实现 image

BreederBai avatar Sep 04 '22 17:09 BreederBai