中级会员
 
- 积分
- 224
- 金钱
- 224
- 注册时间
- 2019-4-17
- 在线时间
- 34 小时
|
最近在做实验的时候,链接时会报错:
..\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;
}
}
不过我还是建议别第二种骚操作,容易骚断腿。
|
|