SYS-BIOS中malloc和Memory_alloc的區別

smilestone322發表於2015-04-16

注:該文轉自網上,版權歸原作者所有,不知道是從哪裡下載的了,這裡就不貼網址了;

 

SYS-BIOSmallocMemory_alloc的區別

2013.3

TI CI FAE

 

SYS-BIOSmallocMemory_alloc的區別.. 1

2013.3. 1

TI CI FAE. 1

1       關於mallocMemory_alloc的區別.. 2

1.1        Summary. 2

1.2        BIOScfg檔案中通過指令碼建立heap. 2

1.3        map檔案中的線索.. 3

1.4        HeapBuf的使用.. 3

1.5        HeapMem的使用.. 4

1.6        Malloc的使用.. 5

1.7        Example. 5

 


1      關於mallocMemory_alloc的區別

 

1.1    Summary

·          Malloc是標準C的函式,它是從system heap上分配buffer。在使用BIOS的情況下,通過BIOS.heapSize = 0x2000設定system heap的大小,在不使用BIOS的情況下要在cmd檔案中用-heap設定sytem heap的大小。函式API void *malloc(unsigned int num_bytes);定義在stdilb.h標頭檔案中。Malloc得到的bufferfree釋放,APIvoid   free(void *_ptr);

·          Memory_alloc是從使用者建立的heap(不是system heap)上分配bufer,它是BIOSAPI,有下面4個入參。使用者通過編輯BIOScfg檔案可以建立自己的heap,參見下文。

引數1 heap handler,即指向heap objecthandler

引數2 size  需要分配的heapsize

引數3 align 對齊特性要求

引數4 Error_block 可以設成NULL

Memory_alloc得到的bufferMemory_free釋放,API3個引數

引數1 Heap_Handle,即指向heap objecthandler

引數2 block, 即要釋放的buffer的指標

引數3 size, 即要釋放的buffersize  

 

兩年國外需要注意的是,使用者可以建立HeapbufHeapMem兩種堆,它們使用的區別是HeapBuf是以固定sizeblock為單位分配的,blocksizeHeapBuf建立的時候就定死了。HeapMem和我們常用heap用法一樣,要多少分多少。

1.2    BIOScfg檔案中通過指令碼建立heap

/*

 * The BIOS module will create the default heap for the system.

 * Specify the size of this default heap.

 */

BIOS.heapSize = 0x2000;

 

var heapBufParams = new HeapBuf.Params;

heapBufParams.blockSize = 32;  // heapBuf是以block為單位分配的

heapBufParams.numBlocks = 2;

heapBufParams.align = 8;

Program.global.task0Heap = HeapBuf.create(heapBufParams);

 

var heapMemParams2 = new HeapMem.Params;

heapMemParams2.size = 512; // heapMem是要多少分多少

heapMemParams2.align = 8;

Program.global.task1Heap = HeapMem.create(heapMemParams2);

 

下面是這3heapmemory中的示意圖,上圖的實體地址是根據後面執行的結果推出來的,heap的具體位置是在link的時候確定的。

 

1.3    map檔案中的線索

Map檔案顯示了link以後這些heap被分配在哪個section

.far       0    0080d4a0    00003a68     UNINITIALIZED

                  0080d4a0    00002a50     memory_pe66.oe66 (.far)

                            // 從上面可以看出BIOS中定義的heap段被分配在.far section

                  0080fef0    00001000     memory_pe66.oe66 (.far:taskStackSection)

                  00810ef0    00000010     memory.obj (.far)

                  00810f00    00000008     rts6600_elf.lib : trgdrv.obj (.far)

 

1.4    HeapBuf的使用

呼叫BIOS API獲取heap的handler

IHeap_Handle heap = HeapBuf_Handle_upCast(task0Heap);

 

呼叫Memory_alloc()分配block buffer

for (i = 0; i < 2; i++) {

        bufs[i] = Memory_alloc(heap, 32, 0, NULL);

    }

 

呼叫Memory_free()釋放block buffer

    for (i = 0; i < 2; i++) {

        Memory_free(heap, bufs[i], 32);

}

 

watch視窗中可以觀察task0Heap

初始化的狀態

