在windows系统搭建LVGL模拟器(codeblock工程)
1.codeblock准备
下载codeblock(mingw),安装。可参考网上教程。
2.pc_simulator_win_codeblocks 工程获取
仓库地址:lvgl/lv_port_win_codeblocks: Windows PC simulator project for LVGL embedded GUI Library (github.com)
拉取代码到本地硬盘,如下操作步骤:
# 打开git终端输入下面地址并回车
git clone https://github.com/lvgl/lv_sim_codeblocks_win.git# 进入文件夹lv_sim_codeblocks_win
cd lv_sim_codeblocks_win # 执行下面命令拉取子模块并初始化仓库
git submodule update --init --recursive# 文件夹介绍:
# lvgl:lvgl源代码# lv_examples:lvgl 的使用例程(各种控件使用例程,布局使用例程,系统API使用例程,第三方库使用例程...)# lv_demo:官方给的比较综合的demo示例# lv_drivers:和平台相关的底层驱动
如下图:
LittlevGL.cbp 就是codeblock工程。
我拉取的LVGL 是V9 版本。
3.编译工程
打开codeblock,选择工程,【File】-【Open】如下图:
设置编译器,【Settings】-【Compiler...】,如下图:
执行【Auto-detect】,或者选取自己的mingw编译器路径,我使用的是QT5自带的编译器
编译并运行,如下图:
等待一段时间,一个默认的demo编译好后自动运行界面如下:
本篇文章不具体讲解LVGL控件使用,可自行在网上找教程,或使用官方教程文档。
4.使用LVGL V9 文件系统报错问题排查
下面我记录下,使用LVGL访问文件系统出现的问题,我一开始参考的教程是百问网的LVGL教程,他使用的LVGL是V8版本,所以我参照教程使用一直报 “未知错误”
LVGL默认支持4种文件系统 分别是 LV_USE_FS_STDIO ,LV_USE_FS_POSIX,LV_USE_FS_WIN32,LV_USE_FS_FATFS
我们使用windows 平台我选择 LV_USE_FS_WIN32 ,对应的底层文件操作都是windows自带的,所以不需要移植了。
在lv_conf.h中打开配置如下:
我挂载到D盘,工作目录 LV_FS_WIN32_PATH "" 不配置。
示例代码如下:
#define FILE_NAME "D:/example/example.txt"
void lv_chenbo_demo_fs(void)
{
#if 1lv_fs_file_t f;lv_fs_res_t res;res = lv_fs_open(&f, FILE_NAME, LV_FS_MODE_RD);if(res != LV_FS_RES_OK) {LV_LOG_USER("open file error:%d!", res);return;}uint32_t read_num;uint8_t buf[32];memset(buf,0x0,sizeof buf);res = lv_fs_read(&f, buf, 32, &read_num);if(res != LV_FS_RES_OK) {LV_LOG_USER("read file error!");}printf("read content:\n%s", buf);lv_fs_close(&f);
#endif
}
我在D盘创建文件 example/example.txt
编译运行:
一直报错打开文件失败,错误代码12
跳转到 lv_fs.c 中的 lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode)函数如下:
lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode)
{if(path == NULL) {LV_LOG_WARN("Can't open file: path is NULL");return LV_FS_RES_INV_PARAM;}char letter = path[0];lv_fs_drv_t * drv = lv_fs_get_drv(letter);if(drv == NULL) {LV_LOG_WARN("Can't open file (%s): unknown driver letter", path);return LV_FS_RES_NOT_EX;}if(drv->ready_cb) {if(drv->ready_cb(drv) == false) {LV_LOG_WARN("Can't open file (%s): driver not ready", path);return LV_FS_RES_HW_ERR;}}if(drv->open_cb == NULL) {LV_LOG_WARN("Can't open file (%s): open function not exists", path);return LV_FS_RES_NOT_IMP;}const char * real_path = lv_fs_get_real_path(path);void * file_d = drv->open_cb(drv, real_path, mode);if(file_d == NULL || file_d == (void *)(-1)) {return LV_FS_RES_UNKNOWN;}file_p->drv = drv;file_p->file_d = file_d;if(drv->cache_size) {file_p->cache = lv_malloc(sizeof(lv_fs_file_cache_t));LV_ASSERT_MALLOC(file_p->cache);lv_memzero(file_p->cache, sizeof(lv_fs_file_cache_t));file_p->cache->start = UINT32_MAX; /*Set an invalid range by default*/file_p->cache->end = UINT32_MAX - 1;}return LV_FS_RES_OK;
}
这个函数是LVGL提供的是一个抽象的文件操作API,他根据不同的文件系统去调用更底层的文件系统接口。
问题出在这里:
const char * real_path = lv_fs_get_real_path(path);void * file_d = drv->open_cb(drv, real_path, mode);if(file_d == NULL || file_d == (void *)(-1)) {return LV_FS_RES_UNKNOWN;}
看下static const char * lv_fs_get_real_path(const char * path) 函数
/*** Skip the driver letter and the possible : after the letter* @param path path string (E.g. S:/folder/file.txt)* @return pointer to the beginning of the real path (E.g. /folder/file.txt)*/
static const char * lv_fs_get_real_path(const char * path)
{path++; /*Ignore the driver letter*/if(*path == ':') path++;return path;
}
它的功能就是获取路径 : 后面的字符地址,也就是他把盘符D: 去掉了。
drv->open_cb()是一个回调函数,我们使用是WIN32平台的文件系统所以看
lv_fs_win32.c 中的static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
函数如下:
/*** Open a file* @param drv pointer to a driver where this function belongs* @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt)* @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR* @return pointer to FIL struct or NULL in case of fail*/
static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
{LV_UNUSED(drv);DWORD desired_access = 0;if(mode & LV_FS_MODE_RD) {desired_access |= GENERIC_READ;}if(mode & LV_FS_MODE_WR) {desired_access |= GENERIC_WRITE;}/*Make the path relative to the current directory (the projects root folder)*/char buf[MAX_PATH];lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s", path);return (void *)CreateFileA(buf,desired_access,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
}
看下面代码(重点):
char buf[MAX_PATH];lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s", path);
这个功能是:把我们传过来的路径(前面已经去掉D:) 然后和 LV_FS_WIN32_PATH 拼接在一起,还记得之前这个宏定义我们设置的是空字符串"",这样拼成的新的路径传递给windows底层API使用,造成的结果就是路径错误("/example/examle.txt")。
所以我们就算不配置工作路径,也要把盘符设置一下:
/*API for CreateFile, ReadFile, etc*/
#define LV_USE_FS_WIN32 1
#if LV_USE_FS_WIN32#define LV_FS_WIN32_LETTER 'D' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#define LV_FS_WIN32_PATH "D:" /*Set the working directory. File/directory paths will be appended to it.*/#define LV_FS_WIN32_CACHE_SIZE 1024 /*>0 to cache this number of bytes in lv_fs_read()*/
#endif
这样编译,在运行:
D:/example/example.txt 文件中的 hello,world 被读取出来并显示。
注意:我实际测试的LVGL V9版本必须要这样设置。
相关文章:
在windows系统搭建LVGL模拟器(codeblock工程)
1.codeblock准备 下载codeblock(mingw),安装。可参考网上教程。 2.pc_simulator_win_codeblocks 工程获取 仓库地址:lvgl/lv_port_win_codeblocks: Windows PC simulator project for LVGL embedded GUI Library (github.com) 拉取代码到本地硬盘&…...
2023第十四届蓝桥杯国赛 C/C++ 大学 B 组
文章目录 前言试题 A: 子 2023作者思考题解答案 试题 B: 双子数作者思考题解 试题 C: 班级活动作者思考题解 试题 D: 合并数列作者思考题解 试题 E: 数三角作者思考题解 试题 F: 删边问题作者思考题解 试题 G: AB 路线作者思考题解 试题 H: 抓娃娃作者思考题解 试题 I: 拼数字试…...
如何在页面中加入百度地图
官方文档:jspopularGL | 百度地图API SDK (baidu.com) 添加一下代码就可以实现 <!DOCTYPE html> <html> <head><meta name"viewport" content"initial-scale1.0, user-scalableno"/><meta http-equiv"Conten…...
Windows VC++提升当前进程权限到管理员权限
Windows VC提升当前进程权限 Windows VC提升当前进程权限到管理员权限 Windows VC提升当前进程权限到管理员权限 有时候Windows下我们需要提升当前进程的权限到管理员权限,相关VC代码如下: #ifndef SAFE_CLOSE_HANDLE #define SAFE_CLOSE_HANDLE(handl…...
算法leetcode|92. 反转链表 II(rust重拳出击)
文章目录 92. 反转链表 II:样例 1:样例 2:提示:进阶: 分析:题解:rust:go:c:python:java: 92. 反转链表 II: 给你单链表的…...
Chapter 7 - 3. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理
Pause Threshold for Long Distance Links长途链路的暂停阈值 This section uses the following basic concepts: 本节使用以下基本概念: Bit Time (BT): It is the time taken to transmit one bit. It is the reciprocal of the bit rate. For example, BT of a 10 GbE po…...
优雅玩转实验室服务器(二)传输文件
使用服务器最重要的肯定是传输文件了,我们不仅需要本地的一些资源上传到服务器,好进行实验,也需要将服务器计算得到的实验结果传输到本地,来进行预览或者报告撰写。 首先,由于涉及到服务器操作,我强烈推荐…...
动态面板简介以及ERP原型图案列
动态面板简介以及ERP原型图案列 1.Axure动态面板简介2.使用Axure制作ERP登录界面3.使用Asure完成左侧菜单栏4.使用Axuer完成公告栏5.使用Axuer完成左边侧边栏 1.Axure动态面板简介 在Axure RP中,动态面板是一种强大的交互设计工具,它允许你创建可交互的…...
漏刻有时百度地图API实战开发(12)(切片工具的使用、添加自定义图层TileLayer)
TileLayer向地图中添加自定义图层 var tileLayer new BMap.TileLayer();tileLayer.getTilesUrl function (tileCoord, zoom) {var x tileCoord.x;var y tileCoord.y;return images/tiles/ zoom /tile- x _ y .png;}var lockMap new BMap.MapType(lock_map, tileLaye…...
python 爬虫 m3u8 视频文件 加密解密 整合mp4
文章目录 一、完整代码二、视频分析1. 认识m3u8文件2. 获取密钥,构建解密器3. 下载ts文件4. 合并ts文件为mp4 三、总结 一、完整代码 完整代码如下: import requests from multiprocessing import Pool import re import os from tqdm import tqdm fro…...
mybatis中xml文件容易搞混的属性
目录 第一章、1.1)MyBatis中resultMap标签1.2)MyBatis的resultType1.3)MyBatis的parameterType1.4)type属性1.5)jdbcType属性1.6)javaType属性1.7)ofType属性 友情提醒: 先看文章目录ÿ…...
android Retrofit2.0请求 延长超时操作
import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory;public class MyApiClient {private static final String BASE_URL "https://api.example.com/";// 创建 OkHttpClient,并设置超时时间…...
Axure之动态面板轮播图
目录 一.介绍 二.好处 三.动态面板轮播图 四.动态面板多方式登录 五.ERP登录 六.ERP的左侧菜单栏 七.ERP的公告栏 今天就到这了哦!!!希望能帮到你了哦!!! 一.介绍 Axure中的动态面板是一个非常有用的组…...
一文读懂算法中的时间复杂度和空间复杂度,O(1)、O(logn)、O(n)、O(n^2)、O(2^n) 附举例说明,常见的时间复杂度,空间复杂度
时间复杂度和空间复杂度是什么 时间复杂度(Time Complexity)是描述算法运行时间长短的一个度量。空间复杂度(Space Complexity)是描述算法在运行过程中所需要的存储空间大小的一个度量。 时间复杂度和空间复杂度是衡量算法性能…...
LWIP热插拔功能实现
0 工具准备 1.lwip 1.4.1 2.RTOS(本文使用rt-thread)1 使能连接变化回调功能 打开lwipopts.h,将宏定义LWIP_NETIF_LINK_CALLBACK的值设为1,如下: #define LWIP_NETIF_LINK_CALLBACK 1这个宏定义被使能后会将…...
android下的app性能测试应主要针对那些方面,如何开展?
如何开展安卓手机下的App性能测试,对于优秀的测试人员而言,除了要懂得性能测试的步骤流程外,还应该懂的性能测试的一些其他知识,比如性能测试指标、各指标的意义,常用的性能测试工具、如何查看结果分析等等知识。所以本…...
【深度学习】注意力机制(二)
本文介绍一些注意力机制的实现,包括EA/MHSA/SK/DA/EPSA。 【深度学习】注意力机制(一) 【深度学习】注意力机制(三) 目录 一、EA(External Attention) 二、Multi Head Self Attention 三、…...
学习黑马vue
项目分析 项目下载地址:vue-admin-template-master: 学习黑马vue 项目下载后没有环境可参考我的篇文章,算是比较详细:vue安装与配置-CSDN博客 安装这两个插件可格式化代码,vscode这个软件是免费的,官网:…...
gdb本地调试版本移植至ARM-Linux系统
移植ncurses库 本文使用的ncurses版本为ncurses-5.9.tar.gz 下载地址:https://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz 1. 将ncurses压缩包拷贝至Linux主机或使用wget命令下载并解压 tar-zxvf ncurses-5.9.tar.gz 2. 解压后进入到ncurses-5.9目录…...
《Linux C编程实战》笔记:实现自己的ls命令
关键函数的功能及说明 1.void display_attribute(struct stat buf,char *name) 函数功能:打印文件名为name的文件信息,如 含义分别为:文件的类型和访问权限,文件的链接数,文件的所有者,文件所有者所属的组…...
Python个人代码随笔(观看无益,请跳过)
异常抛错:一般来说,在程序中,遇到异常时,会从这一层逐层往外抛错,一直抛到最外层,由最外层把错误显示在用户终端。 try:raise ValueError("A value error...") except ValueError:print("V…...
Unity中实现ShaderToy卡通火(总结篇)
文章目录 前言一、把卡通火修改为后处理效果1、在Shader属性面板定义属性接收帧缓存纹理2、在片元着色器对其纹理采样后,与卡通火相加输出请添加图片描述 二、我们自定义卡通火1、修改 _CUTOFF 使卡通火显示在屏幕两侧2、使火附近屏幕偏红色 前言 在之前的文章中&a…...
等保2.0的变化
1法律地位得到确认 《中华人民共和国网络安全法》第21条规定“国家实行网络安全等级保护制度”,要求“网络运营者应当按照网络安全等级保护制度要求,履行安全保护义务”;第31条规定“对于国家关键信息基础设施,在网络安全等级保护…...
漏洞复现-网神SecGate3600防火墙敏感信息泄露漏洞(附漏洞检测脚本)
免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…...
ArkTS入门
代码结构分析 struct Index{ } 「自定义组件:可复用的UI单元」 xxx 「装饰器:用来装饰类结构、方法、变量」 Entry 标记当前组件是入口组件(该组件可被独立访问,通俗来讲:它自己就是一个页面)Component 用…...
JS中for循环之退出循环
我为大家介绍一下退出循环的两种方法 1.continue 退出本次循环,一般用于排除或者跳过某一个选项的时候,可以使用continue for(let i 0;i<5;i){if(i 3){continue}// 跳过了3console.log(i) //0 1 2 4}2.break 退出整个for循环,一般用于…...
《Global illumination with radiance regression functions》
总结一下最近看的这篇结合神经网络的全局光照论文。 论文的主要思想是利用了神经网络的非线性特性去拟合全局光照中的间接光照部分,采用了基础的2层MLP去训练,最终能实现一些点光源、glossy材质的光照渲染。为了更好的理解、其输入输出表示如下。 首先…...
华南理工C++试卷
诚信应考 , 考试作弊将带来严重后果! 《C程序设计试卷》 注意事项:1. 考前请将密封线内填写清楚; 2. 所有答案请答在试卷的答案栏上; 3.考试形式:闭卷 4. 本试卷共 五 大题,满分100分ÿ…...
0001.WIN7(64位)安装ADS1.2出现L6218错误
用了十多年的笔记本电脑系统出现问题,硬件升级重装以后安装ADS1.2。在编译代码的时候出现L6218错误。如下: 图片是从网上找的,我编译出错的界面没有保留下来。 首先,代码本身没有任何问题 ,代码在win7(32位)下编译没有…...
HBuilderX 配置 夜神模拟器 详细图文教程
在电脑端查看App的效果,不用真机调试,下载一个模拟器就可以了 --- Nox Player,夜神模拟器,是一款 Android 模拟器。他的使用非常安全,最重要的是完全免费。 一. 安装模拟器 官网地址: (yeshen.com) 二.配…...
登封做网站优化/一站式发稿平台
1、出现如下错误 解决办法: ①确保你有该文件夹的完全控制权。文件夹点右键->属性->安全->高级->所有者->改为自己->编辑自己的权限为完全控制。 ②将setup.exe的兼容性改为windows server 2003(server pack 1)。右键属性-〉兼容性-〉兼容模式…...
做网站怎么租个空间/2023年11月新冠高峰
先看看啥叫深拷贝?啥叫浅拷贝?假设B复制了A,修改A的时候,看B是否发生变化:如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)如果B没有改变,说明是深拷贝…...
商城类网站建设方案/网络优化工程师工作内容
鸿蒙版瑞幸咖啡开发日记之咖啡详情页1.整体布局思路2.具体开发流程2.1 中间滑动内容2.1.1 顶部轮播图的开发2.1.2 收藏口味2.1.3 详情页咖啡名称2.1.4 口味和温度选择2.1.5 商品详情介绍2.2 底部结算栏2.2.1 整体布局方式2.2.2 具体开发3.整体布局文件这里我们首先看一下最终的…...
做综合医院网站/免费的个人网站html代码
Document.get获取记录数据,或获取根据查询条件筛选后的记录数据函数签名如下:function get(options?: object): Promise参数说明options 为可选参数,是一个如下格式的对象,如传入 success、fail、complete 三者之一,则…...
怎样做网站流量统计/爱站网影院
1、私募基金概念 私募基金,是指以非公开方式向特定投资者募集资金并以特定目标为投资对象的证券投资基金。私募基金是以大众传播以外的手段招募,发起人集合非公众性多元主体的资金设立投资基金,进行证券投资。 私募(Private Plac…...
行政机关网站建设的意义/seo实战指导
光流的概念最早是由Gibson在1950年提出的。它是空间移动物体在像素观察平面中移动的瞬时速度。是一种计算物体在相邻帧间运动信息的方法。一般来说,光流(Optical Flow)是物体在三维空间中的运动在二维像平面上的投影。它是由物体和相机的相对速度产生的,…...