www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Datenwort an feste Speicheradresse bereits beim Programmieren schreiben


Autor: Jürgen F. (funksoulbrother)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin mir nicht ganz sicher, ob ich im richtigen Bereich des Forums 
bin aber das werde ich ja dann sehen.

Folgendes Problem. Es soll ein fester Wert (bspw. 0x0000) an eine 
bestimmte Speicheradresse geschrieben werden. Dies soll nicht erst zur 
Laufzeit passieren, sondern bereits beim Programmieren des Controllers. 
Damit soll später überprüft werden, ob ein Speicherbereich korrekt 
beschrieben wurde. Wie kann man das anstellen? Sollte soetwas bereis im 
Header definiert werden?
Bspw. so:

#define TEST              (*((uword volatile *) 0xA0005018))
TEST = 0x0000;

Denn das funktioniert bei mir nicht. Wenn ich es in der .c-Datei mache 
dann wird es ja erst zur Laufzeit ausgeführt und das möchte ich nicht.
Hintergrund ist ein mehrteiliger Bootloader der die einzelnen Teile 
darauf überprüft, ob sie korrekt übertragen wurden.

Danke für die Hilfe

Falls das noch wichtig ist: Ich verwende einen Tricore TC1797 und das 
Tasking VX Toolset v3.4r1

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also in C macht man das mit dem Stichwort "absolute"

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieses Verhalten ist nicht in C definiert. Jeder Compiler macht es 
anders. Mache haben dafür ein #pragma .... . Anderen wollen es im 
Assembler definiert haben.

Bitte schau in die Doku deines Compilers.

Autor: Jürgen F. (funksoulbrother)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

danke für die schnelle Antwort. Leider hilft mir das nicht viel weiter. 
Wenn ich nach absolute suche finde ich immer nur die Funktion, welche 
den absoluten Betrag einer Zahl berechnet.
Könntest du mir ein kleines Beispiel geben, wie du meinst, dass das 
aussehen müsste?

Generiert der Compiler dann den Code so, dass ich an beliebigen Stellen 
im Speicher meinen Wert habe und der Maschinencode dann "drumherum" 
liegt?

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen Flierl schrieb:
> Generiert der Compiler dann den Code so, dass ich an beliebigen Stellen
> im Speicher meinen Wert habe und der Maschinencode dann "drumherum"
> liegt?

Nein.

Beschreib mal was Du eigentlich erreichen willst und welche Plattform du 
verwendest?

Autor: Jürgen F. (funksoulbrother)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, die Sache ist folgende:
Meine Aufgabe ist eine Codeportierung eines Projekts von TC1775b auf 
TC1797. Hierfür gibt es einen Bootloader und eine Applikation.

Der Bootloader ist in 3 Teile aufgeteilt. Ein Loader, ein 1st Level 
Bootloader und ein 2nd Level Bootloader.

Der Bootloader führt einige Initialisierungen durch und lädt sich nach 
und nach. Also zuerst Loader danach 1st und danach 2nd Level Bootloader.
Danach kann über CAN entweder ein neuer Loader oder eine neue 
Applikation geladen werden.

Nun ist es so, dass während dieser Übertragung fehler passieren könnten. 
Aus diesem Grund wird der 1st und der 2nd level Bootloader jeweils 2x 
geschrieben. Beim Neustart überprüft dann der Loader, ob für den 
Bootloader (1.) ein bestimmtes Wort an einem Bestimmten Speicher steht 
und entscheidet dadurch, ob die vorherige Übertragung korrekt war.

Und ich möchte nun, dass an dieser bestimmten Stelle das bestimmte Wort 
steht. Der Quellcode den ich zur Verfügung gestellt bekommen habe wurde 
noch mit Tasking EDE (2.2 oder so) erstellt und ich habe nun die 
Projekte in Tasking 3.3 portiert. Nun werden aber mittlerweile keine 
cstart.asm-Files sondern cstart.c Files erzeugt. Damals hat aber 
anscheinend der Entwickler durch

...
;
;       place the checksum table directly after the boot word
;
        .align 4
_bootloader_checksum:
;       checksum second level bootloader
        .word   0x0000
        .word   0x0000
;       checksum application
        .word   0x0000
        .word   0x0000
...
das gewünschte erreicht

Ich möchte nun aber auf die cstart.c Files umsteigen und diese 
zusätzlich so wenig wie möglich anfassen. Damit soll evtl. später eine 
weitere Codeportierung leichter werden. Ich würde also gerne bspw. in 
der main.h das gleiche erreichen.

Ist das möglich?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen Flierl schrieb:
> Nun ist es so, dass während dieser Übertragung fehler passieren könnten.
> Aus diesem Grund wird der 1st und der 2nd level Bootloader jeweils 2x
> geschrieben. Beim Neustart überprüft dann der Loader, ob für den
> Bootloader (1.) ein bestimmtes Wort an einem Bestimmten Speicher steht
> und entscheidet dadurch, ob die vorherige Übertragung korrekt war.

und warum nicht ein CRC von den bootloader mit übertragen? An einem byte 
kann man ja eh nicht sinnvoll erkennen ob alles richtig ist.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich ja. Aber ich kenne Tasking nicht.

Schau dir cstart.c an ob sowas änliches enthalten ist.
Es werden vielleicht keine Startdateien mehr in Assembler erzeugt, 
verarbeiten kann die IDE sie aber sicherlich noch.

Schau in deine Doku, Stichwort: #pragma

Autor: Jürgen F. (funksoulbrother)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter: Da gebe ich dir recht. Das ist dann im 2nd level Bootloader der 
Fall. Für den 1. wird nur überprüft, ob das Wort eben so ist, oder 
nicht. Aber hier geht es nur ums Prinzip und nicht darum ob das "WAS" 
ich machen will/soll sinn macht.
Ich möchte einfach nur wissen, "WIE" es geht.

@Volker: Auch dir danke für die Hilfe. Ich werde in die Compiler Infos 
kucken. Mal schaun, ob ich bei #pragma was finde.

Aber es gibt also definitiv keine Möglichkeit vorher in C festzulegen, 
dass an Addresse xy Wort xy dann im fertigen .hex file steht und das 
dann bei der Programmierung übertragen wird - schade :-(.

Trotzdem danke für eure Hilfe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.