uC/OS-III內存管理做法其實很簡單

看了一下uC/OS-III內存管理代碼,挺簡單的,本來沒想單獨寫一篇文章,可是看到它的寫法,還是挺有意思的。


先斷言一下

1.它跟微軟的fat32文件系統走的設計路子差不多(簡單但是又富有內涵)。

2.只適用於塊大小相同的內存管理。

設計


1.怎麼去設計這種管理方法而又不會複雜?

首先想到的是需要鏈表,把它們鏈接起來。但是自定義一個鏈表又耗費內存,所以最好是將鏈表隱性的存放在定義的一個大數組中。

如下圖就是一種方法:


uC/OS-III內存管理做法其實很簡單

假設一個數組,為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>


uC/OS-III內存管理做法其實很簡單


分享到:


相關文章: