C4MLib 課程建議的軟體功能方塊,是以結構體實體為核心,搭配功能方塊結構體型態定義,功能方塊結構體內容初始化巨集,以及功能方塊步級執行函式組織成軟體功能方塊。
結構體形態(Structure Type)
在定義功能方塊的結構體之前需要先定義出其形態,有了結構體的形態,一方面可利用這個形態來定義出功能方塊的結構體。另一方面,功能方塊步級函式也可用這個結構體型態宣告傳遞參數的型態,讓 C 語言編譯器可以在呼叫功能方塊步級函式時檢驗傳遞參數型態是否吻合。
假設功能方塊名稱為 xxxFuncBlock,建議使用功能方塊名稱附加 Str_t 做為它的結構體形態名稱,例如
typedef struct { uint8_t Fbtype; uint8_t Logic_state; uint8_t state_variable[3]; uint8_t count; } xxxFuncBlockStr_t;
功能方塊結構體內容初始巨集 (Structure Initialization Macro)
我們建議,針對每一個功能方塊的每一份提供一個初值列舉巨集。有了初值列舉巨集,使能在用結構體形態定義功能方塊結構體的同時,以等於初值列舉巨集的方式達成初始化。 若有需要,初值列舉巨集也可以與結構體形態一起由程式檔.C 中獨立出來,成為前置碼檔.H。做到程式的經常修改部份與不經常修改部份分別存放不同檔案的效果。 例如:
#define XXXFUNCBLOCKSTR_INIT { \ .Fbtype = 0, \ .Logic_state = 0, \ .state_variable[0] = 0, \ .state_variable[1] = 0, \ .state_variable[2] = 0, \ .Counter = 0}
配合己經定義的結構體形態,可以定義並初始化多份自行命名的結構體實體: xxxFuncBlockStr_t xxxFuncBlock0_str=XXXFUNCBLOCKSTR_INIT ; xxxFuncBlockStr_t xxxFuncBlock1_str=XXXFUNCBLOCKSTR_INIT ; 或則結構體實體列 xxxFuncBlockStr_t xxxFuncBlock1_str[2]={XXXFUNCBLOCKSTR_I NIT,XXXFUNCBLOCKSTR_INIT} ;
功能方塊步級執行函式(Step Execution Function)
控制器及訊號處理器等微控器常用的場合,一般程式都不是分析用的程式。大部份的程式會配會工作週期時脈,一步一步執行。每一個週期,會執行一步,讀取輸入值,疊代更新內部變數或狀態,然後再計算輸出控制值,執行輸出。
uint8_t xxxFuncBlock_step(xxxFuncBlockStr_t* Str_p,uint8_t InputData, uint8_t* OutputData_p)
簡介:呼叫本函式,執行功能方塊一個週期的,輸出值計算,以及步級狀態更新。 定址參數: xxxFuncBlockStr_t* Str_p: 本功能方塊結構形態的結構體實體指標。 uint8_t* OutputData_p:呼叫函式提供給輸出值存入的變數位址,以及程 式存放輸出值。 傳值參數: uint8_t InputData:呼叫函式提供輸入值。