【发布时间】:2019-10-21 19:49:58
【问题描述】:
请考虑以下实验性 Ada 程序,它尝试创建具有明确定义的位域的 32 位记录,创建一个并将其输出到文件流...
with System;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Streams.Stream_Io; use Ada.Streams.Stream_Io;
procedure Main is
type Bit is mod (2 ** 1);
type Opcode_Number is mod (2 ** 4);
type Condition_Number is mod (2 ** 4);
type Operand is mod (2 ** 9);
type RAM_Register is
record
Opcode : Opcode_Number;
Z : Bit;
C : Bit;
R : Bit;
I : Bit;
Cond : Condition_Number;
Rsvd_1 : Bit;
Rsvd_2 : Bit;
Dest : Operand;
Src : Operand;
end record;
for RAM_Register use
record
Opcode at 0 range 28 .. 31;
Z at 0 range 27 .. 27;
C at 0 range 26 .. 26;
R at 0 range 25 .. 25;
I at 0 range 24 .. 24;
Cond at 0 range 20 .. 23;
Rsvd_1 at 0 range 19 .. 19;
Rsvd_2 at 0 range 18 .. 18;
Dest at 0 range 9 .. 17;
Src at 0 range 0 .. 8;
end record;
for RAM_Register'Size use 32;
for RAM_Register'Bit_Order use System.High_Order_First;
-- ADA 2012 language reference 'full_type_declaration'
-- (page 758, margin number 8/3) for RAM_Register
pragma Atomic (RAM_Register);
-- 3 2 1 0
-- 10987654321098765432109876543210
-- OOOOzcriCONDrrDDDDDDDDDsssssssss
X : RAM_Register := (2#1000#,
2#1#,
2#1#,
2#1#,
2#1#,
2#1000#,
2#1#,
2#1#,
2#100000001#,
2#100000001#);
The_File : Ada.Streams.Stream_IO.File_Type;
The_Stream : Ada.Streams.Stream_IO.Stream_Access;
begin
begin
Open (The_File, Out_File, "test.dat");
exception
when others =>
Create (The_File, Out_File, "test.dat");
end;
The_Stream := Stream (The_File);
RAM_Register'Write (The_Stream, X);
Close (The_File);
end Main;
我使用这里的信息:https://rosettacode.org/wiki/Object_serialization#Ada 和这里:https://en.wikibooks.org/wiki/Ada_Programming/Attributes/%27Bit_Order(最后一个示例)来创建上述内容。
运行代码并使用 xxd -g1 test.dat 检查输出会得到以下 12 个字节的输出...
00000000: 08 01 01 01 01 08 01 01 01 01 01 01 ............
问题:
如何在观察所有位域位置的情况下将这个 32 位记录以 32 位的形式写入或读取流?想象一下,我正在与 RS-232 端口上的微控制器通信,每个位都需要在正确的时间准确地出现在正确的位置。语法for RAM_Register use record... 似乎对'Write 的输出排列方式没有影响。
如果我确实提供了自己的 'Read 和 'Write 实现,那是否直接与“for RAM_Register 使用记录...”代码相矛盾?
【问题讨论】:
-
您可以合法地制作自己的流属性,这些属性可以在线上转换为 XML 或从 XML 转换。 rep 子句定义了寄存器/存储中的布局,如果您想通过网络发送它,您应该这样做(在较低级别进行未经检查的转换)。 Ada 流是一个更高级别的结构。
标签: stream record ada bit-fields