1.现象
跟着视频教程移植完u8g2库到stm32f103c8t6后,进行编译,报了100多个空间不足的问题,如下图。
..\Output\Output.axf: Error: L6406E: No space in execution regions with .ANY selector matching u8g2_fonts.o(.constdata).
..\Output\Output.axf: Error: L6406E: No space in execution regions with .ANY selector matching u8g2_font.o(i.u8g2_font_decode_glyph).
..\Output\Output.axf: Error: L6406E: No space in execution regions with .ANY selector matching u8x8_d_ssd1306_128x64_noname.o(.constdata).
..\Output\Output.axf: Error: L6406E: No space in execution regions with .ANY selector matching stm32f10x_gpio.o(i.GPIO_Init).
..\Output\Output.axf: Error: L6406E: No space in execution regions with .ANY selector matching u8x8_d_ssd1306_128x64_noname.o(i.u8x8_d_ssd1306_sh1106_generic).
..\Output\Output.axf: Error: L6406E: No space in execution regions with .ANY selector matching u8g2_ll_hvline.o(i.u8g2_ll_hvline_vertical_top_lsb).
……
2.原因
直接打开u8g2的csrc移植程序的文件夹,将所有文件按照大小进行排列。如下图:
可以看到两个字库文件都特别大。然后打开这两个.c文件可知,每一个字库都是const定义的全局常量,这些在编译时会占用大量的内存。而我们常用的字库不过是那一两个,或者某几个特定的字库,所以需要对这两个字库进行瘦身(删除那些不常用的,保留一两个常用的)。
但需要注意,当我们以后需要使用其他字库时,就要将其从移植的源文件中添加进来。
3.解决方法
直接打开u8g2_fonts.c文件,暂时只保留了u8g2_font_inb24_mf和u8g2_font_wqy12_t_chinese1两个字库。文件大小直接变成52KB。如下图:
在这里,再次进行编译,已经不会再报内存不足的错误了。另一个u8x8_fonts.c的修改方法也是大同小异的,由于没有内存不足的报错,我也没再去修改它了,可能以后再发生内存不足时我就要对它下手了。