OpenEdv-开源电子网

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

一个关于STM32F103(包括OLED,SD卡、键盘)的问题,求解答。

[复制链接]

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-5-2
在线时间
43 小时
发表于 2020-3-14 16:17:17 | 显示全部楼层 |阅读模式
30金钱
本帖最后由 WGW123 于 2020-3-17 18:37 编辑

            (C8T6移植过程中的内存溢出问题)  

     由于疫情原因,学校不开学,本人在淘宝上买了一块STM32F103C8T6的核心板来练习(想要自己做一个电子书阅读器从SD卡[spi通讯]里阅读数据,用OLED[i2c通讯]显示,并可以用键盘操作翻页等),在3月1日左右向板子里烧录了自己改编的OLED与键盘的相关程序,均可以运行。ps:OLED所移植的程序为中景园的i2c源码,键盘所移植程序为 正点原子 战舰板源码.

在昨天(3月13日)进行SD卡程序(正点原子ministm32 SD卡 spi源码)的调试,发现了一些问题:

1.由于SD卡源代码里夹杂了一些LCD的子程序,所以LCD的字库和OLED的字库发生重复,编译不通过 报错为:..\OBJ\OLED.axf: Error: L6200E: Symbol asc2_1206 multiply defined (by lcd.o

2.在翻贴后进行几次程序的修改,最后将字库定义从H文件移动到了C文件中,并把LCD库函数全部删除(手里只有OLED模块,所以根本用不到LCD),解决了上述的字库重复问题。但是,再次编译中发现了新的问题,芯片容量不够,编译报错为:..\OBJ\OLED.axf: Error: L6406E: No space in execution regions with .ANY selector matching malloc.o(.bss).

3.为了解决芯片容量不够的问题,在MDK中重新设置了Device中的芯片型号 修改为:stm32f103ZG,再次编译,编译通过。但是在烧录后,程序无法运行。

4.由于MDK所选择的芯片型号与手中实际操作的芯片型号不同,所以无法运行也在意料之中。最后我又将MDK Device中芯片型号改为C8T6并在C、C++选项中将优化等级从0级调至3级,再次
编译,出现了2.中同样的编译错误:..\OBJ\OLED.axf: Error: L6406E: No space in execution regions with .ANY selector matching malloc.o(.bss).

求万能的论坛大神们指导,有什么可行的途径可以使我此次移植程序成功(完成电子书阅读器的制作)。




实物照片

实物照片

最佳答案

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

那说明你占用了太多的flash了, 去掉一些大数组试试看。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-14 16:17:18 | 显示全部楼层
WGW123 发表于 2020-3-15 15:30
昨天(3月14日)和今天(3月15日)的尝试:
1.将程序优化等级设置为O2或者O3(分别尝试了一遍) 以及 在 ...

那说明你占用了太多的flash了, 去掉一些大数组试试看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14410
金钱
14410
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-3-14 18:17:47 | 显示全部楼层
编译提示重复定义了asc2_1206这个数组 你是不是在LCD和OLED 都定义了这个数组呢 删掉其中一个
回复

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-5-2
在线时间
43 小时
 楼主| 发表于 2020-3-14 18:58:03 | 显示全部楼层
本帖最后由 WGW123 于 2020-3-15 15:36 编辑
翼行园子 发表于 2020-3-14 18:17
编译提示重复定义了asc2_1206这个数组 你是不是在LCD和OLED 都定义了这个数组呢 删掉其中一个

删掉了,现在是空间不够用的问题(对不起,刚才发现第四条写错了,第四条所描述的编译报错应该是:..\OBJ\OLED.axf: Error: L6406E: No space in execution regions with .ANY selector matching malloc.o(.bss).),而不是之前写的重复定义报错。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-15 00:37:55 | 显示全部楼层
WGW123 发表于 2020-3-14 18:58
删掉了,现在是空间不够用的问题

空间不够就得压缩,或者用-o2优化试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-5-2
在线时间
43 小时
 楼主| 发表于 2020-3-15 15:30:10 | 显示全部楼层
本帖最后由 WGW123 于 2020-3-15 15:50 编辑
正点原子 发表于 2020-3-15 00:37
空间不够就得压缩,或者用-o2优化试试

昨天(3月14日)和今天(3月15日)的尝试:
1.将程序优化等级设置为O2或者O3(分别尝试了一遍) 以及 在Target选择MiroLIbUse cross module
几次尝试之后问题依然没有解决。

2.将可读/写空间扩大后(size扩大为0x15000),程序可以编译通过,把hex文件烧录到单片机后程序无法正常运行。

报错截图

报错截图

MDK选项的设置

MDK选项的设置
捕获.PNG
回复

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-5-2
在线时间
43 小时
 楼主| 发表于 2020-3-16 15:36:10 | 显示全部楼层
本帖最后由 WGW123 于 2020-3-16 15:39 编辑
正点原子 发表于 2020-3-16 00:16
那说明你占用了太多的flash了, 去掉一些大数组试试看。

今天(3月16日)问题得到解决,感谢原子哥和一位好哥们的热心指导.
本次解决RAM溢出问题的操作步骤如下:

1.查看MDK的编译信息 找到 Program Size: Code=2672 RO-data=336 RW-data=68 ZI-data=48076 .从中可知ZI-data=48076超标(C8T6的RAM只有8K ,而我却使用了将近48K)。

2.从文件夹中找到.map ,找到图1中的 RAM占用情况。从中可知malloc占用了大量的内存。

3.打开malloc文件,打开各个全局变量和静态变量查看是否大小过大,查看过程中发现了内存池的定义过大为42K(#define MEM_MAX_SIZE   42*1024        //最大管理内存 42K)。

4.将42K修改为4K,下载程序进行试验,发现程序可以正常运行。

ps:溢出的问题现在解决了,真的很谢谢大家的指导。

a2928467aafd186718073a7d88bec54.png
回复

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-5-2
在线时间
43 小时
 楼主| 发表于 2020-3-17 18:33:50 | 显示全部楼层
(今天)3月17日,遇到新遇到的问题和解决方法如下:

1. 移植FATFS系统后再次出现内存溢出的问题,  为了在C8T6上使用FATFS文件系统,对FATFS源码进行了阉割(参考 http://www.openedv.com/forum.php?mod=viewthread&tid=277451

2. 阉割后编译报错..\OBJ\FATFS.axf: Error: L6218E: Undefined symbol ff_convert (referred from ff.o)等共两条错误.   为了可以正常编译通过,删除了ff.h文件中的ff_convert()函数定义,ff.c文件中并将所有ff_convert()函数替换为t(); t()为自己编写的函数,没有任何含义,只是为了编译通过。

进行了以上两步操作以后,现在编译可以通过了,烧录一个LED小程序进行试验 程序可以正常运行。

回复

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-5-2
在线时间
43 小时
 楼主| 发表于 2020-3-17 21:03:24 | 显示全部楼层
今天(3月17日 晚 )遇到的问题及解决方法

1.更换OLED的I2C的SCK和SDA引脚的时候遇到了OLED黑屏的问题,查来查去耗费了足足三十分钟。 (原来是忘记了引脚时钟的初始化....)



如此愚蠢的问题本不值得记录,但是为了时刻提醒自己,还是记录下来比较好。
回复

使用道具 举报

8

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-5-2
在线时间
43 小时
 楼主| 发表于 2020-3-17 21:06:45 | 显示全部楼层
本帖最后由 WGW123 于 2020-3-18 12:35 编辑

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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