Inhalt einer progmem variable aus extra Datei

Gast #3580487
Lesenswert?
• ▲
▼
Hi Leute,

gibt es die Möglichkeit den Inhalt einer Variable welche im Flash 
gespeichert werden soll aus einer Datei einzulesen?

Es handelt sich bei dem File um ein einfaches Konfigurations-XML-File.

Dieses wird sich zur Laufzeit nicht ändern. Kann also fest beim 
Compilieren in den Code eingehen. Ich möchte einfach weg von:
1
#include <avr/pgmspace.h>
2

3
PROGMEM char xml[] = 
4
{
5
  "<?xml version='1.0'?>"
6
  "<file>"
7
  "  <controler name='B'>"
8
  "    <states>"
9
  "      <b>"
10
  "        <L>0</L>"
11
  "        <M>1</M>"
12
  "        <S>0</S>"
13
  "      </b>"
14
  "    </states>"
15
  "  </controler>"
16
  "</file>"
17
};

Der Inhalt soll möglichst in einer extra XML Datei abgelegt werden, um 
das Hinzufügen der vielen Anführungszeichen zu vermeiden und um 
Änderungen einfach in dem extra File durchzuführen.

Oben gezeigtes XML ist nur ein Beispiel und kann unter Umständen 
wesentlich größer sein!

Schon Mal vielen Dank!
Gast #3580494
Lesenswert?
• ▲
▼
Thomas schrieb:
> gibt es die Möglichkeit den Inhalt einer Variable welche im Flash
> gespeichert werden soll aus einer Datei einzulesen?

ja. Man kann auch ein beliebigen Datei eine object (*.o) erzeugen. Diese 
kann man dann einfach mit linken.

Dafür gab es schon einige Threads hier, konnte auf die schnelle aber 
keine finden.

So in der art müsste es gehen:

http://balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/
#3580946
Lesenswert?
• ▲
▼
Thomas schrieb:

> gibt es die Möglichkeit den Inhalt einer Variable welche im Flash
> gespeichert werden soll aus einer Datei einzulesen?
>
> Es handelt sich bei dem File um ein einfaches Konfigurations-XML-File.
>
> Dieses wird sich zur Laufzeit nicht ändern. Kann also fest beim
> Compilieren in den Code eingehen. Ich möchte einfach weg von:

Natürlich gibt es das.
Dem #include ist es ja egal, was in dem File steht, das includiert wird. 
Ein #include zieht einfach nur den Inhalt der angegebenen Datei an die 
Stelle im Code rein, in der der #include steht

configData.inc
**************
1
"<?xml version='1.0'?>"
2
"<file>"
3
"  <controler name='B'>"
4
"    <states>"
5
"      <b>"
6
"        <L>0</L>"
7
"        <M>1</M>"
8
"        <S>0</S>"
9
"      </b>"
10
"    </states>"
11
"  </controler>"
12
"</file>"

1
#include <avr/pgmspace.h>
2
 
3
PROGMEM char xml[] =
4
{
5
#include "configData.inc"
6
};

> Der Inhalt soll möglichst in einer extra XML Datei abgelegt werden, um
> das Hinzufügen der vielen Anführungszeichen zu vermeiden

Das ist ein Problem.
Denn ein #include entbindet dich ja nicht davon, dass sich in Summe 
gültiges C ergeben muss. Ersetzt du im Kopf die Zeile mit dem #include 
mit dem Inhalt der Datei, dann muss da wieder was richtiges rauskommen.

Allerdings brauchst du die Anführungszeichen nicht per Hand machen. Dazu 
schreibt man sich auf dem PC ein kleines Hilfsprogramm, welches in einer 
Datei Zeile für Zeile liest, die " ergänzt. D.h. Du hast dann 2 externe 
Files

Einmal die Version, wie sie aus deinem Konfigurierprogramm kommt (oder 
woher auch immer). Die ist im Original, also ohne "

Mit Hilfe deines kleines Hilfswerkzeugs erzeugst du daraus die Version 
mit den "

Letztere wird dann vom #include beim compilieren in den Code 
reingezogen.


Noch den ganzen XML-Pimp Schritt samt Abhängigkeiten ins makefile 
eingetragen und du kannst komfortabel deine Konfigurationen aus dem 
Programm exportieren, mit dem du sie erstellst.


Merke: Wir sind Programmierer. Wir sind faul, deshalb sind wir 
Programmierer geworden. Ehe wir etwas mit der Hand machen (wie zb 
dämlich in jede Zeile einer Datei " einfügen), schreiben wir uns lieber 
ein Programm dafür bzw. benutzen zb einen Stream Editor, der das macht.
Gast #3582097
Lesenswert?
• ▲
▼
Super vielen Dank für die Antworten!!!

Meine Lösung

Batchfile "addingQuotes.bat"
1
@echo off &setlocal enabledelayedexpansion
2
set currentPath=%~dp0
3
echo %currentPath%
4

5
set inputFile=%currentPath%%1
6
set targetFile=%currentPath%%2
7
type %testDatei%
8

9
del %targetFile% /s /q
10

11
for /f "delims=" %%i in (%inputFile%) do (
12
  echo "%%i"
13
  echo "%%i" >> %targetFile%
14
)



Ausschnitt/Anpassung im Makefile: (Bei all: wurde addQuotes hinzugefügt
1
XML_FILE = pagingDesc.xml
2

3
# Default target.
4
all: begin gccversion sizebefore addQuotes build sizeafter end
5

6
addQuotes: 
7
  @addingQuotes.bat $(XML_FILE) $(XML_FILE)q


Abschnitt in meinem Programm:
1
PROGMEM char xml[] = 
2
{
3
  #include "MyXmlFile.xmlq"
4
};

Sicherlich noch ausbaufähig!!!

Aber funktioniert einwandfrei!

Vielen DANK!!!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.