【随笔记】Littlevgl 8.x 踩过的坑
在多线程并发使用的时候,总是在运行过程中莫名其妙的 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 踩过的坑的更多相关文章
- Vue 学习笔记之 —— 组件(踩了个坑)
最近在学习vue,学习组件时,遇到了一个问题,困扰了半个多小时.. <!DOCTYPE html> <html lang="en"> <head> ...
- 《C++之那些年踩过的坑(二)》
C++之那些年踩过的坑(二) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. 今天讲一个小点,虽然小,但如果没有 ...
- Django 踩过的坑(一)
平台:win10 工具:cmd python3 刚刚学习Django搭建环境,网站还木有发布,就直接来了个大麻烦. 一切按着<Django 学习笔记(二)>这篇文章来的,在最后cmd运行服 ...
- nrf52832蓝牙开发踩过的坑
接触nrf52832芯片已经有一段时间了,记录我踩过的坑.这些坑大多都补回来了,愿后来的开发者没有坑~ 先来点开胃小菜 一.环境问题 安装离线包遇到的错误--svdconv exited with a ...
- 项目中踩过的坑之-sessionStorage
总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...
- web开发实战--弹出式富文本编辑器的实现思路和踩过的坑
前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...
- "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"
欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...
- 【转载】Fragment 全解析(1):那些年踩过的坑
http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...
- Redis Cluster踩过的坑
Redis Cluster踩过的坑请参考如下链接:http://www.iteye.com/blogs/subjects/Redis_Cluster_Devops
- 第八篇:web之前端踩的一些坑
前端踩的一些坑 前端踩的一些坑 本节内容 事件代理 清除标签的所有事件 bootstrap的模态框自定义方法 ajax在django里面实现post提交 ajax提交数据嵌套 1.事件代理 之前写 ...
随机推荐
- MongoDB - 入门指南
组件结构 核心进程 在 MongoDB 中,核心进程主要包含了 mongod.mongos 和 mongosh 三个. 其中最主要的是 mongod 程序,其在不同的部署方案中(单机部署.副本集部署. ...
- 2、两个乒乓球队,甲队有a,b,c三名队员,乙队有d,e,f三名队员,甲队a不愿和d比赛,c不愿意和d,f比赛,求合适的赛手名单
/*两个乒乓球队,甲队有a,b,c三名队员,乙队有d,e,f三名队员,甲队a不愿和d比赛,c不愿意和d,f比赛,求合适的赛手名单 */ #include <stdio.h> #includ ...
- 记一次 .NET 某自动化集采软件 崩溃分析
一:背景 1.讲故事 前段时间有位朋友找到我,说他的程序在客户的机器上跑着跑着会出现偶发卡死,然后就崩掉了,但在本地怎么也没复现,dump也抓到了,让我帮忙看下到底怎么回事,其实崩溃类的dump也有简 ...
- day01-计算机的本质
计算机的本质 计算机又称为"电脑": 通电的大脑 意味着我们人类希望计算机通电之后可以跟人脑一样思考问题.解决问题 计算机存储数据的本质 计算机是基于电工作,而电信号只有高低电平两 ...
- SpringBoot+hutool工具-数据库数据导出Excel
hutool文档地址:https://www.hutool.cn/docs/#/ 导入依赖 <dependency> <groupId>cn.hutool</groupI ...
- devexpress中dockManager保存布局后恢复不正常
在使用dockManager保存布局后进行恢复发现不正常,与中间的gridcontorl接触的都不行.gridcontorl设置的填充是fill 所以在在界面上再添加一个PanelControl控件并 ...
- Lakehouse架构指南
你曾经是否有构建一个开源数据湖来存储数据以进行分析需求? 数据湖包括哪些组件和功能? 不了解 Lakehouse 和 数据仓库 之间的区别? 或者只是想管理数百到数千个文件并拥有更多类似数据库的功能但 ...
- elasticsearch 聚合之 date_histogram 聚合
目录 1.背景 2.bucket_key如何计算 3.前置知识 4.日历和固定时间间隔 4.1 Calendar intervals 日历间隔 4.2 Fixed intervals 固定间隔 5.数 ...
- JavaEE Day03 MySQL约束
MySQL约束--今日内容 1. SQL-(DDL,DML,DQL),讲完DQL查询语句的使用 排序查询 聚合函数 分组查询 分页查询 2. 约束 3. 多表之间的关系 4. 范式(用于更好地设计表, ...
- 什么是NineData?突然就火了
NineData 是集成了 SQL 开发.数据复制.数据备份.数据对比多个模块的云服务,支持混合云(自建库+云数据库的业务架构)和多云(多个不同云厂商数据库组成的业务架构)架构下的企业数据管理,大幅降 ...