首頁 > 運動

微控制器程式開發中常用的資料結構

由 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 );

}

Tags:BUFFINT8URECORDput