ucos内存管理笔记
生活随笔
收集整理的這篇文章主要介紹了
ucos内存管理笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://www.jarson.asia/2011/04/23/ucos-ii%E7%9A%84%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/ 參考以上信息 ? INT8U ? ? *pblk;
? ? void ? ? **plink;
? ? .
? ? .
? ? plink = (void **)addr; ? ? ? ? ? ? ? ? ? ?/*Create linked list of free memory blocks */
? ? pblk ?= (INT8U *)addr + blksize;
? ? for (i = 0; i < (nblks - 1); i++) {
? ? ? ? *plink = (void *)pblk;
? ? ? ? plink ?= (void **)pblk;
? ? ? ? pblk ? = pblk + blksize;
? ? }
? ? *plink ? ? ? ? ? ? ?= (void *)0; ? ? ? ? ? 紅色的部分是OsMemCreate(void * address,int32u nblks……) ? 使用創建內存分區之前要分配一部分內存給 ucos讓它來管理 OS_MEM *TxBuf;
INT8U TxPart[100][32];
?
void main(void) {
? ? INT8U err;
? ? OSInit();
? ? .
? ? .
? ? TxBuf = OSMemCreate(TxPart, 100, 32, &err);
? ? .
? ? .
? ? OSStart();
} 也就是建立一個內存分區 ? 而ucos是怎樣管理內存的呢 INT8U TxPart[100][32];是建立一個有100個塊,并且每個塊石32Byte的內存分區 作者將這個內存分區的各個塊連接成一個鏈表來管理
其實就是將每一個塊的首個存儲空間存放先一個塊的起始地址 ? 那好了。我們看看ucos的OsMemCreate(void * address,int32u nblks……)是怎樣做的 核心代碼 ? INT8U ? ? *pblk;
? ? void ? ? **plink;
? ? .
? ? .
? ? plink = (void **)addr; ? ? ? ? ? ? ? ? ? ?/*Create linked list of free memory blocks */
? ? pblk ?= (INT8U *)addr + blksize;
? ? for (i = 0; i < (nblks - 1); i++) {
? ? ? ? *plink = (void *)pblk;
? ? ? ? plink ?= (void **)pblk;
? ? ? ? pblk ? = pblk + blksize;
? ? }
? ? *plink ? ? ? ? ? ? ?= (void *)0; ? ? 函數傳遞過來的是address,也就是內存分區首個塊的第一個地址? ? 本人認為實現一個內存鏈表可以如下: 將內存塊的指針強制轉換成整型數據。放到前一個內存塊的首個內存空間,這樣,前一個內存塊就保存了下一個內存塊的地址了。 ? 實現起來如下: ? Void * p1=addr; Void *p2 = addr+blksize; For(i=0;i<(nblks-1);i++) { ?????? *p1 = (uint32 ) p2; ?????? P1 = p2; ?????? P2=p2+blksize; } 大家看到我創建鏈表用的是整型數據賦值, 但是ucos沒有這樣做。作者用的是指針賦值,不知道是處于移植考慮還是我(菜鳥)考慮不周。或者其他原因。總之,作者的方法如下: plink = (void **)addr; ? ? ? ? ? ? ? ? ? ?/*Create linked list of free memory blocks * 作者這里用一個強制轉換,其實是為了把addr所指向的內存空間當成一個指針來用 這句話以后,那么編譯器就不再把第一個塊的第一個內存空間看做一個變量了。而是成為了一個指針來處理。那么理所當然 *plink = (void *)pblk;就是把第一個塊的第一個地址的內存內容放入了下一個塊的內存地址。哈哈 為什么作者用二級指針,目的何在?作者用二級指針不是為了改變指針的值,而是把塊的“第一個內存區當成指針來用”以此賦值吧 作者可能有更遠的考慮。移植問題吧。應為自始至終作者的都是調用void*型指針變量的。沒有用到諸如int什么的類型。因為不同編譯器對int、uint等的理解是不一樣的 ? ? ? ? 到此為止吧。不知道我解釋的是不是清楚!。大家最好看看ucos內存管理部分的內容。因為我的講解比較粗略。 ? ?
? ? void ? ? **plink;
? ? .
? ? .
? ? plink = (void **)addr; ? ? ? ? ? ? ? ? ? ?/*Create linked list of free memory blocks */
? ? pblk ?= (INT8U *)addr + blksize;
? ? for (i = 0; i < (nblks - 1); i++) {
? ? ? ? *plink = (void *)pblk;
? ? ? ? plink ?= (void **)pblk;
? ? ? ? pblk ? = pblk + blksize;
? ? }
? ? *plink ? ? ? ? ? ? ?= (void *)0; ? ? ? ? ? 紅色的部分是OsMemCreate(void * address,int32u nblks……) ? 使用創建內存分區之前要分配一部分內存給 ucos讓它來管理 OS_MEM *TxBuf;
INT8U TxPart[100][32];
?
void main(void) {
? ? INT8U err;
? ? OSInit();
? ? .
? ? .
? ? TxBuf = OSMemCreate(TxPart, 100, 32, &err);
? ? .
? ? .
? ? OSStart();
} 也就是建立一個內存分區 ? 而ucos是怎樣管理內存的呢 INT8U TxPart[100][32];是建立一個有100個塊,并且每個塊石32Byte的內存分區 作者將這個內存分區的各個塊連接成一個鏈表來管理
其實就是將每一個塊的首個存儲空間存放先一個塊的起始地址 ? 那好了。我們看看ucos的OsMemCreate(void * address,int32u nblks……)是怎樣做的 核心代碼 ? INT8U ? ? *pblk;
? ? void ? ? **plink;
? ? .
? ? .
? ? plink = (void **)addr; ? ? ? ? ? ? ? ? ? ?/*Create linked list of free memory blocks */
? ? pblk ?= (INT8U *)addr + blksize;
? ? for (i = 0; i < (nblks - 1); i++) {
? ? ? ? *plink = (void *)pblk;
? ? ? ? plink ?= (void **)pblk;
? ? ? ? pblk ? = pblk + blksize;
? ? }
? ? *plink ? ? ? ? ? ? ?= (void *)0; ? ? 函數傳遞過來的是address,也就是內存分區首個塊的第一個地址? ? 本人認為實現一個內存鏈表可以如下: 將內存塊的指針強制轉換成整型數據。放到前一個內存塊的首個內存空間,這樣,前一個內存塊就保存了下一個內存塊的地址了。 ? 實現起來如下: ? Void * p1=addr; Void *p2 = addr+blksize; For(i=0;i<(nblks-1);i++) { ?????? *p1 = (uint32 ) p2; ?????? P1 = p2; ?????? P2=p2+blksize; } 大家看到我創建鏈表用的是整型數據賦值, 但是ucos沒有這樣做。作者用的是指針賦值,不知道是處于移植考慮還是我(菜鳥)考慮不周。或者其他原因。總之,作者的方法如下: plink = (void **)addr; ? ? ? ? ? ? ? ? ? ?/*Create linked list of free memory blocks * 作者這里用一個強制轉換,其實是為了把addr所指向的內存空間當成一個指針來用 這句話以后,那么編譯器就不再把第一個塊的第一個內存空間看做一個變量了。而是成為了一個指針來處理。那么理所當然 *plink = (void *)pblk;就是把第一個塊的第一個地址的內存內容放入了下一個塊的內存地址。哈哈 為什么作者用二級指針,目的何在?作者用二級指針不是為了改變指針的值,而是把塊的“第一個內存區當成指針來用”以此賦值吧 作者可能有更遠的考慮。移植問題吧。應為自始至終作者的都是調用void*型指針變量的。沒有用到諸如int什么的類型。因為不同編譯器對int、uint等的理解是不一樣的 ? ? ? ? 到此為止吧。不知道我解釋的是不是清楚!。大家最好看看ucos內存管理部分的內容。因為我的講解比較粗略。 ? ?
轉載于:https://blog.51cto.com/3414033/998445
總結
以上是生活随笔為你收集整理的ucos内存管理笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验室机器OracleXE客户端连接远程
- 下一篇: GNU make manual 翻译(八