繁体   English   中英

写入 Ada 中可能存在或不存在的寄存器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM