murphyzhao / FlexibleButton

灵活的按键处理库(Flexible Button)| 按键驱动 | 支持单击、双击、连击、长按、自动消抖 | 灵活适配中断和低功耗 | 按需实现组合按键
Apache License 2.0
673 stars 289 forks source link

有考虑过 flex_button_register 和 button_scan 线程安全 #23

Open MRkuan opened 4 years ago

MRkuan commented 4 years ago

按照DEMO的时序是 在 init初始化 flex_button_register 注册好按键,然后开启线程button_scan 进行扫描,这个肯定没问题


如果在其它应用调用 flex_button_register , 会和 button_scan 有线程安全问题?,导致加入按键链表有的 按键 结构体数据可能不完整,被button_scan 打断,导致有问题

加下这两个函数互斥应该完美点。。。

MRkuan commented 4 years ago

还有 flex_button_event_read 读出事件结果,没有读写锁,也没有线程安全

以上是本人的拙见。。。。

murphyzhao commented 3 years ago

感谢您的反馈 😃

确实会存在多线程安全的问题,后续我考虑下如何简单实现数据互斥,您有好的想法和代码实现也可以直接 PR 提上来 。

FangXS-github commented 9 months ago

像例程中单独创建一个按键任务,即使在任意时刻打断,恢复上下文将继续操作。 操作flex_button全局,只在当前按键任务进行操作,是线程安全的; 只要不在别的任务进行flex_button库的数据操作或其他操作即可; 可以在按键回调任务发送事件,信号量或队列进行数据传递;

如果非要在其他任务操作 flex_button_register: 我推荐的做法是
void other_task() { flex_button_register(); semp_give(); // 注册完成 发送信号量解除按键任务阻塞 for(;;){ //.......... } } void key_task() { semp_take(max_delay); // 等待创建完成进行 扫描工作 for(;;){ flex_key_scan(); os_delay(20); } }