在多线程并发使用的时候,总是在运行过程中莫名其妙的 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. Scrapy 如何传递 get请求的params

    我们都知道 在requests中可以使用 requests.get(url,params)的方式传值 那么在scrapy中如何传值呢 直接看代码 from urllib.parse import ur ...

  2. ES6 学习笔记(十二)代理器Proxy的简单使用

    1.前言 以前在学习react时做了个仿手机端的QQ音乐项目.当时的数据是通过proxy代理的QQ音乐数据接口,直接写在package.json里面.Proxy 对象(Proxy)是 ES6的特性,只 ...

  3. 【云原生 · Kubernetes】Kubernetes简介及基本组件

    1.Kubernetes简介 Kubernetes是Google开源的容器集群管理系统,其提供应用部署.维护. 扩展机制等功能,如图1.3所示.利用Kubernetes能方便地管理跨机器运行容器化的应 ...

  4. 18道经典链表题刷题总结——WeetCode1 链表系列

    系列文章目录和关于我 前言: WeetCode = Week leetCode 寓意每周刷点leetCode 题目 链表是我恢复刷题手感最喜欢做的系列,其没用太多的算法思想,单纯考验对指针的理解,和c ...

  5. C++初阶(stack+queue)

    stack stack介绍 stack是一种先进后出的数据结构,只有一个出口,类似于栈.stack容器哦允许新增元素,移除元素,取得栈顶元素,但是除了最顶端之后,没有任何其他办法可以存取stack的其 ...

  6. Aspose.Cells实现excel预览

    ​ 在WEB项目中经常遇到excel文档在线预览的需求,基本的解决思路有以下几大类:excel文档转PDF.excel文档直接转html.后台读取excel数据返回给前端利用Excel效果的表格插件如 ...

  7. [CG] 用 Docker 配置 Ubuntu OpenGL 环境

    成功在 MacOS 的 Docker 中运行 OpenGL 程序并显示这里记录一下: 我用的是 https://hub.docker.com/r/thewtex/opengl 这个镜像非常好,大部分工 ...

  8. typora实现多平台发布文章

    源码下载 前言 之前写过一片文章,typora 使用CSDN作为图床,用来存储 markdown 文章的图片资源文件.后来发现 typora 还可以自定义导出命令,那么也可以利用这个功能实现直接发布到 ...

  9. VBA驱动SAP GUI自动化:查找页面元素FindAllByName

    我们在VBA中嵌入SAP原生的[脚本录制与回放]功能生成的VBS脚本,可以实现很多自动化操作.但只有我们对SAP做了一系列动作,才会得到这些动作的脚本.然而,一旦我们需要用代码提前做一些判断,然后再决 ...

  10. 更改HTML请求方式的几种方法

    以ctfhub中的请求方式题目为例,则可以有: 法一:通过burpsuite抓包修改 在burpsuite中抓包后发送到repeater模块中,对请求方式进行修改即可 法二:通过curl命令进行 cu ...