Functional-Register-Based (Macro)通用暫存器或旗標讀寫巨集
透過暫存器或旗標的讀寫,雖然可以達成硬體的監控,但執行時需組合,暫存器讀寫,遮罩及平移,等指令組合才能完成,這些指令組合的順序基本上相同,不同的是,暫存器位址,遮罩,平移或則位元組數。經過C4M-OS歸納整理將這些指令群整合成通用且具有參數的巨集,為各種設定或操作硬體動作找出了對應的參數組合,並整理出對應每種設定操作的參數快查表。使用者只要依據所想執行的設定或操作動作,從參數快查表中找出參數,再呼叫巨集並套用所查到的參數,即可用單一呼叫指令達成該一設定或操作的動作。
將多個指令組合在成單一呼叫指令的方式有兩種,其一是巨集(Macro),其二是函式。巨集在使用上不論是參數或呼叫使用,基本上與函式是相同的。不同的是,函式碼會事先編譯成可執行碼再在呼叫處進行鏈結執行,而巨集則是一段原始程式碼,在編譯時會被復寫並取代被叫呼叫的巨集,然後再編譯。
C4M-OS 硬體設定暫存器寫入巨集REGPUT()
常見的硬體暫存器為單位元組,但也有硬體暫存器佔用了2個位元組,甚至4個位元組,提供這些暫存器資料的變數也是多位元組變數,讀寫時需要拆解來源變數的位元組,再逐一位元組寫入暫存器。C4M-OS提供了巨集,可以自動,拆分變數,逐一寫入暫存器。使用C4M-OS巨集,可以讓程式更簡潔,不因太多小細節混亂了整體架構。
REGPUT(HWREG_p,Bytes,Data_p)
簡介:配合參數快查表協助使用者完成,指定位元組數暫存器資料寫入工作。讀取以 Data_p 為住址變數內容存入HWREG_p 為住址暫存器
變數:
HWREG_p:硬體暫存器位址。
Bytes:暫存器位元組數
Data_p:提供寫入值的變數位址。
前置動作:引入巨集定義檔bits_op.h
註:To do a 16-bit write, the high byte must be written before the low byte. (因為這是8位元機器,寫入時,要先把高位元會存入TEMP,到寫低位元時自動一齊寫入)
MCU的每一週邊硬體的使用,一般都可分為兩個階段,第一階段是執行週邊硬體的工作模式設定,完成設定後隨才可執行第二階段工作亦即控制硬體執行訊號輸出入。不論是設定週邊硬體工作模,或是操控它執行輸出入,都可以視為一個動作ACTION。
設定或輸出的每一個動作ACTION都可以用呼叫REGPUT()寫入暫存器來達成。而且對應於每個動作,快查表會提供一組固定參數,包括硬體暫存器位址HWREG_p,位元組數Bytes,以及準備寫入值Data_p內容的規則提示。
C4M-OS參考MCU使用手冊,針對每一種MCU的硬體週邊,整理出它所允許的設定及操作動作,找出每一動動作對應的固定參數及與寫入值內容決定提示,整理成一份設定快查表,以及一份操作快查表。以供使用者快速查詢使用。
以下為數位輸出入埠相關的設定及操作參數快查表:
DIO硬體設定暫存器參數快查表 (呼叫REGPUT()/DIO_put()執行)
表格中,Action行以下為各式設定動作,HWREG_p行以下為同列設定動作應寫入暫存器的指標值,Bytes行以下為同列設定動作應寫入暫存器的位元組數,*Data_p 行以下為同列設定動作之設定值建構原則說明。Field 行以下郥是保留給同列設定動作,設定值結構體的欄位名稱,未來有機會會有詳細說明。
DIO硬體控制操作參數快查表 (呼叫REGPUT()/DIO_put()執行)
表格中,Action行,HWREG_p行,Bytes行,*Data_p行均與設定快查表義意相同,操作動作無需Field 行。
範例:
假如我們希望由平行埠C的8支接腳中偶數接腳輸出5V,奇數接腳輸出0V。
• 硬體設定:首先要設定平行埠C為全數輸出,這涉及DIO設定,可以查找DIO硬體設定暫存器參數快查表。動作是要設定PORTn埠輸出入方向,其右邊HWREG_p行又可分割為&DDRA...&DDRF等不同列。由於我們是要使用平行埠C因此選用&DDRC。Bytes欄唯一選擇為1。依據*Data_p欄的指示,我們要設定全體位元都是輸出,因此提供此數據的變數的所有位元均應為1。
uint8_t AllOut=0xFF;
REGPUT(&DDRC,1,&AllOut);
• 輸出操作:查找DIO硬體控制操作參數快查表,要由平行埠C 輸出,故HWREG_p欄可選用&PORTC,Bytes欄唯一選擇為1。依據*Data_p欄說明,對偶位元輸出HI →1,奇位元輸出Lo→ 0,變數應為OutData=0x66=0b1010 1010,再取用這個變數的指標, &OutData做為呼叫參數。
uint8_t OutData=0x66;
REGPUT(&PORTC,1,&OutData);