在多线程并发使用的时候,总是在运行过程中莫名其妙的 crash,后面才意识到 LVGL 本身不支持并发,加了互斥锁解决了。

在引入矢量字库时(freetype),又有启动时会概率性 crash 的问题,每次 crash 的地方还不一样,这个坑爬了好久,甚至都怀疑是不是 freetype 有问题,还好总算找到方法解决了,不过还不清楚具体原因,先记录。

以下以 linux 平台下 C++ 语言的方式举例说明,理解方法即可。

一、多线程并发使用

多线程并发使用时,需要在以下两种情况加上互斥锁:

1. 移植时在调用 lv_tick_inc(1) 和 lv_task_handler() 时上锁

// 线程函数
void LvglDrive::prvLvTickTask(LvglDrive *context)
{
while(context->th_tasktick_runing)
{
context->m_lvmutex.lock();
lv_tick_inc(1);
context->m_lvmutex.unlock();
usleep(1 * 1000);
}
return ;
} // 线程函数
void LvglDrive::prvLvHandlerTask(LvglDrive *context)
{
while(context->th_tasktick_runing)
{
context->m_lvmutex.lock();
lv_task_handler();
context->m_lvmutex.unlock();
usleep(5 * 1000);
}
return ;
}

2. 操作控件时上锁

void GuiManager::toast_show(const char *str, unsigned int timeout)
{
LvglDrive::getInstance()->lock();
lv_timer_reset(lv_timer_toast);
lv_timer_pause(lv_timer_toast);
if(timeout){
lv_timer_set_period(lv_timer_toast, timeout);
lv_timer_resume(lv_timer_toast);
}
lv_label_set_text(lv_obj_toast, str);
lv_obj_set_style_pad_top(lv_obj_toast, 5, 0);
lv_obj_set_style_pad_left(lv_obj_toast, 15, 0);
lv_obj_set_style_pad_right(lv_obj_toast, 15, 0);
lv_obj_set_style_pad_bottom(lv_obj_toast, 8, 0);
LvglDrive::getInstance()->unlock();
return ;
} void GuiManager::toast_hide()
{
LvglDrive::getInstance()->lock();
lv_timer_reset(lv_timer_toast);
lv_timer_pause(lv_timer_toast);
lv_label_set_text(lv_obj_toast, "");
lv_obj_set_style_pad_top(lv_obj_toast, 0, 0);
lv_obj_set_style_pad_left(lv_obj_toast, 0, 0);
lv_obj_set_style_pad_right(lv_obj_toast, 0, 0);
lv_obj_set_style_pad_bottom(lv_obj_toast, 0, 0);
LvglDrive::getInstance()->unlock();
return ;
}

二、引入矢量字库(freetype)

需要先把所有需要用到的 UI 控件都创建和初始化完成之后,再去创建两个线程去调用 lv_tick_inc(1) 和 lv_task_handler(),顺序如下:

1、初始化 framebuffer、lv_init()、lv_freetype_init()、lv_port_disp_init()

2、初始化所需要的 UI 控件

3、创建线程调用  lv_task_handler() 、lv_tick_inc(1)

4、按需要设置 UI 控件

bool GuiManager::running()
{
// 初始化 framebuffer、lv_init()、lv_freetype_init()、lv_port_disp_init()
if(LvglDrive::getInstance()->init() == false){
eprintf("lvgl driver running failed!!!\n");
return false;
} ... static lv_ft_info_t ft_info_18;
ft_info_18.name = RES_FONT_PATH;
ft_info_18.weight = 18;
ft_info_18.style = FT_FONT_STYLE_NORMAL | FT_FONT_STYLE_BOLD;
lv_ft_font_init(&ft_info_18); static lv_style_t style_18;
lv_style_init(&style_18);
lv_style_set_text_font(&style_18, ft_info_18.font);
lv_style_set_radius(&style_18, LV_RADIUS_CIRCLE); lv_obj_toast = lv_label_create(lv_layer_sys());
lv_obj_add_style(lv_obj_toast, &style_18, 0);
lv_obj_set_style_bg_opa(lv_obj_toast, LV_OPA_30, 0);
lv_obj_set_style_bg_color(lv_obj_toast, lv_color_black(), 0);
lv_obj_set_style_text_color(lv_obj_toast, lv_color_white(), 0);
lv_label_set_text(lv_obj_toast, "");
lv_obj_set_style_pad_top(lv_obj_toast, 0, 0);
lv_obj_set_style_pad_left(lv_obj_toast, 0, 0);
lv_obj_set_style_pad_right(lv_obj_toast, 0, 0);
lv_obj_set_style_pad_bottom(lv_obj_toast, 0, 0);
lv_obj_align(lv_obj_toast, LV_ALIGN_CENTER, 0, 50); lv_timer_toast = lv_timer_create(on_timer_lv_toast_refresh, 500, this);
lv_timer_pause(lv_timer_toast); ... // 创建线程:prvLvTickTask()、prvLvHandlerTask()
LvglDrive::getInstance()->run();
return true;
}

