1.前言

使用ESP8266+Arduino进行单片机开发,在连接OLED进行显示时,我们通常会使用Adafruit_GFX插件配合Adafruit_SSD*插件进行实现。其中*代表OLED的驱动号。但是这样只能展示出英文,无法进行中文展示。
这时,我们可以使用U8g2_for_Adafruit_GFX插件,利用其自带的汉字字库进行汉字展示。

2.问题

但是在使用过程中,出现了以下问题。U8g2_for_Adafruit_GFX插件携带了两种汉字字库,一种是u8g2_font_wqy12_t_chinese1相关字库,在使用这个字库时,程序能够正常运行,但是其携带的汉字量少,很多常用汉字无法展示。另一种是u8g2_font_wqy12_t_gb2312相关字库。这个字库包含的汉字很全面,但使用这个字库时,程序会报错:

section \`.bss' is not within region \`dram0_0_seg'

经过查询资料,发现问题是貌似编译出来的数据量过大导致内存不足引起的。确实,当我去查询U8g2_for_Adafruit_GFX插件的源文件时,发现u8g2_font_wqy12_t_chinese1字库数组大小仅为14000左右,而u8g2_font_wqy12_t_gb2312字库数组大小达到了210000左右。

3.解决

做为C++小白,虽然知道了问题的原因,还是无法解决。于是查阅各种资料后,终于在U8g2_for_Adafruit_GFX的github官方主页的issues中找到了答案。
github issues 地址
这里本人也整理一下留做备份。在以下文件中插入如下代码即可解决报错问题。

//U8g2_for_Adafruit_GFX.cpp
#include "u8g2_fonts.h"
#if defined(ESP8266)
uint8_t u8x8_pgm_read_esp(const uint8_t * addr)
{
    uint32_t bytes;
    bytes = *(uint32_t*)((uint32_t)addr & ~3);
    return ((uint8_t*)&bytes)[(uint32_t)addr & 3];
}
#endif

//u8g2_fonts.h
#if defined(ESP8266)
uint8_t u8x8_pgm_read_esp(const uint8_t * addr);   /* u8x8_8x8.c */
#  define U8X8_FONT_SECTION(name) __attribute__((section(".text." name)))
#  define u8x8_pgm_read(adr) u8x8_pgm_read_esp(adr)
#  define U8X8_PROGMEM
#endif

wei4118268
88 声望1 粉丝

前端从业者


引用和评论

0 条评论