AVR - Strings direkt aus Flash lesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR - Strings direkt aus Flash lesen

Beitrag von Mathias »

Ich habe nochmals einen Anlauf mit folgendem Code probiert.

Code: Alles auswählen

program Project1;
var
    es: ShortString = 'Ich liebe Lazarus  !'; section '.eeprom';
//  es: ShortString = 'Ich liebe Lazarus !';

begin
  repeat
    PORTB := byte(es[2]);
  until False;
end.       
Kompiliert wird es anstandslos, aber avrdude hat Mühe es hoch zu laden.

Code: Alles auswählen

Projekt kompilieren, OS: embedded, CPU: avr, Ziel: Project1.elf: Erfolg, Hinweise: 2
Hint: Start of reading config file /home/tux/fpcupdeluxe_avr5/fpc/bin/x86_64-linux/fpc.cfg
Hint: End of reading config file /home/tux/fpcupdeluxe_avr5/fpc/bin/x86_64-linux/fpc.cfg
Projekt: Ausführen des Befehls nach: Exit code 1

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "Project1.hex"
avrdude: ERROR: address 0x810010 out of range at line 13 of Project1.hex
avrdude: read from file 'Project1.hex' failed

avrdude done.  Thank you.
avrdude wird folgendermassen ausgerufen:

Code: Alles auswählen

avrdude -patmega328p -cusbasp -D -Uflash:w:Project1.hex:i
-D Hat keinen Einfluss.

Nehme ich das section '.eeprom'; raus, wird anstandslos hochgeladen.


Nachtrag:
Durch dieses Problem hier: viewtopic.php?f=9&t=12985&p=115077#p115077 habe ich noch folgende Infos vom Compiler.
Probiert am ATtiny2313.
Mit .eeprom:

Code: Alles auswählen

Error: /home/tux/fpcupdeluxe_avr25/cross/bin/avr-embedded/avr-ld: /n4800/DATEN/Programmierung/Lazarus/Tutorials/Embedded/AVR/ATtiny2313/EEPROM_String_Test/Project1.elf section `.eeprom' will not fit in region `eeprom'
Ohne .eeprom:

Code: Alles auswählen

Error: /home/tux/fpcupdeluxe_avr25/cross/bin/avr-embedded/avr-ld: /n4800/DATEN/Programmierung/Lazarus/Tutorials/Embedded/AVR/ATtiny2313/EEPROM_String_Test/Project1.elf section `.data' will not fit in region `data'
Etwas ungültiges:

Code: Alles auswählen

Error: /home/tux/fpcupdeluxe_avr25/cross/bin/avr-embedded/avr-ld: /n4800/DATEN/Programmierung/Lazarus/Tutorials/Embedded/AVR/ATtiny2313/EEPROM_String_Test/Project1.elf section `.test' will not fit in region `data'
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1110
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: AVR - Strings direkt aus Flash lesen

Beitrag von Timm Thaler »

Wie sieht denn der erzeugte ASM-Code aus? (Compiler-Option -l und dann die *.s-Dateien ansehen)

Wäre ja schön, wenn der Compiler Zugriff auf Eeprom und Flash kann, aber dazu müßte er erkennen, dass er das unterschiedlich behandeln muss. Technisch geht das aber, der GCC kann das schon lange.

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

Re: AVR - Strings direkt aus Flash lesen

Beitrag von Mathias »

Timm Thaler hat geschrieben:
Mi 10. Jun 2020, 22:13
Wie sieht denn der erzeugte ASM-Code aus? (Compiler-Option -l und dann die *.s-Dateien ansehen.
Meinst du beim Versuch mit dem Atmega328 ?
Beim Attiny2313 hat ja schon der Compiler versagt.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1110
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: AVR - Strings direkt aus Flash lesen

Beitrag von Timm Thaler »

Die Frage zum ATtiny2313 hattest Du vor ein paar Monaten schonmal selbst beantwortet:

Man muss den Shortstring auf die reale Stringlänge begrenzen. Sonst nimmt der Compiler 255 als Standard - und die passen weder in den EEPROM noch in den Datenbereich des SRAM. (Der Datenbereich ist kleiner als der reale RAM, weil noch Stack davon abgeht.)

Bei mir sieht so eine Definition dann so aus:

Code: Alles auswählen

  Smenu11 : string[32] = 'Set Radio ---sec' +
                         'Ch ---  Ad -----'; section '.progmem';
  Smenu12 : string[32] = 'Set Zeit   --:--' +
                         '                '; section '.progmem';
Allerdings speichere ich fixe Strings im Flash, weil a) der Zugriff darauf einfacher ist b) genug davon da ist und c) ich die während der Laufzeit nicht ändere.

