看了一下uC/OS-III內存管理代碼,挺簡單的,本來沒想單獨寫一篇文章,可是看到它的寫法,還是挺有意思的。
先斷言一下
1.它跟微軟的fat32文件系統走的設計路子差不多(簡單但是又富有內涵)。
2.只適用於塊大小相同的內存管理。
設計
1.怎麼去設計這種管理方法而又不會複雜?
首先想到的是需要鏈表,把它們鏈接起來。但是自定義一個鏈表又耗費內存,所以最好是將鏈表隱性的存放在定義的一個大數組中。
如下圖就是一種方法:
假設一個數組,為unsigned char array[6][100],每一個array[0],array[1],array[2],array[3],array[4],array[5]降維成只有100bytes數據的數組,array]5]的四字節存放著值0,這樣就能表示鏈表的結束了。
這就是函數:
<code>void OSMemCreate (OS_MEM *p_mem,
CPU_CHAR *p_name,
void *p_addr,
OS_MEM_QTY n_blks,
OS_MEM_SIZE blk_size,
OS_ERR *p_err)/<code>
的中心思想。͚
2.怎麼去分配一塊空間?
首先讓鏈表指向開始的位置,然後從開始的位置將空閒的空間返回就可以了。之後將鏈表指針往下移動就可以了。
這就是函數:
<code>void *OSMemGet (OS_MEM *p_mem,OS_ERR *p_err)/<code>
的中心思想。
3.怎麼去釋放一塊空間?
先將釋放的空間塊的頭4字節填充上前面的鏈表指針位置,然後將鏈表指針指向當前的位置就可以了。
這就是函數:
<code>void OSMemPut (OS_MEM *p_mem,
void *p_blk,
OS_ERR *p_err)/<code>
的中心思想。
4.估計有人把思想看懂了,但是沒看懂它的代碼?
我寫了一個例子,也將結果寫出來,這樣應該很容易明白了。
<code>#include <stdio.h>
void test_mem_algo(void *p_addr)
{
int loops;
int i ;
unsigned char *p_blk;
void **p_link;
int blk_size = 4;
p_link = (void **)p_addr;
p_blk = (unsigned char *)p_addr;
loops = 3 - 1u;
printf("using good pointer...\\r\\n");
for (i = 0u; i < loops; i++) {
p_blk += blk_size;
*p_link = (void *)p_blk;
p_link = (void **)(void *)p_blk;
}
*p_link = (void *)0;
}
void test_mem_algo1(void *p_addr)
{
int loops;
int i ;
unsigned char *p_blk;
//void **p_link;
int blk_size = 4;
//p_link = (void **)p_addr;
p_blk = (unsigned char *)p_addr;
loops = 3 - 1u;
printf("using not good pointer...\\r\\n");
for (i = 0u; i < loops; i++) {
p_blk += blk_size;
//*p_link = (void *)p_blk;
// p_link = (void **)(void *)p_blk;
*(unsigned int *)((unsigned char *)p_addr+blk_size*i) = (unsigned int )p_blk;
}
*(unsigned int *)((unsigned char *)p_addr+blk_size*i) = (unsigned int)0;
//*p_link = (void *)0;
}
int main()
{
unsigned char array[3][4];
printf("array[0]=0x%0x\\r\\n",(int *)&array[0][0]);
printf("array[1]=0x%0x\\r\\n",(int *)&array[1][0]);
printf("array[2]=0x%0x\\r\\n",(int *)&array[2][0]);
test_mem_algo(array);
printf("array[0][0]=0x%0x\\r\\n",*(int *)&array[0][0]);
printf("array[1][0]=0x%0x\\r\\n",*(int *)&array[1][0]);
printf("array[2][0]=0x%0x\\r\\n",*(int *)&array[2][0]);
}/<stdio.h>/<code>
閱讀更多 wityuan 的文章