簡體   English   中英

將變量轉換為與 Ada 中的另一個變量相同的類型

[英]Casting a Variable to the same type as another variable in Ada

我有一個為幾個不同的目標構建的代碼庫,每個目標都有自己的一組寄存器定義。 對於給定的目標,有一個寄存器定義文件,它將像這樣定義寄存器內容:

type Register1 is record
   field1 : U7;
   field2 : U8;
end record;

U7U8類型只是 Unsigned 類型,定義如下:

type U7 is mod 2 ** 7 with Size => 7;
type U8 is mod 2 ** 8 with Size => 8;
...

在我的驅動程序中,我有一個 Register_Write function,它將 Register1 作為參數。 我試過這樣稱呼它:

field1_val: U32:= 1;
field2_val: U32:= 2;
...
Register_Write( Register1'(field1 => field1_val, field2 => field2_val ));

但這不起作用,我收到錯誤expected type "U7", found type "U32" 問題是我不能只將 field1_val 設為 U7,因為該字段的類型對於不同的目標是不同的。 例如,在某些目標上可能是 U7,在某些目標上可能是 U6 等。

當我創建 Register1 記錄時,有沒有一種方法可以說“將 field1_val 轉換為 field1 的類型”?

我將向您展示兩種方法,一種是我推薦的,一種是我不推薦的。 我將使用 Ada 術語“組件”而不是“字段”,並使用“轉換”而不是“轉換”。

我不推薦的方法,但這是對你的問題的更直接的回答,是使用 'Pos 屬性將值轉換為通用整數,然后與記錄組件具有的任何類型兼容,假設它是 integer 類型。 在你的例子中:

Register_Write( Register1'(
   field1 => U32'Pos(field1_val),
   field2 => U32'Pos(field2_val)));

我不推薦這種方法有兩個原因:首先,因為它繞過了強類型,其次,因為它只有在組件類型是 integer 時才有效。我發現我的 HW 寄存器組件經常有枚舉類型,然后該方法沒有工作。

我推薦的方法是在聲明寄存器記錄類型的同一位置(同一包)聲明組件類型的名稱——大概是一個 package 具有特定於目標的變體。 這遵循了 Ada 哲學,即使用有意義的類型名稱來表示 model 應用程序語義,而不是對 7 位組件使用像 U7 這樣的通用類型,無論該組件的含義如何。 例如(這里的類型名稱當然意義不大,因為我不知道寄存器或其組件的真正含義):

type Reg1_Command   is mod 2**7 with Size => 7;
type Reg1_Parameter is mod 2**8 with Size => 8;
type Register1 is record
   Command   : Reg1_Command;
   Parameter : Reg1_Parameter;
end record;

然后你可以使用這些組件類型名稱作為值,你不需要任何類型轉換:

Command_Val   : Reg1_Command   := 1;
Parameter_Val : Reg1_Parameter := 2;

Register_Write(Register1'(
   Command   => Command_Val,
   Parameter => Parameter_Val));

如果願意,您可以通過從通用類型派生來縮短一些組件類型聲明:

type Reg1_Command is new U7;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM