嵌入式常用模組之 環形佇列(1)

2021-08-27 08:34:29 字數 4026 閱讀 2639

在嵌入式開發時候,有很對模組是經常會使用到的。從這篇文字開始,將我覺得一些常用的模組逐一做乙個整理。梳理一下自己的思路,也順便方便大家,如果可以給初學者一點幫助和啟發,那也是再好不過了。

環形佇列在非同步接收資料上感覺不能更爽。關於環形佇列詳細講解說明網上也很多了,我就簡單說一下了。為了減少動態分配**記憶體開銷。我寫的佇列使用的是線性儲存方式。所謂環形佇列不過把線性表利用指標等方式模擬成乙個環形結構。讓人在使用上看起來是乙個環形的。簡單說就是到達陣列尾部後回溯到頭部重新開始。

首先要說的一點。加入佇列到尾部還有20位元組,這時候要存21位元組資料的話,有兩種方式,第一種是前20位元組存尾部20位元組,最後1位元組存到隊頭。這種方式實現是真正的環形佇列。第二種方式是浪費掉這尾部20位元組,資料全部從頭開始存,占用頭部21位元組空間。這樣的話浪費了一定空間,也就是說如果頭部沒有21位元組空閒,資料就放不下了。我使用的是第二種方式,雖然浪費一點空間,但是實現和管理上比較簡單。(ps:這裡有必要提一下,我所描述的頭部和尾部,特指實際資料的頭尾,不是所實現的佇列的頭尾)。

這種方式實現的佇列適合訪問一些長度變化較大的資料。至於訪問長度基本等長的資料,這樣實現也是可以的,下篇我會用另一種方式實現佇列,那種方式個人認為更適合一點訪問等長資料。我也是這麼做的。

不排除我的**有遺漏的邊界測試。如果要用於專案請自行檢查一下。

初始化是必須的,畢竟用了指標。必須初始化一下,不能讓他撒野。萬一野指標搞出個bug簡直想哭。

void ringinit(ptest t)

}

其他部分突然覺得沒啥可說的,那就這樣吧。

#include 

#define test 1

#define max_buff (1024) // 佇列資料段總的長度

#define max_len (10) // 佇列中資料段個數

typedef

struct __test

test,*ptest;

/******************************

* @funcation: 初始化佇列

* @auther: main_h_

* @time: 2018/9/6

* @param: ptest[in]

* @return: none

******************************/

void ringinit(ptest t)

}/******************************

* @funcation: 返回乙個進佇列指標

* @auther: main_h_

* @time: 2018/9/6

* @param: t[in] len[in]

* @return: 如果buff有空閒則返回

乙個進佇列指標,否則返回null

******************************/

unsigned

char* ringput(ptest t,int len)

return null;

}else

}/******************************

* @funcation: 返回乙個出佇列指標

* @auther: main_h_

* @time: 2018/9/6

* @param: t[in] len[out]

* @return: 如果buff有資料則返回

乙個出佇列指標,否則返回null

******************************/

unsigned

char* ringget(ptest t,int *len)

t->tail += t->size[t->getcount%max_len];

*len = t->size[t->getcount%max_len];

if(t->tail >= t->buff + max_buff)

t->getcount++;

return ret;

}/******************************

* @funcation: 返回佇列狀態

* @auther: main_h_

* @time: 2018/9/6

* @param: t[in]

* @return: 隊列為空返回1,否則返回0

******************************/

unsigned

char ringempty(const ptest t)

int main()

}ptr = ringget(&t,&len);

printf("isempty:%d",ringempty(&t));

ptr = ringput(&t,4);

printf("\n\nnull............ :%x\n\n",ptr);

if(ptr != null)

}ptr = ringget(&t,&len);

if(ptr != null)

}printf("isempty:%d\n",ringempty(&t));

printf("\n");

ptr = ringput(&t,20);

printf("\n\n\n%x\n",ptr);

if(ptr != null)

}printf("\n");

ptr = ringget(&t,&len);

if(ptr != null)

}printf("\n");

ptr = ringget(&t,&len);

if(ptr != null)

}ptr = ringput(&t,20);

printf("\n\nnull :%x\n\n",ptr);

if(ptr != null)

}ptr = ringput(&t,210);

printf("\n\nnull :%x\n\n",ptr);

if(ptr != null)

}printf("\nisempty:%d\n",ringempty(&t));

ptr = ringget(&t,&len);

if(ptr != null)

}printf("\n");

printf("\nisempty:%d\n",ringempty(&t));

ptr = ringget(&t,&len);

if(ptr != null)

}printf("\nisempty:%d\n",ringempty(&t));

printf("\n");

ptr = ringput(&t,21);

ptr = ringput(&t,21);

ptr = ringput(&t,21);

ptr = ringput(&t,210);

ptr = ringput(&t,210);

ptr = ringput(&t,210);

ptr = ringput(&t,210);

ptr = ringput(&t,210);

ptr = ringput(&t,210);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

ptr = ringget(&t,&len);

// ptr = ringget(&t,&len);

printf("\nisempty:%d\n",ringempty(&t));

printf("%x\n",ptr);

#endif

return

0;}

核心模組嵌入式

linux核心模組程式設計特點 1 不能使用c庫和c標準標頭檔案 2 必須使用gnu規範 3.沒有記憶體保護機制 4.不能處理浮點運算 5.注意同步和併發的問題 6.注意可移植性 一,模組函式 1 載入函式 將模組函式用關鍵字static修飾,避免和核心函式重名 init 把標記的函式放在elf檔案...

嵌入式學習1

嵌入式學習第一天 linux檔案處理命令 1.mkdir 作用是建立名稱為dirname的子目錄 使用許可權是所以使用者 格式mkdir options 目錄名 options 主要引數 m mode 模式 設定許可權 模式 與chmod類似 p parents 需要是建立上層目錄 如果目錄早已存在...

嵌入式總結1

1 了解嵌入式技術 2 掌握嵌入式linux操作的使用 命令 80 以上的開發平台都是linux 3 掌握嵌入式linux開發工具的使用 gcc gbd make shell 4 掌握嵌入式linux應用開發 檔案 多工 網路 資料庫 5 了解嵌入式產品開發流程 硬體 軟體 系統 6 了解嵌入式系統...