比如现在有can和lvgl两个线程。can可能不定期接收到数据,接收到数据后想更新到屏幕上。
那么该如何设计更新逻辑好呢?
1, can线程里收到数据后调用lvgl控件直接更改显示;
2,can线程收到数据后存到全局变量里,lvgl线程里开启个定时器,定时刷新控件读取这个全局变量;
3,can线程收到数据后存到全局变量里,同时发送信号量,通知lvgl线程去读取这个全局变量?
请教,改怎么设计好呢?
离线
不建议使用方式1
2、3都可以,看你更新周期要多快。
离线
感谢。
目前暂定大概10秒can收到一组数据。
用2的话,比如定时1秒更新下lvgl控件显示,感觉有点浪费,毕竟实际10秒才有数据变动。
离线
如果是周期性频繁收到数据,那就选第2种;
如果是偶发性收到数据,那就选第3种;
至于第1种,lvgl官方文档也有详细解释。https://docs.lvgl.io/8.4/porting/os.html#tasks-and-threads
离线
建议3.用信号量去触发界面更新。
如果数据量不大,可以用邮箱把一次性将数据送给显示线程。这样可以避免在显示时,全局变量被CAN线程修改。
离线
感谢各位。那就用线程间消息通知的方式吧。
离线