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);