comp.lang.ada
 help / color / mirror / Atom feed
From: "Nick Roberts" <nick.roberts@acm.org>
Subject: Re: Bitordering? was Re: Bitmanipulation in Ada
Date: Sat, 21 Aug 2004 12:34:46 +0100
Date: 2004-08-21T12:34:46+01:00	[thread overview]
Message-ID: <opsc2yf8zvp4pfvb@bram-2> (raw)
In-Reply-To: 412665C4.E52A7590@alfred-hilscher.de

On Fri, 20 Aug 2004 22:57:40 +0200, Alfred Hilscher  
<SPAM@alfred-hilscher.de> wrote:

> When I declare an boolean array with eight elements 1..8 (e.g. to
> address a hardware port with eight status bits), how are they
> ordered is X(1) the msb or the lsb of the byte?

It is undefined.

The typical way to deal with this kind of situation is to use a
record type with a record representation clause. For example:

    type Frobnosticator_Status is
       record
          Ready, Complete, Motor_On, Fault, Power_Low: Boolean;
       end record;

    for Frobnosticator_Status'Bit_Order use System.Low_Order_First;

    for Frobnosticator_Status use
       record
          Ready     at 0 range 0..0;
          Complete  at 0 range 1..1;
          Motor_On  at 0 range 3..3;
          Fault     at 0 range 6..6;
          Power_Low at 0 range 7..7;
       end record;

    for Frobnosticator_Status'Size use 8;

This lot specifies exactly where each bit is, and what it means.
In this example, I've used representation clauses to tell the
compiler to consider the LSB to be bit number 0 for this record,
and to tell it that the record is 8 bits in size. I've associated
a specific bit with each Boolean component (bits 2, 4, and 5 are
unused).

If I declare:

    Status: Frobnosticator_Status;
    for Status'Address use Frob_1_Status_Address;
    pragma Volatile(Status);

to map the variable 'Status' to frobnosticator number 1's status
port, I can read off its status bits by name:

    if Status.Fault then
       Put_Line( Current_Error, "Frob #1 went down" );
       raise Hardware_Failure;
    end if;
    ...

Does this help you?

-- 
Nick Roberts



  reply	other threads:[~2004-08-21 11:34 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-18 20:37 Bitmanipulation in Ada Bernd Specht
2004-08-18 20:51 ` Ludovic Brenta
2004-08-18 21:10   ` Bernd Specht
2004-08-18 21:16     ` Ludovic Brenta
2004-08-18 21:18     ` Ed Falis
2004-08-19 17:30       ` Bernd Specht
2004-08-19 17:44         ` Ed Falis
2004-08-19  0:53     ` Jeffrey Carter
2004-08-19 17:44       ` Bernd Specht
2004-08-19 18:09         ` Martin Dowie
2004-08-19 18:28           ` Bernd Specht
2004-08-19 19:31             ` Martin Dowie
2004-08-19 20:29             ` Martin Dowie
2004-08-20 21:31               ` Bernd Specht
2004-08-19 19:17         ` Jeffrey Carter
2004-08-19 19:57           ` Björn Persson
2004-08-20  0:52             ` Jeffrey Carter
2004-08-19 21:24         ` Francois G. Dorais
2004-08-20  8:55           ` Pascal Obry
2004-08-20  7:26         ` Jean-Pierre Rosen
2004-08-20 21:20           ` Bernd Specht
2004-08-20 21:39             ` Ed Falis
2004-08-18 21:14 ` (see below)
2004-08-18 21:56   ` Martin Dowie
2004-08-19 15:25     ` (see below)
2004-08-19 15:50       ` Martin Dowie
2004-08-18 21:53 ` Martin Dowie
2004-08-18 22:59   ` Björn Persson
2004-08-19  8:08   ` Egil H. H�vik
2004-08-19 17:46   ` Bernd Specht
2004-08-20 20:57 ` Bitordering? was " Alfred Hilscher
2004-08-21 11:34   ` Nick Roberts [this message]
2004-08-21 14:00     ` Jim Rogers
2004-08-21 16:54       ` Simon Wright
2004-08-21 16:55     ` Georg Bauhaus
2004-08-23 18:36       ` Alfred Hilscher
2004-08-23 18:47     ` Alfred Hilscher
2004-08-23 22:39       ` Nick Roberts
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox