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


von Jürgen F. (funksoulbrother)


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

von Lehrmann M. (ubimbo)


Lesenswert?

also in C macht man das mit dem Stichwort "absolute"

von Volker Z. (vza)


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.

von Jürgen F. (funksoulbrother)


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?

von Volker Z. (vza)


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?

von Jürgen F. (funksoulbrother)


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?

von Peter (Gast)


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.

von Volker Z. (vza)


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

von Jürgen F. (funksoulbrother)


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

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.