扩大'zoul'的堆大小

时间:2018-12-21 13:31:46

标签: c contiki

我需要在我的Zoul项目中使用一个库,该库广泛使用malloc机制分配动态内存。

问题是当该库调用malloc时,由于堆中没有足够的内存,它会返回NULL。

我尝试了这个简单的功能,以查看程序开始时有多少内存:

n_hold = 2
s = x.where(x.ne(x.shift()) & (x == 1)).ffill(limit=n_hold).fillna(0, downcast='int')
#print (s)

df = pd.concat([x,orig(x1), s], axis=1, keys=('input', 'orig', 'new'))
print (df.head(20))
    input  orig  new
0       0     0    0
1       0     0    0
2       0     0    0
3       0     0    0
4       0     0    0
5       0     0    0
6       1     1    1
7       0     1    1
8       0     1    1
9       0     0    0
10      0     0    0
11      0     0    0
12      0     0    0
13      0     0    0
14      0     0    0
15      0     0    0
16      0     0    0
17      0     0    0
18      0     0    0
19      0     0    0

#check outputs
#print (s.values == orig(x).values)

哪一个给我的堆只有92个字节。

在设备的输出中,我可以看到它具有32 KiB的SRAM。有没有办法扩大专用于堆的部分?

1 个答案:

答案 0 :(得分:1)

没有这样的方法。如果查看Zoul的CPU(CC2538)的linker script,您会看到以下相关定义:

.bss :
{
    _bss = .;
    *(.bss*)
    *(COMMON)
    _ebss = .;
} > FRSRAM

...

_heap = .;
_eheap = ORIGIN(FRSRAM) + LENGTH(FRSRAM);

因此,堆位于.bss段之后,并且可能一直进行到内存结束。最好的办法是使用一些Contiki memory usage reduction techniques来减小.data.bss段的大小,并以此方式为堆增加空间。

更重要的是,Contiki操作系统未使用malloc(),因此不建议用户使用。建议您在不分配动态内存的情况下重写代码,或者最好使用MPU查找其他硬件。

有一个很好的理由避免使用malloc和朋友。堆和堆栈区域共享相同的内存空间,而一个向下增长,另一个向上增长(它们“在中间相遇”)。当它们开始重叠时,坏事开始发生。 malloc分配尽可能多的内存是麻烦的根源-以后堆栈可能会增长并损坏您的malloc分配的内存。