OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3383|回复: 6

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

[复制链接]

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-9-27
在线时间
18 小时
发表于 2017-9-27 11:53:42 | 显示全部楼层 |阅读模式
5金钱
最近在用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个就会编译溢出,大量报错如下:
.\Output\Tiky_uCGUI_DEMO.axf: Error: L6406E: No space in execution regions with .ANY selector matching lcdinfo0.o(i.LCD_GetYSize).
请问除了更改硬件配置或者设计,还有没有其他方法实现类似功能?

最佳答案

查看完整内容[请看2#楼]

出问题原因: 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:如果允许改 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-9-27 11:53:43 | 显示全部楼层
出问题原因:
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

总之解决方式原则就是,在保证效果的情况下尽量减少图片转换后的代码量,否则就增加存储空间.
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2017-9-27 17:40:43 | 显示全部楼层
加个FLASH不就好了
回复

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2017-9-27
在线时间
18 小时
 楼主| 发表于 2017-9-27 19:00:10 | 显示全部楼层
lanlzp 发表于 2017-9-27 13:44
出问题原因:
stm32f103vct6 FLASH区域总共256kb 你状态图标转换之后存储占用代码空间太多导致编译不通过,E ...

感谢回答,我的板子自带8M的SPI FLASH,请问这种情况下如何设置工程的编译配置?
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-9-27 22:32:51 | 显示全部楼层
某某网友 发表于 2017-9-27 19:00
感谢回答,我的板子自带8M的SPI FLASH,请问这种情况下如何设置工程的编译配置?

那你应该查询emwin如何读取外部flash图片并显示
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-9-27 22:33:58 | 显示全部楼层
lanlzp 发表于 2017-9-27 22:32
那你应该查询emwin如何读取外部flash图片并显示

ucgui是一样的,同时这不是改改工程配置可以做到的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-28 00:48:26 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 20:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表