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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。