Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
MRkuan opened this issue Nov 4, 2020 · 3 comments
Open

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

MRkuan opened this issue Nov 4, 2020 · 3 comments

Comments

@MRkuan
Copy link

MRkuan commented Nov 4, 2020

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


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

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

@MRkuan
Copy link
Author

MRkuan commented Nov 4, 2020

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

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

@murphyzhao
Copy link
Owner

感谢您的反馈 😃

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

@FangXS-github
Copy link

像例程中单独创建一个按键任务,即使在任意时刻打断,恢复上下文将继续操作。
操作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);
}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants