完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的需求是,按一下按键灯只闪烁一次,解决轮询读取按键中抖动的问题,理论上线程2获得互斥量期间线程1不是不会识别的吗?为什么还会出现抖动识别问题,按一下灯还是会闪2-3次呢? /* USER CODE BEGIN 0 / |
|
相关推荐
7个回答
|
|
仅限于你现有框架的探讨,在thread1_entry中,一般是这么去抖的:
while(1) { if(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)) // low level { rt_thread_mdelay(20); if(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)) // low level { /* Do something. Here we release mutex*/ rt_mutex_release(mutex); while(!HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)) // waiting untill key is released { rt_thread_mdelay(10); } } } } |
|
|
|
emm,这个我了解,但是我的thread1_entry中也进行了互斥量的获取,理论上只能有一个线程获取到互斥量,并且在读取完成功后立马就释放了互斥量,也就是说读取完后thread2_entry马上就进行处理(也就是灯亮灭)并且thread1_entry会陷入等待互斥量,也就不需要额外的消抖操作了。但是现象是按一下按键还是会有重复亮灭的现象产生,不知道是怎么回事呢。
|
|
|
|
假设TREAD_PRIORITY小于10,即优先级大于main,按照你的代码写法,过程如下:
thread1,因为先创建,所以先获得CPU,take mutex成功,进入第2层死循环;当按键没有按下的时候,是不会交出CPU的。 thread1, 假设按键按下,满足条件,释放mutex,进入200ms等待,交出CPU; thread2,获得CPU,take mutex成功,LED置低,进入500ms等待,交出CPU; thread1, thread1的延时时间短,获得CPU,执行break,退出第2层循环。进入第1层循环,无法take mutex, 因为thread2尚未release,交出CPU; thread2,500ms的延时时间到,取得CPU,LED置高,再次延时500ms; thread2, 500ms延时到,再次release,回到while(1)的mutex take,继续翻转LED。 thread2于是就多次闪烁LED了。 |
|
|
|
谢谢回答,我懂你的意思,但是第6步里面,在thread2释放mutex的下一时刻,无论是thread1还是thread2都同时在等待,如何知道这种情况下谁先获得mutex的控制权呢?
你的回答让我有了启发就是这个消抖方案并不能很好地控制两个线程谁先获得控制权,官方文档下说会“唤醒”,我也没有自己阅读过内核代码。 但是我推测,这可能是关系到两个线程的时间片问题?因为在thread2释放mutex前刚好是500ms延时结束,于是刚好发起调度到thread2,他也有足够的时间再次获取mutex。==但这种想法似乎对thread1的获取mutext条件很苛刻,那就是thread2在释放mutex的时候刚好时间片用完,内核发起调度,从我观察的实验现象来说他只会闪两次也就是两次后thread1必定获取,==我再试试改变时间片 |
|
|
|
内核源码里面释放了互斥量之后会发起调度,理论上应该是thread1获得。 |
|
|
|
我猜测,也是和时间片分配有关系,这里深入研究的话,花费时间较多,我就是从面上大致说一下个人看法。
加上,关于时间片的处理,论坛也有blta大佬在研究这部分工作。目前releease版本的rtt的时间片处理其实有不合理之处 另外,按键的线程和处理的线程之间为什么要用mutex进行通信呢?这里不涉及到互斥操作,mutex内部处理为了避免优先级反转也做了一些工作。 个人观点:用消息队列、sem之类的更符合按键的使用场景。比如,多个按键被按下、长时间按键等处理,用mutex是不合适的。 |
|
|
|
你可以打开内核调试,关注一下RT_DEBUG_LOG的输出。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
883 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3025 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1409 浏览 0 评论
2039 浏览 0 评论
1574 浏览 0 评论
75139 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 16:30 , Processed in 0.840632 second(s), Total 85, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号