avr_save und avr_restore

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

avr_save und avr_restore

Beitrag von Mathias »

Stimmt dies, das man mit avr_save, zB. das Carry auslesen kann ?
Etwa so wie im folgenden Beispiel:

Code: Alles auswählen

{$H-,J-,O-}

uses
  intrinsics;
var
  b1, b2, b3:Byte;

begin
  // Setup
  b1 := 255;
  b2 := 10;
  b3 := b1 + b2; // Diese Rechnung überläuft.
  if avr_save and %00000001 > 0 then begin
    // Es ist überlaufen !!
  end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: avr_save und avr_restore

Beitrag von Maik81SE »

Moin Mathias,

Über selbige Funktionen bin ich durch ein anderes Tool gestolpert. :D
Wenn ich mir jedoch mal die

Code: Alles auswählen

uses
  intrinsics;
genauer anschaue und meinen Logischen Verstand einschalte, gehe ich mal Stark davon aus.
Eine Entsprechende Doku habe ich leider aber auch noch nicht gefunden.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

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

Re: avr_save und avr_restore

Beitrag von Mathias »

Das Beste wird wohl sein, bei Gelegenheit es direkt bei einem Arduino aus zu probieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: avr_save und avr_restore

Beitrag von kupferstecher »

In der Unit "Intrinsics" steht, dass auch noch der globale Interrupt deaktiviert würde.

Das SREG ist doch als Variable definiert, sollte also direkt im Code abrufbar sein?

Code: Alles auswählen

b3 := b1 + b2;
tSREG:= SREG;
if tSREG and %00000001 > 0 then //Carry set
Das tSREG nur sicherheitshalber.

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

Re: avr_save und avr_restore

Beitrag von Mathias »

Ich habe es gerade probiert, die Überlaufprüfung funktioniert. 👍

Code: Alles auswählen

  procedure Calc(b0, b1: Byte);
  var
    b2: Byte;
  begin
    b2 := b1 + b0;
    if avr_save and %00000001 > 0 then begin
//    if SREG and %00000001 > 0 then begin
      UARTSendString('Überlauf');
    end else begin
      UARTSendString('Kein Überlauf');
    end;
    UARTSendString(#13#10);
  end;

begin
  UARTInit;
  UARTSendString(#13#10);
  Calc(1, 1);
  Calc(128, 128);
  Calc(255, 255);
  Calc(127, 128);
  Calc(1, 1);  
Ich habe auch direkt SREG probiert, auch damit geht es.
So nebenbei, was macht die Funktion avr_save für einen Sinn ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: avr_save und avr_restore

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 8. Sep 2021, 16:17
So nebenbei, was macht die Funktion avr_save für einen Sinn ?
avr_save ist das äquivalent zu

Code: Alles auswählen

x := SREG;
avr_cli;
Da dies anscheinend eine gängige Sequenz ist, rentiert es sich dafür ein Intrinsic zu machen. Und avr_restore setzt dann zwar einfach nur SREG, aber dafür hat man dann ein Gegenstück zu avr_save.
FPC Compiler Entwickler

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

Re: avr_save und avr_restore

Beitrag von Mathias »

Da wird noch ein cli ausgeführt ?
Hast du dies irgendwo in den Sourcen gefunden ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: avr_save und avr_restore

Beitrag von PascalDragon »

Mathias hat geschrieben:
Do 9. Sep 2021, 13:23
Da wird noch ein cli ausgeführt ?
Hast du dies irgendwo in den Sourcen gefunden ?
Das steht erstens als Kommentar über der Funktion:

Code: Alles auswählen

    { Reads SREG and then disables interrupts, returns contents of SREG }
    function avr_save: byte;[INTERNPROC: in_avr_save];
Und zweitens ist das genau das, was der Compiler für dieses Intrinsic generiert:

Code: Alles auswählen

          in_avr_save:
            begin
              location_reset(location,LOC_CREGISTER,OS_8);
              location.register:=cg.getintregister(current_asmdata.CurrAsmList,OS_8);

              current_asmdata.CurrAsmList.concat(taicpu.op_reg_const(A_IN, location.register, NIO_SREG));
              current_asmdata.CurrAsmList.concat(taicpu.op_none(A_CLI));
            end;
FPC Compiler Entwickler

Antworten