Hallo erstmal! Ich sitze hier bei der Arbeit und soll das "Flash Monitor" Programm von Texas Instruments (SLAA341) auf den verbauten MSP430F449 zum Laufen bringen. Das Problem ist, dass das Programm mit dem IAR Compiler gemacht wurde, ich aber den CCE (V3.1) benutzen soll. Ich habe alles mti der kostenlosen Version von IAR zum Laufen bekommen, aber mit dem CCE gibt es da ein paar Probleme...die meisten Sachen habe ich schon CCE konform hinbekommen, aber da sind noch ein paar Probleme offen: 1. Im c-Code des "Hauptprogramms" (monitor_demo_app.c) wird ein Passwort an eine absolute Adresse geschrieben: __root const int Password @ 0xFBDE = 0xdeaf; Im "MSP-FET430 Flash Emulation Tool" (SLAU157G) stehen auf Seite 69 Beispiele, wie man das mit CCE machen kann, dann muss ich allerdings im linker command file was dazu schreiben. Beispiel: im Linker Command File: alpha=0x200; in CCE: extern char alpha; 1.a Ist mit linker command file die Datei lnk_msp430f449.cmd gemeint? 1.b Wenn ja, wo genau muss die Zeile hin? Einfach ans Ende schreiben? 1.c Wie kriege ich das Password konstant und initialisiere es mit dem Wert? Also wenn ich "extern const int Password=0xdeaf;" in CCE schreibe und "Password=0xFBDE" in die cmd Datei, dann kommt zwar kein Fehler, aber eine Warnung, dass das Symbol Password redefined wurde...und wenn ich den Eintrag im cmd-file weglasse gehts auch (aber dann hab ich das Passwort ja nicht an der gewünschten Adresse!?). 2. Das eigentliche monitor Programm ist in Assembler geschrieben (flash_monitor.s43) und benutzt IAR konforme Direktiven. Die meisten habe ich schon CCE kompatibel umgeschrieben (mit Hilfe von oben genannten User Guide), aber mit ORG, ASEG, ASEGN und RSEG hab ich so meine Probleme. z.B. werden am Anfang nach RSEG CSTACK ein paar Variablen deklariert und dann kommen die Zeilen ASEG ORG 0xFC00 Eigentlich müsste ich doch im CCE auch sagen, an welche Stelle im Speicher die folgenden Anweisungen ausgeführt werden sollen, aber mit .data und co kann ich keine Adresse angeben (so wie ORG 0xFC00 halt), oder? Ich krieg schon Kopfschmerzen... Wenn jemand ne Idee hat, ich bin für alles offen (am liebsten wär mir aber ein Beispiel - Code, den ich auch nachvollziehen kann g) Viele Grüße Stepahn
So, ich nochmal... Kann ich die folgenden Zeilen für den IAR RSEG CSTACK Outstring DS8 80 ... ASEG ORG 0xFC00 für den CCE so schreiben: (RSEG CSTACK weglassen) OutString .usect ".stack",80 ... .text ??? .stack ist laut SLAU157g Seite 71 äquivalent zu .stack und .stack ist ja auch im linker command file (siehe ersten Beitrag) in SECTIONS definiert. Ich krieg zumindest keine Fehlermeldung, aber ob das Programm jetzt auch das gleiche macht...??? Ach ja, ORG kommt nur einmal vor und wurde in anderen code examples von TI einfach durch .text ersetzt...aber das kommt mir irgendwie zu einfach vor!?
Ach ja, da wär noch was... ;-) Mit der Zeile mov.w #SFE(CSTACK),SP ; Initialize stackpointer wird der Stackpointer (wer hätte es gedacht g) initialisiert. Laut MSP430 IAR Assembler Reference Guide Seite 34 ist SFE ein Operator, der das Ende des Speichers des übergebenen Wertes zurückgibt. Also in diesem Fall das Ende des Stacks. Da .stack im CCE command linker file mit .stack : {} > RAM (HIGH) definiert ist, und RAM ebenfalls mit RAM : origin = 0x0200, length = 0x0800 definiert ist, müsste ich doch, da wir ja definitiv nur den F449 benutzen, die Adresse auch direkt eingeben könne, oder? Also mov.w #0x0A00,SP ??? Dann sollte der SP am Ende vom Stack-Speicher stehen, richtig?
So, habs jetzt soweit hinbekommen, dass nur noch ein Assembler-Fehler kommt (die Sache mit dem Passwort hab ich erstmal weggelassen...): Der CCE Assembler erkennt das Symbol MEM_START nicht. Das Problem: dieses Symbol gibt es nirgends!? Ich hab herausgefunden, dass im Code mehrere Zeilen stehen, die #UMEM_START oder #UMEM_SIZE beinhalten und damit z.B. den Anfang oder die Größe des Flash Speichers in Register schreiben (z.B. zum Erstellen einer Checksum). Wenn ich alle diese (5 oder so) Zeilen auskommentiere, hab ich den Fehler nicht mehr, also muss es mit #UMEM_START und #UMEM_SIZE zu tun haben (es gibt noch #UMEM_END, aber da beanstanded CCE nix!). Ich finde nirgends einen Hinweis, was UMEM_START und _SIZE machen, oder wo sie definiert sind, geschweige denn wie ich das zum CCE portieren kann. Es muss irgendeine IAR spezifische Deklaration geben, aber ich find ums Verrecken nix... Ich mach erstmal Feierabend...krieg schon wieder Kopfschmerzen. Edit: mir ist schon klar was die Dinger ungefähr machen sollen, steht ja quasi dabei, aber eine genaue Definition wäre schon hilfreich.
Och nee, oder? Dat ganz UMEM_ und MEM_START Gedöns ist ja in flash_monitor.h definiert!?!? Da schlägt das alte Sprichtwort "den Wald vor lauter Bäumen nicht sehen" wieder mal voll zu... Was ich aber nicht verstehe ist, dass ich flash_monitor.h ja eingebunden habe und der Assembler einige Sachen daraus erkennt, aber z.B. MEM_START nich? Naja, schaun wa mal...
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.