日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ucos内存管理笔记

發(fā)布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 * addressint32u 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ū)的各個塊連接成一個鏈表來管理

其實就是將每一個塊的首個存儲空間存放先一個塊的起始地址 ? 那好了。我們看看ucosOsMemCreate(void * addressint32u 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什么的類型。因為不同編譯器對intuint等的理解是不一樣的 ? ? ? ? 到此為止吧。不知道我解釋的是不是清楚!。大家最好看看ucos內(nèi)存管理部分的內(nèi)容。因為我的講解比較粗略。 ? ?

轉(zhuǎn)載于:https://blog.51cto.com/3414033/998445

總結(jié)

以上是生活随笔為你收集整理的ucos内存管理笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。