为什么操作 UI 必须加 `lcd_mutex` 互斥锁?不用会怎样?
1. 先给结论你必须记住LVGL 所有界面操作创建文字、按钮、刷新屏幕都不是线程安全的。意思是绝对不能有两个线程同时操作 LVGL 界面线程ALVGL 主线程一直在刷新屏幕线程B你的任务3线程突然去创建 UI如果两个线程同时碰 LVGL→ 直接死机、花屏、界面卡死、汉字不显示、按钮乱跳。2. 那rt_mutex_take / rt_mutex_release到底做了什么rt_mutex_take(lcd_mutex,RT_WAITING_FOREVER);// 上锁create_task3_ui();// 安全操作UIrt_mutex_release(lcd_mutex);// 解锁它的作用只有一句话让“操作UI”这段代码变成原子操作同一时间只能有一个线程执行具体行为take拿走 LCD 互斥锁LVGL 线程会被卡住等待锁释放屏幕暂时停止刷新create_task3_ui()只有当前线程能操作 UI绝对安全release释放锁LVGL 线程恢复运行继续刷新屏幕新界面立刻显示出来3. 重点如果不加互斥锁会发生什么严重后果我直接告诉你真实会出现的问题后果 1界面花屏 / 黑屏 / 显示错乱LVGL 正在刷新画面 → 你突然改界面 → 画面画到一半被破坏 → 显示乱码。后果 2汉字显示不出来你今天遇到的问题两个线程同时操作字体资源 → 字体指针被破坏 → 汉字无法渲染。后果 3程序直接进入 HardFault 崩溃死机这是最常见的链表结构破坏内存指针踩坏控件被重复创建/删除后果 4UI 卡死点击无反应LVGL 内部状态机被多线程打乱 → 永远卡住。后果 5偶尔正常、偶尔异常最难调试的BUG多线程竞争不是必现的→ 你调试时正常→ 跑着跑着突然死机→ 查半天查不出来4. 用最通俗的比喻你就彻底懂了LVGL 界面 一张画布LVGL 线程 正在画画的画家你的任务线程 另一个想画画的人如果不加锁两个人同时在一张纸上画 → 画面糊掉、画错、画乱、纸撕破。加锁你说等一下我画完你再画 画家停下 → 你画 → 画完 → 画家继续5. 你的工程里哪些地方必须加锁只要出现下面任意一种必须加锁创建文字lv_label_create(...);创建按钮lv_btn_create(...);修改文字内容lv_label_set_text(...);刷新界面lv_obj_align(...);切换界面create_task3_ui();删除控件lv_obj_del(...);6. 最终总结最重要的3句话LVGL 不支持多线程同时操作界面互斥锁的作用是同一时间只允许一个线程操作界面不加锁 界面乱码 死机 崩溃 偶现BUG你现在的写法rt_mutex_take(lcd_mutex,RT_WAITING_FOREVER);create_task3_ui();rt_mutex_release(lcd_mutex);✅ 这是最标准、最安全、最正确的写法
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2452428.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!