打印
[技术讨论]

FreeRTOS如何保证SPI/I2C/I2S等外设操作不被其他任务打断

[复制链接]
605|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MengLinyang|  楼主 | 2024-8-22 08:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
测试板子STM32F407VET6,使用HAL库+FreeRTOS+lwip+lvgl+Fatfs
功能:读取传感器数据,然后显示到屏幕上并通过lwip http上传服务器,同时判断是否触发报警,触发报警则播放报警音乐且LED灯也变红色。

用到了I2C1、I2C3、SPI1、SPI2、I2S3以及一堆uart等外设
其中SPI2还是多个设备的,每个设备对SPI设置不一样,有CS引脚进行切换。
目前针对SPI2 我用了个全局变量设备类型,每次对SPI2操作前判断当前设备和之前的设备类型是否一致,不一致就执行对应的spi_init 然后关闭所有SPI2片选 只打开当前设备的片选。
目前情况:
SPI2读一个设备的时候,刚好另外一个任务触发SPI2写另外一个设备,判断SPI2还处于Locked状态导致操作失败。

之前搜了下用互斥锁,保证每一个外设操作时不会被打断,我在每个外设读写前后加上了获取和释放,但是很快就卡死了。

#define SPI2_MUTEX_WAITTIMEOUT 10000

#define SPI2_MUTEX_WAIT    osMutexAcquire(SPI2MutexHandle, SPI2_MUTEX_WAITTIMEOUT)
#define SPI2_MUTEX_RELEASE osMutexRelease(SPI2MutexHandle)
// 外设读写前后分别加上SPI2_MUTEX_WAIT和SPI2_MUTEX_RELEASE但是程序马上卡死了


刚开始使用FreeRTOS,求问各个外设读写数据时,如何保证不被其他任务打断?



使用特权

评论回复

相关帖子

沙发
zchong| | 2024-8-23 08:39 | 只看该作者
典型的临界资源保护问题,外设一般就是使用互斥量,互斥量有优先级继承的机制,不会引起死锁。如果想更简单那就关闭中断。

使用特权

评论回复
板凳
MengLinyang|  楼主 | 2024-8-27 17:44 | 只看该作者
zchong 发表于 2024-8-23 08:39
典型的临界资源保护问题,外设一般就是使用互斥量,互斥量有优先级继承的机制,不会引起死锁。如果想更简单 ...

感谢大佬回复,但是我尝试使用了互斥锁,但是程序卡死了,应该是死锁了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