OpenEdv-开源电子网

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

定义变量过多,ram不够解决方案

[复制链接]

8

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2019-4-17
在线时间
34 小时
发表于 2020-5-15 11:33:19 | 显示全部楼层 |阅读模式
最近在做实验的时候,链接时会报错:
..\OBJ\MP3.axf: Error: L6406E: No space in execution regions with .ANY selector matching libspace.o(.bss).
仔细检查了代码,发现是OLED.c中定义了一个缓存大数组u8 OLED_GRAM[128][8];
我们都知道程序运行时变量都是在ram中申请的(当然有些除外),于是我将其改小:u8 OLED_GRAM[2][2];这次链接能通过了。
我计算了一下,128*8,也才1kB,而stm32F103RCT6有48kB的ram,怎么会不够呢?

经过仔细阅读代码,我发现问题出在这里:
malloc内存管理占用太多内存了,
在malloc.h里:MEM_MAX_SIZE        42*1024,本来就只有48kB内存,这玩意个一下吃掉42kB,怪不得不够。
解决方法有两个:
1、把这个MEM_MAX_SIZE 改小,例如38*1024;
2、将OLED_GRAM[128][8]用malloc申请。

u8** OLED_GRAM;       
void initmalloc(void)
{
    int  n = 128, m = 8, x = 0;
    OLED_GRAM = (u8 **)malloc(sizeof(u8 *) * n);  //分配维数
    for(int i = 0; i < n; i++)
        OLED_GRAM[i] = (u8 *)malloc(sizeof(u8) * m);     //分配各个元素
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++, x++)
        {
        OLED_GRAM[i][j] = x;
        }
}

不过我还是建议别第二种骚操作,容易骚断腿。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-15 11:33:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2020-7-11
在线时间
20 小时
发表于 2020-7-21 16:11:38 | 显示全部楼层
帮顶一下,我的是100*1024不知道咋回事
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2020-7-11
在线时间
20 小时
发表于 2020-7-21 16:23:50 | 显示全部楼层
可可可能吧 发表于 2020-7-21 16:11
帮顶一下,我的是100*1024不知道咋回事

照相机实验里的,难道是因为要存图片?
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-2-2
在线时间
14 小时
发表于 2020-7-21 16:33:03 | 显示全部楼层
楼主好心得
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 11:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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