ESP32+LVGL笔记(6)-把712k的一二级汉字字库放在SPIRAM

文章目录

  • 1.字库制作
  • 2.字库烧录到ESP32-S3的flash
    • 2.1 配置好分区文件
    • 2.2 汉字库文件烧录到ESP32的flash
  • 3.将字库从 flash 拷贝到 SPIRAM
    • 3.1 工程配置中有关 SPIRAM 部分
    • 3.2 将汉字库从flash拷贝到SPIRAM的代码
    • 3.3 在进入lvgl之前调用函数 copyHZK_from_flash_to_SPIRAM

在前面的文章《lvgl 笔记(3)-中文字库的制作和使用(windows模拟和esp32)》提到,esp32使用大字库会引起刷新速度变慢(文件浏览界面上下滑动时)的问题。今天尝试把712k大小的字库先读取到SPIRAM,使用时,直接读取SPIRAM,果然速度大为提升,效果还可以接受。
我用的模块是ESP32-S3-WROOM-1(N8R8),内部有8M byte SPIRAM。
本文对应的工程源码:《LVGL_HX8369_HZK》。

1.字库制作

参考《lvgl 笔记(3)-中文字库的制作和使用(windows模拟和esp32)》。

2.字库烧录到ESP32-S3的flash

2.1 配置好分区文件

我测试的开发板模块是esp32-S3-WROOM-1(N8R8),模块内部集成了8MB的spi flash。
首先要知道自己开发板的flash大概空间,字库放置的地址和用户程序不要冲突。以我的工程为例,flash空间的规划《partitions_singleapp_large.csv》是:

# Name,   Type, SubType, Offset,  Size, Flags
# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
nvs,      data, nvs,     ,        0x6000,
phy_init, data, phy,     ,        0x1000,
factory,  app,  factory, ,        2000K,
storage,0x01,0x40,0x300000,800k

这里给用户程序安排了2M的空间,我的程序实际不超过 600k bytes;所以我就把字库放在3M开始的地方,也就是偏移量为0x30 0000.
具体操作很简单,把汉字库文件《 myFont_16_2.bin 》往0x300000地址烧录就行了。字库的大小是712k bytes,这里分配800k。
工程配置选择《partitions_singleapp_large.csv》文件:
在这里插入图片描述

2.2 汉字库文件烧录到ESP32的flash

在这里插入图片描述

3.将字库从 flash 拷贝到 SPIRAM

3.1 工程配置中有关 SPIRAM 部分

在我的工程中,我也是拿别人的工程,基本没有改动SPIRAM的配置:
在这里插入图片描述

3.2 将汉字库从flash拷贝到SPIRAM的代码

一开始,我想用一个全局数组:

EXT_RAM_ATTR	unsigned char __g_hzk_buf[712*1024];

编译失败,提升下面的 error:

esp32 section `.dram0.bss' will not fit in region `dram0_0_seg'

于是改用动态分配就可以正常运行。先定义一个全局指针,再给这个指针动态分配空间:

uint8_t * __g_p_hz_data;
__g_p_hz_data=(uint8_t *) heap_caps_malloc(712*1024,  MALLOC_CAP_SPIRAM);

下面是《myFont_16_2.c》的关键代码:

//  配置是否copy to SPIRAM    
#define     CONFIG_HZK_IN_SPIRAM        1//     1. 将字库从  flash copy to SPIRAM 
#if     CONFIG_HZK_IN_SPIRAM
#define     HZK_LEN     (712*1024)uint8_t * __g_p_hz_data;
//  上电时,在进入lvgl初始化之前,调用本函数
//  函数名: copyHZK_from_flash_to_SPIRAM()
//	功  能:把字库全部读取到外部SPI RAM
void    copyHZK_from_flash_to_SPIRAM(void)
{__g_p_hz_data=(uint8_t *) heap_caps_malloc(HZK_LEN,  MALLOC_CAP_SPIRAM);spi_flash_read(0x300000,__g_p_hz_data,HZK_LEN);
}
static uint8_t *__user_font_getdata(int offset, int size){return __g_p_hz_data + offset;
}#else       
//  2.直接在flash 读取
static uint8_t __g_font_buf[256];//如bin文件存在SPI FLASH可使用此buff
static uint8_t *__user_font_getdata(int offset, int size){//如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);    spi_flash_read(0x300000+offset,__g_font_buf,size);return __g_font_buf;
}
#endif

