完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
对于串口发送,我们都普遍用中断方式发送,
可是在配合互斥量的时候会遇到些问题, 互斥量的使用 必须在同一个任务中 占用和释放, 我目前的做法是用二值信号量 在 发送中断完成时释放信号, 可是这样还是会引起锁死,比如当同一个任务多次抢占时, 最后还是得换到互斥量, 基于串口中断发送模式, 希望使用互斥量来访问串口的话 , 该如何释放发送完成信号呢? 在中断函数中释放互斥量是不行的 |
|
相关推荐
1个回答
|
|
在使用FreeRTOS的互斥量(Mutex)来保护串口发送时,确实需要注意一些问题。由于互斥量必须在同一个任务中占用和释放,而中断服务例程(ISR)通常不属于任何任务,因此不能直接在ISR中释放互斥量。为了解决这个问题,可以采用以下方法:
1. 使用二值信号量(Binary Semaphore):在你的描述中,你已经尝试了使用二值信号量在发送中断完成时释放信号。为了避免死锁,可以考虑在发送任务中使用信号量等待,而不是直接使用互斥量。当串口发送中断完成时,释放信号量,让发送任务继续执行。 2. 使用中断安全API:FreeRTOS提供了一些中断安全的API,可以在ISR中安全地与任务通信。例如,可以使用`xSemaphoreGiveFromISR()`函数在ISR中释放信号量。这样,你可以在发送任务中使用信号量等待,然后在ISR中释放信号量。 3. 延迟释放互斥量:如果确实需要在发送任务中使用互斥量,可以考虑在发送任务中使用一个标志变量来表示串口发送的状态。当串口发送开始时,占用互斥量并设置标志变量。在ISR中,检查标志变量,如果发现发送已经开始,就不需要再次占用互斥量。当发送完成时,再次检查标志变量,如果发现发送已经完成,就在ISR中释放互斥量。 4. 使用任务通知:FreeRTOS的任务通知(Task Notifications)可以在任务之间传递有限范围的值。你可以使用任务通知来代替信号量,在发送任务中等待通知,然后在ISR中发送通知。 总之,在使用FreeRTOS互斥量保护串口发送时,需要考虑如何在任务和ISR之间安全地通信。可以尝试上述方法,根据你的具体需求和场景选择最合适的解决方案。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1937浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 01:52 , Processed in 0.476134 second(s), Total 73, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号