Timm Thaler
Beiträge: 1110
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: AVR - Strings direkt aus Flash lesen

Beitrag von Timm Thaler »

Dass hier kopiert einen ShortString aus dem Flash in den Ram. An der ersten Pos im String steht die Länge. Ein String mit [32] hat also 32 Zeichen, aber braucht 33 Byte Speicher.

Code: Alles auswählen

// String aus Flash in Buffer schreiben

procedure copy_pgm_string(psrc, pto : pchar); assembler; nostackframe;
// Rein: r22, r23, r24, r25 Pointer
label
  loop;
asm
  push r31  // Register sichern
  push r30
  push r27
  push r26
  push r16
  push r0

  mov r26, r22  // Pointer Ziel Sram
  mov r27, r23
  mov r30, r24   // Pointer Quelle Flash
  mov r31, r25
  lpm r0, Z+  // Länge holen
  st X+, r0  // Länge in Sram
  mov r16, r0  // Länge in Schleifenzähler
  loop:
  lpm r0, Z+  // Zeichen holen
  st X+, r0  // Zeichen in Sram
  dec r16
  brne loop

  pop r0  // Register wiederherstellen
  pop r16
  pop r26
  pop r27
  pop r30
  pop r31
end[];         
Der Aufruf erfolgt mit Übergabe der Adressen von Quelle und Ziel:

Code: Alles auswählen

  dispbuf : string [32];  // Displaybuffer 32 Zeichen
...
  copy_pgm_string(@Smenu11, @dispbuf);

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

Re: AVR - Strings direkt aus Flash lesen

Beitrag von Mathias »

Wie sieht denn der erzeugte ASM-Code aus? (Compiler-Option -l und dann die *.s-Dateien ansehen.
Ich wollte dies probieren, aber irgendwie hat der Parameter "-al" keinen Einfluss, es wird keine *.s erzeugt. :roll:
Hat das einen Zusammenhang, da ich eine sehr neue Trunk verwende ?

Vor längerer Zeit konnte ich nach ASM-Dateien erzeugen.

Nachtrag:
Jetzt habe ich es gefunden, die Datei ist unter "/tmp".

Im Anhang die *.s und eine Datei, welche die Differenz zeigt.
Wie schon mal gesagt, die Version mit .eeprom, kann ich mit AVRdude nicht hochladen.
Dateianhänge
asm.zip
(2.52 KiB) 32-mal heruntergeladen
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

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

Re: AVR - Strings direkt aus Flash lesen

Beitrag von Mathias »

Ich bin per Zufall auf folgende FPC-Option gestossen: -k-Ttext=0x00080000
Wen ich dort den Wert 0x0000000 eintrage, bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

...
Error: /home/tux/fpcupdeluxe_stm32/cross/bin/arm-embedded/arm-none-eabi-ld: address 0x368 of /n4800/DATEN/Programmierung/Lazarus/Tutorials/Embedded/ARM/Arduino_DUE/Blink_Pin13/Project1.elf section `.text' is not within region `flash'
Error: /home/tux/fpcupdeluxe_stm32/cross/bin/arm-embedded/arm-none-eabi-ld: /n4800/DATEN/Programmierung/Lazarus/Tutorials/Embedded/ARM/Arduino_DUE/Blink_Pin13/Project1.elf section `.data' will not fit in region `flash'
Error: /home/tux/fpcupdeluxe_stm32/cross/bin/arm-embedded/arm-none-eabi-ld: address 0x368 of /n4800/DATEN/Programmierung/Lazarus/Tutorials/Embedded/ARM/Arduino_DUE/Blink_Pin13/Project1.elf section `.text' is not within region `flash'
Error: /home/tux/fpcupdeluxe_stm32/cross/bin/arm-embedded/arm-none-eabi-ld: region `flash' overflowed by -785452 bytes
Project1.pas(49,0) Error: Error while linking
Dort stehen auch .xxx Werte. Könnte das evtl. mit "section" zusammenhängen ?

Das Ganze nur zur Info, vielleicht kann man diesen "-k...." Parameter für die Strings im EEPROM gebrauchen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten