關(guān)注「 嵌入式大雜燴 」,選擇「 星標公眾號 」一起進步! [導讀] 遇到些朋友感覺Free
RTOS 內(nèi)核
代碼 看起來很不習慣,不習慣其編碼風格,本文就來梳理一下其代碼規(guī)范,便于提高閱讀其代碼的效率。代碼基于
FreeRTO S V10.4.3。
FreeRTOS代碼結(jié)構(gòu) 其內(nèi)核代碼文件就這幾個,非常簡潔:
croutine.c/croutine.h: 協(xié)程,在8位/16位平臺下效率比較高,在32位平臺建議使用任務(wù)task event_groups.c / event_groups.h:顧名思義,這個是事件組的實現(xiàn) heap_x.c:內(nèi)核堆實現(xiàn),F(xiàn)reeRTOS提供了heap_1.c ~ heap_5.c 5種堆管理器,各有優(yōu)缺點,需要根據(jù)應(yīng)用進行選擇。 list.c/list.h:鏈表實現(xiàn),主要為調(diào)度器提供數(shù)據(jù)結(jié)構(gòu)算法支持服務(wù)。比如任務(wù)鏈表。 port.c/portmacro.h:硬件相關(guān)層級可移植抽象,主要包括SysTick中斷,上下文切換,中斷管理,具體實現(xiàn)很大程度上取決于平臺(單片機體系硬件內(nèi)核和編譯器工具集)。通常以匯編語言實現(xiàn)。 queue.c/queue.h/semphr.h:信號量、互斥體實現(xiàn) tasks.c/task.h:任務(wù)管理器實現(xiàn) timers.c/timers.h:軟件定時器實現(xiàn) FreeRTOS.h:選編譯配置文件,用于匯總所有源文件的編譯選擇控制 FreeRTOSConfig.h:FreeRTO S內(nèi)核配置,Tick時鐘和irq中斷配置 接下來整理一下,相關(guān)的代碼規(guī)范,具體就體現(xiàn)在上述文件的編碼中。
變量 變量有嚴格的前綴標識變量類型屬性:
c – char 字符型變量 s – short 短型變量 l – long ?長整型變量 x – portBASE_TYPE 在 portmacro.h 中定義,便于移植的數(shù)據(jù)類型轉(zhuǎn)定義 u – unsigned 無符號整型 p - pointer 指針 舉例:
//x表示portBASE_TYPE,?u?表示無符號型 PRIVILEGED_DATA?static ?volatile ?TickType_t?xTickCount?=?(?TickType_t?)?configINITIAL_TICK_COUNT; PRIVILEGED_DATA?static ?volatile ?UBaseType_t?uxTopReadyPriority?=?tskIDLE_PRIORITY;//比如在list.h?中 struct ?xLIST_ITEM { ????configLIST_VOLATILE?TickType_t?xItemValue; ????//指針以p打頭 ????struct ?xLIST_ITEM ?*?configLIST_VOLATILE ?pxNext ; ? ????struct ?xLIST_ITEM ?*?configLIST_VOLATILE ?pxPrevious ; ? ????void ?*?pvOwner;? ????struct ?xLIST ?*?configLIST_VOLATILE ?pxContainer ; ? };對于C語言的基本數(shù)據(jù)類型,做了可移植轉(zhuǎn)定義:
#define ?portCHAR??????????char #define ?portFLOAT?????????float #define ?portDOUBLE????????double #define ?portLONG??????????long #define ?portSHORT?????????short #define ?portSTACK_TYPE????uint32_t #define ?portBASE_TYPE?????long 函數(shù) 前綴:
v :void 無返回類型 x :返回portBASE_TYPE prv :私有函數(shù),模塊內(nèi)使用 //ux?表示無符號portBASE_TYPE?返回值 //List表示該函數(shù)所屬文件 //Remove函數(shù)名 UBaseType_t?uxListRemove (?ListItem_t?*?const ?pxItemToRemove?) ?PRIVILEGED_FUNCTION ;//又比如prv?表示模塊內(nèi)函數(shù) static ?TickType_t?prvGetNextExpireTime (?BaseType_t?*?const ?pxListWasEmpty?) ?PRIVILEGED_FUNCTION ;宏 定義宏所屬文件,也即在哪個文件內(nèi)定義的:
port:比如portable.h中portMAX_DELAY task:比如task.h中task_ENTER_CRITICAL pd :例如projdefs.h中定義的pdTRUE config:例如 FreeRTOS Config.h中定義的configUSE_PREEMPTION err:例如 projdefs.h中定義的errQUEUE_FULL 至于這么嚴格的代碼規(guī)范是否值得推崇,這個見仁見智,個人比較喜歡Linux代碼風格,對于過于復雜的
代碼 規(guī)范,在實際開發(fā)中個人覺得有時候會讓人不爽。
— END —