freertos(第二課,coding style,list )

freertos對數據類型進行了統一定義。
標準C的類型,被命名爲標準的freertos類型。
例如:

#define portCHAR char 
#define portSHORT short
#define portLONG long

#define portSTACK_TYPE uint32_t
typedef portSTACK_TYPE StackType_t;

#define portBASE_TYPE long
typedef long BaseType_t;
typedef unsigned long UBaseType_t;

typedef uint32_t TickType_t;
#define portMAX_DELAY (TickType_t)0xffffffffUL

注意,int型是不允許使用的,因爲它的長度各平臺不定,freertos中,只使用short和long。

freertos中,變量命名需要將變量的類型作爲前綴。前綴小寫。
例如,char型,前綴爲c,short型,前綴爲s, long型,前綴爲l,portBASE_TYPE,前綴爲x,對象句柄的前綴,也是x。
如果是無符號型的,附加前綴u,如果是一個指針,則附加前綴p。
例如,無符號char,前綴是uc,而char型指針,則前綴是pc。

freertos中,函數命名前綴是返回值的類型。前綴小寫。
例如:
vTaskPrioritySet(), 返回值是void,
xQueueReceive(),返回值是portBASE_TYPE,
vSemaphoreCreateBinary(),返回值是void。
每個單詞的首字符大寫。首單詞,表示API所屬的功能模塊,通常也是對應的文件名。
注意,如果是static的函數,還會附加前綴prv(private)。

freertos中,宏命名的前綴是所屬的功能模塊,通常是對應的文件名或者一部分文件名,全詞小寫。之後的單詞,全詞大寫,單詞之間,用下劃線隔開。
例如:
portMAX_DELAY,位於portable.h
taskENTER_CRITICAL,位於task.h
configUSE_PREEMPTION,位於freertosconfig.h
pdTRUE,位於projdef.h
errQUEUE_FULL,位於projdef.h

#define pdTRUE 1
#define pdFALSE 0
#define pdPASS 1
#define pdFAIL 0

注意,信號量的函數,是由宏擬函數實現的,所以,雖然是宏,但是遵循函數的命名規則。

LIST通常是指鏈表,而VectorTable通常是指數組。
Freertos中,list.c和list.h中,實現了LIST_ITEM和LIST。

struct xLIST_ITEM{
	configLIST_VOLATILE TickType_t xItemValue;
	struct xLIST_ITEM* configLIST_VOLTAGE pxNext;
	struct xLIST_ITEM* configLIST_VOLTAGE pxPrevious;

	void* configLIST_VOLATILE pvOwner; // TCB
	void* configLIST_VOLATILE pvContainer; // LIST
};
typedef struct xLIST_ITEM ListItem_t;

從中可以看出,LIST_ITEM自帶兩個鏈節,它可以構成雙向鏈表。
後面的代碼,均給出簡易寫法。

struct xLIST{
	MiniListItem_t xListEnd;
	UBaseType_t uxNumberOfItems;
	ListItem_t * pxIndex;
};
typedef stuct xLIST List_t;

struct xMINI_LIST_ITEM{
	TickType_t xItemValue;
	struct xLIST_ITEM* pxNext;
	struct xLIST_ITEM* pxPrevious;
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;

既然LISTITEM已經可以構成雙向鏈表了,爲什麼要設計LIST?爲什麼要設計MINILISTITEM?
LIST的存在是爲了在邏輯上更清晰。
我們知道,linux中經常讓對象之間自成鏈表,但是它的關注點在對象本身,並沒有將對象集合當成一個整體來看待。所以只能實現同類型對象間索引,而不能完成集合的相關功能,例如數量統計,當前條目指示等。
雙向環形鏈表,首尾相接。
所以在LIST中,內嵌了MINILISTITEM,作爲LISTEND,另外,加入了幾個用於集合統計的成員。
freertos提供了API,

void vListInitialiseItem(ListItem_t* const pxItem);
void vListInitialise(List_t* const pxList);

void vListInsertEnd(List_t* const pxList, ListItem_t * const PxNewListItem);
void vListInsert(List_t* const pxList, ListItem_t * const PxNewListItem);//Ascending order
void void vListRemove(ListItem_t * const PxNewListItem);

freertos也提供了一系列的宏擬函數,例如:

#define listSET_LIST_ITEM_OWNER(pxListItem, pxOwner)
#define listGET_LIST_ITEM_OWNER(pxListItem)
#define listGET_NEXT(pxListItem)
#define listGET_OWNER_OF_NEXT_ENTRY(pxTCB, pxList)
...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章