首頁 > 運動
微控制器程式開發中常用的資料結構
由 Z先生麼麼噠 發表于 運動2023-01-13
簡介}***********************************************判斷緩衝區是否為滿*採用犧牲一個元素空間的方式引數:無返回值:滿返回TRUE,未滿則返回FALSE************
流的意思與什麼相關
對於程式設計師來說,資料結構真的很重要,但是對於微控制器程式設計師來說,很多人可能都是非計算機科班出生,資料結構都是自學的。至少我自動化本科的課程是沒有資料結構的課程的,如果說有的話,便是我已經還給老師了,哈哈哈。
佇列,連結串列,類,結構體,聯合體,二叉樹等等都是嵌入式常用的資料結構。
在畢業後的工作崗位上,我也get到了一個非常好用的資料結構使用方法:聯合體+結構體的方式,具體定義如下。
#define SIZE (28U)
typedef union
{
INT8U buf[SIZE];
struct
{
INT32U a[3];
INT16S b[3];
INT8U res[8];
INT16U cs;
}bits;
}MY_PARM;
這麼定義的好處是,如果我想一次性賦值給所有變數,可以直接MY_PARM。buf,如果單獨修改某一個引數,可以MY_PARM。bits。 a[2],可以說是超級方便。大家說說這麼定義還有什麼好處?
另外,在微控制器程式開發中經常使用的資料結構還有環形佇列。這個網上資料也超多,這裡不多說,索性這裡學以致用,寫一個使用聯合體+結構體實現的環形佇列。
#define EVENT_SIZE (12U)
typedef union
{
INT8U val8[EVENT_SIZE];
struct
{
INT8U type;
INT8U idxL;
INT8U idxH;
INT8U value;
INT8U time[8];
}bits;
}RECORD;
#define MaxBufferSize 64
typedef struct
{
RECORD record[MaxBufferSize];
INT8U Put;
INT8U Get;
}RECORD _BUFF;
RECORD _BUFF record_buff;
RECORD info[MAX_CHANNEL];
/**********************************************/
/*判斷緩衝區是否為空*/
//引數:無
//返回值:空返回TRUE,非空返回FALSE
/**********************************************/
INT8U BufferEmpty( void )
{
RECORD _BUFF *buff;
buff = record_buff;
if( buff->Put==buff->Get )
{
return TRUE;
}
return FALSE;
}
/**********************************************/
/*判斷緩衝區是否為滿*/
//採用犧牲一個元素空間的方式
//引數:無
//返回值:滿返回TRUE,未滿則返回FALSE
/**********************************************/
INT8U BufferFull(void)
{
RECORD _BUFF *buff;
buff = record_buff;
if( ( buff->Put+1 )%MaxBufferSize==buff->Get )
{
return TRUE;
}
return FALSE;
}
/**********************************************/
/*從緩衝區中讀資訊函式*/
//引數:無
/* 從環形緩衝區中取元素 */
/* 有幾個元素取幾個元素 */
//返回值:無
/**********************************************/
void ReadBuffer(void)
{
RECORD _BUFF *buff;
buff = & record_buff;
if( FALSE==BufferEmpty( ) )
{
memcpy( &data,&buff->record[buff->Get], 12U );
buff->Get=( INT8U ) ( ( buff->Get+1 )%MaxBufferSize );//讀指標後移
}
}
/**********************************************/
/*把ID號為i的資訊寫到快取裡面*/
//引數:ID號
/* 向環形緩衝區buff中放入一個元素*/
//返回值:無
/**********************************************/
void WriteBuffer(INT8U i)
{
RECORD _BUFF *buff;
RECORD *temp;
buff = & record_buff;
temp = & info[i];
memcpy( &buff->record[buff->Put], temp, 12U );//
buff->Put=( INT8U ) ( ( buff->Put+1 )%MaxBufferSize );
}