测试时,可以通过配置 宏 CONFIG_HZK_IN_SPIRAM 为0(没有把字库放在SPIRAM)或为1(把字库放在SPIRAM),对比两者的速度。

3.3 在进入lvgl之前调用函数 copyHZK_from_flash_to_SPIRAM

源码参考《lvgl_gui.c》。

void    copyHZK_from_flash_to_SPIRAM(void);
void guiTask(void *pvParameter)
{//  先copy 汉字库到 spiramcopyHZK_from_flash_to_SPIRAM();xGuiSemaphore = xSemaphoreCreateMutex();static lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s)......
}

函数 guiTask是lvgl的主函数,在对lvgl初始化之前调用 copyHZK_from_flash_to_SPIRAM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python入门知识点分享——(八)文件的open方法

学完了Python当中的数据类型,下一步我们来了解如何用Python语言打开文件并添加内容。 目录 file mode buffering encoding errors newline closefd opener 函数 打开文件需要用到open函数,完整的语法格式如下所示,为了演示方便&…

rtklib代码支持北斗三代电文(CNAV)解算的不完全修改

概述 因为工作原因需要使用rtklib处理北斗三代(B1C/B2a)的数据,不多说废话,直接上代码 代码修改 因为rtklib抽象后的eph_t结构已经支持北斗三代,通过eph_t结构体的code字段判断星历来源,在计算卫星位置的时候,在eph…

缓存-Redis

Springboot使用Redis 引入pom依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>在application.yml、application-dev.yml中配置Redis的访…

【Linux系统基础】(1)Linux基础命令全面详解

在计算机世界中&#xff0c;Linux操作系统以其稳定性、安全性和开源性而受到广大程序员和系统管理员的喜爱。然而&#xff0c;对于初学者来说&#xff0c;Linux的命令行界面可能会显得有些复杂和难以理解。本文将详细介绍一些常用的Linux基础命令&#xff0c;帮助你更好地理解和…

TLC2543(12位A/D转换器)实现将输入的模拟电压显示到数码管上

代码&#xff1a; #include <reg51.h> #define uchar unsigned char #define uint unsigned int// 数码管0-9 unsigned char seg[] {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; sbit SDO P1^0; sbit SDI P1^1; sbit CS P1^2; sbit CLK P1^3; s…

【C语言】打印内存数据

C语言&#xff0c;用函数封装&#xff1a;16进制打印unsigned char *p指向的内存&#xff0c;长度为int l。16个字节&#xff0c;换一次行。16个字节用一个字符串缓存&#xff0c;一次打印。 以下是一个使用函数封装的C语言代码&#xff0c;用于以16进制格式打印unsigned char …

MyBatis——MyBatis的延迟加载

MyBatis的延迟加载&#xff08;一对多查询案例&#xff09; 1.什么是延迟加载&#xff1f; 开启延迟加载后&#xff0c;在真正使用数据的时候才发起级联查询&#xff0c;不用的时候不查询。 2.pojo User类&#xff1a; package com.wt.pojo;import java.io.Serializable; …

Ubuntu和Red Hat Enterprise Linux差异

由于Ubuntu&#xff08;基于Debian&#xff09;和Red Hat Enterprise Linux&#xff08;RHEL&#xff0c;包括其衍生版本如CentOS和Fedora&#xff09;是基于不同的Linux发行版&#xff0c;它们在命令行工具和管理上确实存在一些差异。但是&#xff0c;要列出所有差异是非常庞大…

计算机毕业设计------JSP教务处学生成绩管理系统

项目介绍 本项目包含管理员、教师、学生三种角色&#xff1b; 用户角色包含以下功能&#xff1a; 修改密码,查看自己的信息,查看自己的成绩,登录界面等功能。 管理员角色包含以下功能&#xff1a; 修改示例,增删改查学生信息,增删改查教师信息,增删改查课程信息,管理员修改…

电机控制 相关基础概念

