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