Open MRkuan opened 4 years ago
还有 flex_button_event_read 读出事件结果,没有读写锁,也没有线程安全
以上是本人的拙见。。。。
感谢您的反馈 😃
确实会存在多线程安全的问题,后续我考虑下如何简单实现数据互斥,您有好的想法和代码实现也可以直接 PR 提上来 。
像例程中单独创建一个按键任务,即使在任意时刻打断,恢复上下文将继续操作。 操作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);
}
}
按照DEMO的时序是 在 init初始化 flex_button_register 注册好按键,然后开启线程button_scan 进行扫描,这个肯定没问题
如果在其它应用调用 flex_button_register , 会和 button_scan 有线程安全问题?,导致加入按键链表有的 按键 结构体数据可能不完整,被button_scan 打断,导致有问题
加下这两个函数互斥应该完美点。。。