我需要在我的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。有没有办法扩大专用于堆的部分?
答案 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分配的内存。