SYS-BIOS中malloc和Memory_alloc的區別
注:該文轉自網上,版權歸原作者所有,不知道是從哪裡下載的了,這裡就不貼網址了;
SYS-BIOS中malloc和Memory_alloc的區別
SYS-BIOS中malloc和Memory_alloc的區別.. 1
1 關於malloc和Memory_alloc的區別.. 2
1.2 在BIOS的cfg檔案中通過指令碼建立heap. 2
1 關於malloc和Memory_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得到的buffer用free釋放,API是void free(void *_ptr);
· Memory_alloc是從使用者建立的heap(不是system heap)上分配bufer,它是BIOS的API,有下面4個入參。使用者通過編輯BIOS的cfg檔案可以建立自己的heap,參見下文。
引數1 heap handler,即指向heap object的handler
引數2 size 需要分配的heap的size
引數3 align 對齊特性要求
引數4 Error_block 可以設成NULL
Memory_alloc得到的buffer用Memory_free釋放,API有3個引數
引數1 Heap_Handle,即指向heap object的handler
引數2 block, 即要釋放的buffer的指標
引數3 size, 即要釋放的buffer的size
兩年國外需要注意的是,使用者可以建立Heapbuf和HeapMem兩種堆,它們使用的區別是HeapBuf是以固定size的block為單位分配的,block的size在HeapBuf建立的時候就定死了。HeapMem和我們常用heap用法一樣,要多少分多少。
1.2 在BIOS的cfg檔案中通過指令碼建立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);
下面是這3個heap在memory中的示意圖,上圖的實體地址是根據後面執行的結果推出來的,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
相關文章
- malloc、calloc和realloc區別
- new 和 malloc 的區別 及使用
- 細說new和malloc的十大區別
- JavaScript中==和===的區別JavaScript
- Linux中“>”和“>>”的區別Linux
- Python 中 is 和 == 的區別Python
- Python中is和==的區別Python
- mysql中“ ‘ “和 “ ` “的區別MySql
- JavaScript中for in 和for of的區別JavaScript
- Js中for in 和for of的區別JS
- mysql中!=和is not的區別MySql
- PHP 中的 -> 和 :: 的區別PHP
- SQL中where和on的區別SQL
- java 中equals和==的區別Java
- deferred中done和then的區別
- JS中的!=、== 、!==、=== 的用法和區別JS
- 關於Fork和Malloc的思考
- MySQL中datetime和timestamp的區別MySql
- Python中字典和json的區別!PythonJSON
- Lua中pair和ipair的區別AI
- js中null和undefined的區別JSNullUndefined
- js中undefined和null的區別JSUndefinedNull
- ts中的type 和 interface 區別
- Nginx中root和alias的區別Nginx
- Spring中@Component和@Configuration的區別Spring
- js中AMD和CMD的區別JS
- php中TCP和UDP的區別PHPTCPUDP
- 程式中fork和vfork的區別
- python中break和continue的區別Python
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- Java中 equals() 方法和 == 的區別Java
- js中!和!!的區別與用法JS
- linq中AsEnumerable和AsQueryable的區別
- Git中merge和rebase的區別Git
- Java中Vector和ArrayList的區別Java
- Numpy中reshape和resize的區別
- MyBatis中#{}和${}的區別詳解MyBatis
- Shiro中principal和credential的區別
- CSS中 link 和@import的區別CSSImport