*(task0Heap) struct ti_sysbios_heaps_HeapBuf_Object  {...}   0x008149F8 

     __fxns  struct ti_sysbios_heaps_HeapBuf_Fxns__ *    0x00812C70     

     blockSize   unsigned int    32     

     align   unsigned int    8      

     numBlocks   unsigned int    2      

     bufSize unsigned int    64     

     buf char *  0x0080D4A0

     numFreeBlocks   unsigned int    2      

     minFreeBlocks   unsigned int    4294967295     

     __dummy char    0x60

 

 

分配了兩個block以後的狀態

*(task0Heap) struct ti_sysbios_heaps_HeapBuf_Object  {...}      

     __fxns  struct ti_sysbios_heaps_HeapBuf_Fxns__ *    0x00812C70     

     blockSize   unsigned int    32     

     align   unsigned int    8      

     numBlocks   unsigned int    2      

     bufSize unsigned int    64     

     buf char *  0x0080D4A0

     numFreeBlocks   unsigned int    0      

     minFreeBlocks   unsigned int    4294967295     

     __dummy char    0x18       

 

1.5    HeapMem的使用

 

獲取buffer handler

IHeap_Handle heap = HeapMem_Handle_upCast(task1Heap);

 

連續分配3個buffer

bufs[0] = Memory_alloc(heap, 128, 0, NULL);

bufs[1] = Memory_alloc(heap, 64, 0, NULL);

bufs[2] = Memory_alloc(heap, 32, 0, NULL);

 

在watch視窗觀察到的結果是:

bufs[0]   void *   0x0080D4E0        

bufs[1]   void *   0x0080D560        

bufs[2]   void *   0x0080D5A0        

    

初始化以後的狀態

*(task1Heap)    struct ti_sysbios_heaps_HeapMem_Object    {...}       

    |- __fxns    struct ti_sysbios_heaps_HeapMem_Fxns__ *    0x00812C98       

    |- align       unsigned int    8       

    |- buf         char *    0x0080D4E0       

    |- head    struct ti_sysbios_heaps_HeapMem_Header    {...}       

        |- next    struct ti_sysbios_heaps_HeapMem_Header *    0x0080D4E0       

        |- size    unsigned int    512   

   

分配了3個buffer以後的狀態

*(task1Heap)    struct ti_sysbios_heaps_HeapMem_Object    {...}    0x00814A20   

    |- __fxns    struct ti_sysbios_heaps_HeapMem_Fxns__ *    0x00812C98       

    |- align    unsigned int    8       

    |- buf    char *    0x0080D4E0       

    |- head    struct ti_sysbios_heaps_HeapMem_Header    {...}       

        |- next    struct ti_sysbios_heaps_HeapMem_Header *    0x0080D5C0       

        |- size    unsigned int    512       

繼續執行

    Memory_free(heap, bufs[1], 64);

    Memory_free(heap, bufs[2], 32);

bufs[3] = Memory_alloc(heap, 16, 0, NULL);

 

在watch視窗觀察到的結果是:

    bufs[3]   void *   0x0080D560        

heapMem物件的變化是:

*(task1Heap)    struct ti_sysbios_heaps_HeapMem_Object    {...}    0x00814A20   

    |- __fxns   struct ti_sysbios_heaps_HeapMem_Fxns__ *    0x00812C98       

    |- align    unsigned int    8       

    |- buf      char *    0x0080D4E0       

    |- head     struct ti_sysbios_heaps_HeapMem_Header    {...}       

        |- next    struct ti_sysbios_heaps_HeapMem_Header *    0x0080D570       

        |- size    unsigned int    512       

可以看出bufs[3]是在bufs[2]釋放後的位置上分配的。

 

1.6    Malloc的使用

在main,task0 和task1中呼叫3次malloc,分別是

malloc_ptr[0] = malloc(128); // called in main()

malloc_ptr[1] = malloc(128); // called in task0

malloc_ptr[2] = malloc(128); // called in task1

 

得到下面的結果

malloc_ptr    char *[4] 0x00810EF0        

     [0]  char *   0x0080D700 

     [1]  char *   0x0080DFE0   

     [2]  char *   0x0080E068   

     [3]  char *   0x00000000

 

1.7    Example

下面上述example的工程,是使用 CCS中自帶的SYS/BIOS模板建立的。

使用者自己建立的方法是在CCS5中

File->new project ->CCS project -> 在projecttemplate中選 SYS/BIOS ->generic examples -> memory examples  

相關文章