最近在用stm32f103vct6加UCGUI做一个涉及导航的项目,原理是通过蓝牙串口接收的数据显示导航状态图标(左转右转直行箭头什么的),所以编程的思路想用UCGUI的位图显示功能,把图标图像转换成C文件,然后通过对比数据加载不同图标,但是由于图标太多,编译总是通不过,提示溢出。代码简单呈现如下:
extern const GUI_BITMAP bmturn_back;
extern const GUI_BITMAP bmturn_branch_center;
extern const GUI_BITMAP bmturn_branch_left;
extern const GUI_BITMAP bmturn_branch_right;
//…………定义图像,很多,省略
extern const GUI_BITMAP bmturn_tollgate;
const int ShowIcon(char *str,int x,int y) {
GUI_BITMAP tt1;
int re = 0;
if (strcmp(str,"turn_back")) { tt1=bmturn_back; re = 1;};//对比串口传输数据,加载图像显示
if (strcmp(str,"turn_branch_center")) { tt1=bmturn_branch_center; re = 1; };
if (strcmp(str,"turn_branch_left")) { tt1=bmturn_branch_left; re = 1; };
if (strcmp(str,"turn_branch_right")) { tt1=bmturn_branch_right; re = 1; };
if (strcmp(str,"turn_branch_right_straight")){ tt1=bmturn_branch_right_straight; re = 1; };
if (strcmp(str,"turn_dest")) { tt1=bmturn_dest; re = 1; };
if (strcmp(str,"turn_front")) { tt1=bmturn_front; re = 1; };
if (strcmp(str,"turn_left_2branch_left")) { tt1=bmturn_left_2branch_left; re = 1; };
if (strcmp(str,"turn_left_2branch_right")) { tt1=bmturn_left_2branch_right; re = 1; };
if (strcmp(str,"turn_left_3branch_left")) { tt1=bmturn_left_3branch_left; re = 1; };
if (strcmp(str,"turn_left_3branch_middle")) { tt1=bmturn_left_3branch_middle; re = 1; };
if (strcmp(str,"turn_left_3branch_right")) { tt1=bmturn_left_3branch_right; re = 1; };
if (strcmp(str,"turn_left_back")) { tt1=bmturn_left_back; re = 1; };
if (strcmp(str,"turn_left_side")) {tt1=bmturn_left_side; re = 1};
if (strcmp(str,"turn_left_side_ic")) { tt1=bmturn_left_side_ic; re = 1;}
if (strcmp(str,"turn_left_side_main")) { tt1=bmturn_left_side_main; re = 1};
if (strcmp(str,"turn_right")) { tt1=bmturn_right; re = 1};
if (strcmp(str,"turn_right_2branch_left")) { tt1=bmturn_right_2branch_left; re = 1;}
if (strcmp(str,"turn_right_2branch_right")) { tt1=bmturn_right_2branch_right; re = 1;}
if (strcmp(str,"turn_right_3branch_left")) { tt1=bmturn_right_3branch_left; re = 1;}
if (strcmp(str,"turn_right_3branch_middle")) { tt1=bmturn_right_3branch_middle; re = 1;}
if (strcmp(str,"turn_right_3branch_right")) { tt1=bmturn_right_3branch_right; re = 1;}
if (strcmp(str,"turn_right_back")) { tt1=bmturn_right_back; re = 1;}
if (strcmp(str,"turn_right_front")) { tt1=bmturn_right_front; re = 1;}
if (strcmp(str,"turn_right_side")) { tt1=bmturn_right_side;}
if (strcmp(str,"turn_right_side_ic")) { tt1=bmturn_right_side_ic; re = 1;}
if (strcmp(str,"turn_right_side_main")) { tt1=bmturn_right_side_main; re = 1;}
if (strcmp(str,"turn_tollgate")) { tt1=bmturn_tollgate; re = 1;}
if (re==1) GUI_DrawBitmap(&tt1,x,y);
return re;
}
超过13个就会编译溢出,大量报错如下:
.OutputTiky_uCGUI_DEMO.axf: Error: L6406E: No space in execution regions with .ANY selector matching lcdinfo0.o(i.LCD_GetYSize).
请问除了更改硬件配置或者设计,还有没有其他方法实现类似功能?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
stm32f103vct6 FLASH区域总共256kb 你状态图标转换之后存储占用代码空间太多导致编译不通过,Error: L6406E: No space in execution regions with .ANY selector matching lcdinfo0.o(i.LCD_GetYSize).提示你没有可执行区域.
解决方案1:减少图片转换后的代码(会降低图片显示效果)
解决方案2:在不改动pcb板的情况下,可使用相同封装(pin to pin)大容量芯片替换,例如:stm32f103vet6(512kb flash)
解决方案3:如果允许改动pcb,则可增加外部flash芯片,将转换后的图片存储到外部flash
总之解决方式原则就是,在保证效果的情况下尽量减少图片转换后的代码量,否则就增加存储空间.
那你应该查询emwin如何读取外部flash图片并显示
ucgui是一样的,同时这不是改改工程配置可以做到的。
一周热门 更多>