基本概念: 定子或者转子上有铁心或者绕铜线的地方,绕铜线的地方叫槽,而将槽分开的叫齿,将所有的齿连起来的部位较轭部。 磁感应强度与磁场强度之间的关系可以通过以下公式表示: B=μH 其中,B 是磁感应强度,H 是磁场强度,μ 是磁导率。这个关系表明,在给定磁场强度下…

临床医学VR仿真情景实训教学应用

一、VR医学仿真情景教学应用 临床医学VR仿真情景实训教学是一种将VR虚拟技术应用于医学教育的新型教学方法。通过模拟真实的医疗环境&#xff0c;学生可以在虚拟场景中进行实践操作&#xff0c;从而更好地理解和掌握医学知识。与传统医学教育方式相比&#xff0c;VR技术为医学…

Golang 通用代码生成器仙童发布 2.4.0 电音仙女尝鲜版一及其介绍两个模式的视频

Golang 通用代码生成器仙童发布 2.4.0 电音仙女尝鲜版一及其介绍两个模式的视频 Golang 通用代码生成器仙童已发布 2.4.0 电音仙女尝鲜版一及其介绍视频。视频请见&#xff1a; 正常模式&#xff1a; https://www.bilibili.com/video/BV1fw411V77i/ 哑数据模式&#xff1a;…

Javascript预解析

为什么会讲到这个预解析呢&#xff0c;个人认为工作了很多年的前端可能都不一定搞清楚这个机制&#xff0c;所以还是将这个记录下来作为自己的学习笔记&#xff0c;同时也分享给广大的其他爱学习的前端开发者们。 我们先来看一段代码 sum(2, 10); function sum(a, b){return …

@z-utils组 重构和自动化实现

highlight: monokai theme: github 包简介 z-utils组 是一个可以在vue/react/pure js 中使用的工具包&#xff0c;它包含三个子类&#xff0c;分别为 z-utils/base, z-utils/react, z-utils/vue 三个分别在不同区域使用。 他是原 zzy-javascript-devtools 的重构版本&#xf…

嵌入式系统复习--Thumb指令集

文章目录 上一篇Thumb指令集概述Thumb指令详细介绍数据处理指令数据存储指令转移指令异常中断指令 下一篇 上一篇 嵌入式系统复习–ARM指令集(二) Thumb指令集概述 在编写Thumb指令时&#xff0c;先要用伪指令CODE16声明&#xff08;ADS的编译环境下&#xff09;&#xff0c…

程序设计的思想

程序设计思想是指在程序设计过程中所采用的一种思维方式&#xff0c;它是程序设计的灵魂和基础。程序设计思想的正确与否直接关系到程序的质量和可维护性。在实际的程序设计中&#xff0c;我们需要遵循一定的程序设计思想&#xff0c;以确保程序的正确性、可读性和可维护性。 …

序列化和反序列化对比分析,序列化和反序列化输出十个学生信息截图

序列化和反序列化是数据处理中的两个相对的概念&#xff0c;通常用于对象的存储和传输。下面是对这两个过程的对比分析&#xff1a; 序列化&#xff08;Serialization&#xff09; 定义 目的&#xff1a; 将对象的状态信息转换成可以存储或传输的形式&#xff08;如XML, JSO…

【表的内连和外连】

目录&#xff1a; 前言表的内外连接内连接显示Amanda Jackson的名字和部门名称 外连接左外连接查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 右外连接对stu表和exam表联合查询&#xff0c;把所有的成绩都显示出来&#xff0c;…

windows vs cmake项目+vcpkg

官方文档地址: vs中使用vcpkgcmake 官方文档地址&#xff1a;配置 CMake 调试会话 调整到CMake 目标视图&#xff0c;在对应的exe下右键选择“添加调试配置”切换回文件夹视图&#xff0c;在.vs下找到launch.vs.json文件&#xff0c;然后可以写调试使用的命令行参数 args&…

循环渲染ForEach

目录 1、接口说明 2、键值生成规则 3、组件创建规则 3.1、首次渲染 3.2、非首次渲染 4、使用场景 4.1、数据源不变 4.2、数据源组项发生变化 4.3、数据源数组项子属性变化 5、反例 5.1、渲染结果非预期 5.2、渲染性能降低 Android开发中我们有ListView组件、GridVi…