Bitpacked Record Bit-Abfrage

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bitpacked Record Bit-Abfrage

Beitrag von Winni »

Hi!

Ja, darüber hab ich mich auch schon geärgert.

Diese ganze bitpacked implementation ist ein Sensibelchen.
Ich weiss nicht mehr, wo das dokumentiert ist, aber wenn Du die Record-Elemente
auseinanderziehst und einzeln als bitpacked deklarierst. dann geht es.
Gerade getestet:

Code: Alles auswählen

type
  Tbits = bitpacked Record
           bit0: boolean;
           bit1: boolean;
           bit2: boolean;
           bit3: boolean;
           bit4: boolean;
           bit5: boolean;
           bit6: boolean;
           bit7: boolean;
         end;
 
 
  TioSTAT0 = bitpacked record
    case byte of
      0: (STAT0: byte);
      1: (bits: TBits);
      end;               
 
 


So hast Du jetzt bei den bits in TioSTAT0 zweimal bitpacked drin, aber anscheinend ist das notwendig.
Frag mich bitte nicht nach der Logik .....

Oder Du benutzt UCSD Pascal von 1979: Da war das default .....

Winni

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitpacked Record Bit-Abfrage

Beitrag von Mathias »

Gerade getestet:

Bei mit geht auch dies nicht.

Dies ist nur eine andere Schreibweise von:

Code: Alles auswählen

type
  TioSTAT0 = bitpacked record
    case byte of
      0: (STAT0: byte);
      1: (bits: bitpacked record
          bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7: boolean
        end;);
  end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitpacked Record Bit-Abfrage

Beitrag von Mathias »

Unter dem Strich wurde das Problem erkannt, daher funktioniert es in der 3.2 von FPC.
Da würde ich mich mit den alten FPC nicht mehr rumschlagen. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bitpacked Record Bit-Abfrage

Beitrag von Winni »

Hi!

Was fährst Du denn für ne Version?

Bei mir funktioniert das mit fpc 3.04 - nix trunc.

Winni

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Bitpacked Record Bit-Abfrage

Beitrag von siro »

Ich habe mir auf dem PC grad mal den Assembler Code angesehen,
egal welches Bit ich mit "NOT" benutze, es ist immer der gleiche Programmcode.
Ohne dem "NOT" wird das entsprechende Bit aber richtig ausmaskiert bzw. geschoben.

Bitpacked_NOT_bit_4.jpg
Bitpacked_NOT_bit_4.jpg (69.72 KiB) 2064 mal betrachtet

Bitpacked_NOT_bit_7.jpg
Bitpacked_NOT_bit_7.jpg (73.49 KiB) 2064 mal betrachtet


FPC 3.0.4

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitpacked Record Bit-Abfrage

Beitrag von Mathias »

Was fährst Du denn für ne Version?
3.0.4
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bitpacked Record Bit-Abfrage

Beitrag von Winni »

Hmmm

Rätsel, Rätsel ....

Ich bin auf Linux 64Bit (Suse Tumbeweed)

Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Bitpacked Record Bit-Abfrage

Beitrag von sstvmaster »

Ist das dann der selbe Fehler? -> https://bugs.freepascal.org/view.php?id=33780
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Bitpacked Record Bit-Abfrage

Beitrag von Timm Thaler »

Ich setze das für AVR embedded schon einige Zeit recht erfolgreich ein:

Code: Alles auswählen

  Tflags = bitpacked record  // Flags allgemein
    case byte of
      0 : (urtc, umin, uhour, uday, f16msec, f64msec, bit6, mauto : boolean);
      1 : (all : uint8);
  end;


Allerdings mit FPC 3.2.

HobbyProgrammer
Beiträge: 166
Registriert: Di 29. Okt 2019, 12:51
Wohnort: Deutschland , Baden-Württemberg

Re: Bitpacked Record Bit-Abfrage

Beitrag von HobbyProgrammer »

Guten Morgen,

vielen Dank für die sehr interessanten Analysen und Vorschläge.
Ich habe entschieden, das ich den FPC nicht updaten werde, sondern das Projekt dahingehend ändere das es auf dem 3.0.4 und als Fallback dann evtl. auch
auf älteren FPC Versionen kompiliert und funktioniert.

Als Workaround ist die Lösung von Mathias für mich die einfachste. Denn anstatt

Code: Alles auswählen

 
type
TioSTAT0 = bitpacked record  // ASCI-Channel 0 Status
            case byte of
                0: (STAT0: byte);       // 8Bit Register Data
                1: (bitTIE: boolean;    // Transmit Interrupt Enable
                    bitTDRE: boolean;   // Transmit Data Register Empty
                    bitDCD0: boolean;   // Data Carrier Detect
                    bitRIE: boolean;    // Receive Interrupt Enable
                    bitFE: boolean;     // Framing Error
                    bitPE: boolean;     // Parity Error
                    bitOVRN: boolean;   // Overrun Error
                    bitRDRF: boolean)// Receive Data Register Full
        end;
 
var
ioSTAT0: TioSTAT0;     // ASCI-Channel 0 Status
 
..
..
 
ioSTAT0.bitRDRF := true
 
oder
 
if(ioSTAT0.bitTDRE) then begin
 


muß bei der Vorgeschlagenen Lösung nicht allzuviel angepasst werden:

Code: Alles auswählen

 
type
    TioSTAT0 = bitpacked record  // ASCI-Channel 0 Status
            case byte of
                0: (STAT0: byte);       // 8Bit Register Data
                1: (bit: bitpacked array [0..7] of boolean); // Boolean Bit Data
            end;
 
var
    ioSTAT0: TioSTAT0;     // ASCI-Channel 0 Status
 
const
    TIE = 0;       // Transmit Interrupt Enable
    TDRE = 1;      // Transmit Data Register Empty
    DCD0 = 2;      // Data Carrier Detect
    RIE = 3;       // Receive Interrupt Enable
    FE = 4;        // Framing Error
    PE = 5;        // Parity Error
    OVRN = 6;      // Overrun Error
    RDRF = 7;      // Receive Data Register Full
 
..
..
 
ioSTAT0.bit[RDRF] := true
 
oder
 
if(ioSTAT0.bit[TDRE]) then begin
 


Da es in dem Projekt mehrere Solcher Bitregister gibt kann ich somit auch für alle einen einzigen Datentyp erstellen und die Bitadressen über weitere
Constanten angeben.

Ich wünsche euch allen schöne Ostern und vielen Dank für die Unterstützung.

Grüße
HobbyProgrammer
Host: Core i7-12700H, NVIDIA RTX3050 6GB, 32GB Ram, 1TB NVME SSD mit KUbuntu 22.04LTS 64bit , VM KUbuntu 22.04 LTS 64bit mit Lazarus 2.2.6 und Cross-Platform Compiler für Linux 32/64bit und Windows 32/64bit. Wine für erste Tests der Windows Binarys.

Antworten