[英]Writing to a register which may or may not exist in Ada
我有一個驅動程序,其代碼庫是為多個目標構建的,每個目標都有自己的 Registers.ads,它定義了該目標的寄存器集。 驅動程序需要寫入寄存器,該寄存器可能存在也可能不存在於 Registers.ads 中(取決於配置)。
在 C 中,我會做這樣的事情:
#ifdef REG1
reg_write(REG1, 0x1234);
#endif
但是在 Ada 中,沒有預處理器,我不能用常規的 if 語句來做到這一點:
if REG1_EXISTS then
reg_write(REG1, 0x1234);
end if;
這無法在沒有寄存器的目標上編譯,因為 REG1 是未定義的符號。
有什么方法可以實現與 C 代碼類似的行為嗎? 理論上我可以創建一個具有 write_reg1 function 和 select 的多個實現的 HAL,其中一個是根據目標編譯的,但我想避免這種情況,因為有很多這樣的寄存器,它會使代碼混亂。
如果 REG1 在特定目標中不存在,您仍然可以聲明一個具有正確類型的虛擬符號 REG1,只要您還將 REG1_EXISTS 聲明為 False,或者有一些保留值“No_Register”可以讓您這樣做
if REG1 /= No_Register then
reg_write(REG1, ...)
end if;
如果這樣的寄存器寫入非常普遍,您可以通過在 reg_write 操作中嵌入對 No_Register 的檢查來減少條件語句的數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.