请教一个UCGUI动态显示图像的问题

2019-08-13 22:45发布

最近在用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).
请问除了更改硬件配置或者设计,还有没有其他方法实现类似功能?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
lanlzp
1楼-- · 2019-08-14 00:29
出问题原因:
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

总之解决方式原则就是,在保证效果的情况下尽量减少图片转换后的代码量,否则就增加存储空间.
a3748622
2楼-- · 2019-08-14 03:00
加个FLASH不就好了
某某网友
3楼-- · 2019-08-14 09:00
 精彩回答 2  元偷偷看……
lanlzp
4楼-- · 2019-08-14 13:20
某某网友 发表于 2017-9-27 19:00
感谢回答,我的板子自带8M的SPI FLASH,请问这种情况下如何设置工程的编译配置?

那你应该查询emwin如何读取外部flash图片并显示
lanlzp
5楼-- · 2019-08-14 14:28
lanlzp 发表于 2017-9-27 22:32
那你应该查询emwin如何读取外部flash图片并显示

ucgui是一样的,同时这不是改改工程配置可以做到的。
正点原子
6楼-- · 2019-08-14 19:23
帮顶

一周热门 更多>