Forum: Mikrocontroller und Digitale Elektronik Inhalt einer progmem variable aus extra Datei


von Thomas (Gast)


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!

von Peter II (Gast)


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/

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Thomas (Gast)


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!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.