Arduino DUO läuft fast mit Lazarus.

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

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von siro »

Grade mal gesucht,
ich habe tatsächlich eine sam3x8e.pp gefunden.
Sehr interessant, dort sind die ganzen Register wohl definiert.
und auch die Interrupt Vectoren Tabelle und Nummern wie sie im Speicher abgelegt werden.
So ähnlich (leider in C) sieht es bei meinem LPC1768 Controller von NXP (ebenfalls ein Cortex M3) auch aus.

Was ich etwas vermisse, vieleicht gibt es das ja, sind die Bit Records.
Also wie die Bits in einem Register verteilt sind. Quasi eine Varianten Record.
Hier erledigt der Compiler dann die Ausmaskierung bzw. die Bitschieberei bei Register Zugriffen:

Code: Alles auswählen

typedef unsigned int   U32;  /* 32 Bit without sign */

typedef volatile union
{
  struct
  {
    U32 Revision    :  4;   // [0..3] Revision nunber, the p value in the rnpn product revision identifier 0x0 = r2p0
    U32 PartNo      : 12;   // Part number of the processor: 0x23 = Cortex-M3
    U32 Constant    :  4;   // read as 0x0F
    U32 Variant     :  4;   // Variante number, the r value ist the rnpn product revision identifier
    U32 Implementer :  8;   // Implementer code: 0x41 = ARM
  } bits;
  U32 value;
} CPUID_TypeDef;

#define LPC_CPUID (*(CPUID_TypeDef *)(0xE000ED00))
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Meinst du packedbit, so wie die Beispiele hier. https://wiki.freepascal.org/AVR_Embedde ... _output/de
Siehe 2. Hälfte.

In fpc gibt es zu jedem Controller eine passende, egal ob avr, arm, etc.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

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

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von siro »

Das funktioniert ausgezeichnet, ich danke Dir Mathias:

Hier noch ein LINK dazu:
https://forum.lazarus.freepascal.org/in ... ic=42086.0

Code: Alles auswählen

Type T1Bit = 0..1;
     T2Bit = 0..3;
     T3Bit = 0..7;
     T4Bit = 0..15;
     T5Bit = 0..31;
     T6Bit = 0..63;
     T7Bit = 0..127;
     T8Bit = 0..255;
     T9Bit = 0..511;
     T10Bit = 0..1023;
     T11Bit = 0..2047;
     T12Bit = 0..4095;
//....usw.


Type CPUID_TypeDef = bitpacked record
  case boolean of
  true: (
    Revision    :  T4Bit;   // [0..3] Revision nunber, the p value in the rnpn product revision identifier 0x0 = r2p0
    PartNo      :  T12Bit;  // Part number of the processor: 0x23 = Cortex-M3
    Constant    :  T4Bit;   // read as 0x0F
    Variant     :  T4Bit;   // Variante number, the r value ist the rnpn product revision identifier
    Implementer :  T8Bit;   // Implementer code: 0x41 = ARM
    );
  false : ( value:UInt32);  // 32 Bit Wert
end;


// zum Testen habe ich eine Variable angelegt, sonst gibts nen Laufzeitfehler auf dem PC,
// hier darf ich ja nicht auf feste Adressen zugreifen.
var dummy:UInt32;
var LPC_CPUID : CPUID_TypeDef absolute dummy;    // var LPC_CPUID : CPUID_TypeDef absolute $E000ED00;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LPC_CPUID.PartNo:=35;
  caption:=IntToStr(SizeOf(LPC_CPUID));   // ergibt 4, es werden 4 Bytes belegt
  caption:=IntToStr(LPC_CPUID.PartNo);    // ergibt 35, habe ich ja gesetzt
  caption:=IntToStr(LPC_CPUID.value);     // ergibt 560 weil (35 viermal links (Revision hat 4 Bits) schieben = 560)
end;                 
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: Arduino DUO läuft fast mit Lazarus.

Beitrag von Mathias »

Ich habe den BitRecord gerade auf dem Desktop ausprobiert, scheint zu klappen.

Code: Alles auswählen

type
  T1Bit = 0..1;
  T2Bit = 0..3;
  T3Bit = 0..7;
  T4Bit = 0..15;
  TBitInt = bitpacked record
    case byte of
      0: (b3: T3Bit;
        b4: T4Bit;);
      1: (Value: UInt16);
  end;

var
  BitInt: TBitInt;

procedure TForm1.Button1Click(Sender: TObject);
begin
  BitInt.b4 := %1111;
  Repaint;
end;

procedure TForm1.FormPaint(Sender: TObject);
const
  r = 10;
var
  i: integer;
begin
  for i := 0 to 15 do begin
    if BitInt.Value and (1 shl i) = 1 shl i then begin
      Canvas.Brush.Color := clRed;
    end else begin
      Canvas.Brush.Color := clYellow;
    end;
    Canvas.Ellipse((16 - i) * r, r, (16 - i) * r + 10, r * 2);
  end;
end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten