Other Parts Discussed in Thread: SYSBIOS
void printHeapInfo(IHeap_Handle heap)
{
Memory_Stats stats;
Memory_getStats(heap, &stats);
System_printf("Heap total : %u bytes\n", stats.totalSize);
System_printf("Free total : %u bytes\n", stats.totalFreeSize);
System_printf("Largest blk: %u bytes\n", stats.largestFreeSize);
/* 简单碎片判断 */
if (stats.largestFreeSize < 1024) {
System_printf("WARNING: largest free block < 1 KB!\n");
}
}
// 查询 ukf 堆状态
System_printf("Before ukf update.\n");
printHeapInfo((IHeap_Handle)ukfHeapBuf);
ukf.update(WatcheState);
// 部分内存分配语句如下,保证了每次分配都有释放
float *Pkzz = (float *)Memory_alloc((IHeap_Handle)ukfHeapBuf, 16, 8, NULL);
// 查询 ukf 堆状态
System_printf("After ukf update.\n");
printHeapInfo((IHeap_Handle)ukfHeapBuf);问题:为什么连续调用3次以上的函数,会导致内存分配失败?
连续调用3次的输出结果为:
// 第1次 Before ukf update. Heap total : 384 bytes Free total : 384 bytes Largest blk: 64 bytes WARNING: largest free block < 1 KB! After ukf update. Heap total : 384 bytes Free total : 384 bytes Largest blk: 64 bytes WARNING: largest free block < 1 KB! // 第2次 Before ukf update. Heap total : 384 bytes Free total : 384 bytes Largest blk: 64 bytes WARNING: largest free block < 1 KB! After ukf update. Heap total : 384 bytes Free total : 384 bytes Largest blk: 64 bytes WARNING: largest free block < 1 KB! // 第3次 Before ukf update. Heap total : 384 bytes Free total : 384 bytes Largest blk: 64 bytes WARNING: largest free block < 1 KB! xdc.runtime.Memory: line 52: out of memory: heap=0xc070120, size=16 xdc.runtime.Error.raise: terminating execution
堆的属性如下:
var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
var heapBufParams = new HeapBuf.Params();
heapBufParams.blockSize = 64;
heapBufParams.numBlocks = 6;
heapBufParams.align = 8;
heapBufParams.sectionName = "ukfHeapBuf";
Program.global.ukfHeapBuf = HeapBuf.create(heapBufParams);