【随笔记】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.事件代理 之前写 ...
随机推荐
- ML-梯度下降法的详细推导与代码实现
计算 对于线性回归,梯度下降法的目标就是找到一个足够好的向量\(\theta\),使代价函数\(J(\theta) = \sum_{i=1}^{m}(\hat{y}-y_{i})^{2}\)取得最小值 ...
- FastApi学习1
先写路由文件: 其次通过ORM操作数据库相关:
- 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)
小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...
- 【翻译】Spring Security抛弃了WebSecurityConfigurerAdapter
原文链接:Spring Security without the WebSecurityConfigurerAdapter 作者:ELEFTHERIA STEIN-KOUSATHANA 发表日期:20 ...
- MongoDB - 索引知识
索引简介 什么是索引 索引最常用的比喻就是书籍的目录,查询索引就像查询一本书的目录. 索引支持 MongoDB 查询的高效执行.如果没有索引,MongoDB 必须扫描集合中每一个文档,以选择与查询语句 ...
- SpringCLoud_Aibaba
微服务项目核心组件 https://gitee.com/gtnotgod/spring-cloud_-alibaba_-study001.git 注册中心:nacos API网关:gateway 生产 ...
- FCOS论文复现:通用物体检测算法
摘要:本案例代码是FCOS论文复现的体验案例,此模型为FCOS论文中所提出算法在ModelArts + PyTorch框架下的实现.本代码支持FCOS + ResNet-101在MS-COCO数据集上 ...
- Datawhale组队学习_Task03:详读西瓜书+南瓜书第4章
第4章 决策树 4.1 基本流程 #输入:训练集D={${(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}$}; #属性集A=${{a_1,a_2,...,a_d}}$. #过程: ...
- 快速绘制流程图「GitHub 热点速览 v.22.47」
画流程图一直是研发的一个难题,如何画得通俗易懂已经够让人头疼了,还要美观大方.用 d2 的语法描述下流程,d2 会自动帮你生成一张配色极佳的流程图.说到研发的选择,本周特推的 choiceof.dev ...
- [opencv]一些重配遇到的问题(只针对我自己的电脑)
1.我的opencv版本是4.5.3 2.环境变量这样配 3.对于每个项目,项目属性这样配: 其中包含目录: C:\Users\dxd\OPCV\opencv\build\include\opencv ...