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
also in C macht man das mit dem Stichwort "absolute"
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.
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?
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?
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?
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.
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.