【随笔记】Littlevgl 8.x 踩过的坑的更多相关文章

  1. Vue 学习笔记之 —— 组件(踩了个坑)

    最近在学习vue,学习组件时,遇到了一个问题,困扰了半个多小时.. <!DOCTYPE html> <html lang="en"> <head> ...

  2. 《C++之那些年踩过的坑(二)》

    C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. 今天讲一个小点,虽然小,但如果没有 ...

  3. Django 踩过的坑(一)

    平台:win10 工具:cmd python3 刚刚学习Django搭建环境,网站还木有发布,就直接来了个大麻烦. 一切按着<Django 学习笔记(二)>这篇文章来的,在最后cmd运行服 ...

  4. nrf52832蓝牙开发踩过的坑

    接触nrf52832芯片已经有一段时间了,记录我踩过的坑.这些坑大多都补回来了,愿后来的开发者没有坑~ 先来点开胃小菜 一.环境问题 安装离线包遇到的错误--svdconv exited with a ...

  5. 项目中踩过的坑之-sessionStorage

    总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...

  6. web开发实战--弹出式富文本编辑器的实现思路和踩过的坑

    前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...

  7. "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"

    欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...

  8. 【转载】Fragment 全解析(1):那些年踩过的坑

    http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...

  9. Redis Cluster踩过的坑

    Redis Cluster踩过的坑请参考如下链接:http://www.iteye.com/blogs/subjects/Redis_Cluster_Devops

  10. 第八篇:web之前端踩的一些坑

    前端踩的一些坑   前端踩的一些坑 本节内容 事件代理 清除标签的所有事件 bootstrap的模态框自定义方法 ajax在django里面实现post提交 ajax提交数据嵌套 1.事件代理 之前写 ...

随机推荐

  1. JavaScript 默认参数、动态参数、剩余参数

    默认参数: <script> function selet(num, max) { console.log(num + max); } selet(1, 5); </script&g ...

  2. python中的字符串学习

    # 1.字符串的下标(索引) # 取字符串中的子串 print('1.字符串的下标(索引)') str1 = 'PYTHON' print(str1[0]) print(str1[-4]) # 2.字 ...

  3. Sqlite 安装操作使用

    一.什么是 SQLite 数据库 SQLite 是嵌入式SQL数据库引擎.与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程.SQLite 直接读取和写入普通磁盘文件.具有多个表,索 ...

  4. vue3中的defineProps,watch,computed

    在vue3的setup语法糖中,defineProps不需要引入了 <script setup> import { computed } from '@vue/reactivity'; i ...

  5. PHY驱动调试之 --- PHY控制器驱动(二)

    1. 前言 内核版本:linux 4.9.225,以freescale为例. 2. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII ...

  6. log4j漏洞原理

    一.前置知识 1.JNDI接口 JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发 ...

  7. Maven工程提示 java:源值1.5已过时,将在未来所有发行版中删除 出现原因及解决方案(亲测好用)

    原因:Maven工程默认使用Java1.5进行编译,想要不警告,需要在maven的pom文件中进行配置,同时在settings中进行配置 解决方案: <properties> <me ...

  8. 【每日一题】【递归实现、自下而上、优化】-2022年1月12日-NC68 跳台阶

    描述一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果). 数据范围:0 \leq n \leq 400≤n≤40要求:时间复杂度: ...

  9. 关于Mybatis-Plus中update()、updateById()方法的使用及null值的判断

    使用场景说明: 在 Mybatis-Plus 的使用过程中,经常会遇对数据库更新的情况 更新常用方法:update().updateById() 问题:经常会遇见对 null 值的处理,对传入的实体参 ...

  10. (小白向)2020-12-18 中国大学MOOC第十二讲-动态变量应用

    1创建单向链表(10分) 问题描述:根据随机输入的若干非零整数,以数字0结束:建立一个新链表. 输入:随机输入若干个整数,以数字0结束 输出:新建链表中个节点的值,数字间没有间隔字符. 样例:输入 5 ...