Ich möchte ca. 8kB des RAMs zur schnellen Zwischenabspeicherung von Werten, die der ADC12 liefert, verwenden. (eine Art kleiner Speicheroszi für einmalige Vorgänge). Dazu habe ich ein Feld angelegt. Solange das Feld kleiner ca. 2kB ist, lässt sich das Programm problemlos übertragen und starten. Lege ich ein Feld in der gewünschten Größe an, lässt sich das Programm nicht starten. Lt. Datenblatt teilt sich der RAM in 8kB Extended und 2kB Mirrored auf. Was ist darunter zu verstehen? Kann mir jemand einen Tipp geben, wie man das Problem lösen kann. MfG Wolfgang
Moin, eigentlich sollte dein Compiler das Problem lösen ;-) Der RAM ist im F1611 in 2 Bereiche geteilt. Von 0200h-09FFh liegt der eigentliche Abeitsspeicher. Die 8k Extendet-RAM liegen im Bereich von 01900h-038FFh. Die 2k Mirrored sind die 2k Arbeitsspeicher die in den Adressbereich von 01100h-018FFh gespiegelt werden. Steht aber alles auch im Datenblatt. Nun stellt sich die Frage wie der Compiler mit den 8k Extended umgeht. Wir nehmen mal an, dass dieser Bereich vom Compiler nicht genutzt wird. In diesem Fall schreibst du einfach den Bereich mit deinen Daten voll und gut. Wird der Speicherbereicht vom Compiler genutzt, sollte es auch möglich sein ein entsprechend großes Array anzulegen oder mit malloc() entsprechend viel Speicher reservieren. Gruß Tenner
Du hast nicht zufällig einen "Code-Größen" limitierten Compiler ?!?
Jetz würde mich doch mal interessieren warum mein Beitrag hier 2 mal erscheint und das mit knapp 20min Abstand???? Carsten, eine Codegrößenbeschränkung des Compilers spielt hier keine Rolle. Der genutzte Speicherbereicht für die Daten ist unabhängig von der Codegröße.
Das ist so nicht richtig! Da das Feld im Startup-Code initialisiert wird (z.B. alles auf 0 gesetzt), spielt das eine Rolle für die Codegröße.
Dazu hätte ich gerne eine genauere Erklärung! Das Feld wird erst zur Laufzeit erzeugt. Die Initialisierung zb. mit 0 erfolgt ebenfalls erst zur Laufzeit. Wenn das Feld mit einer Wertereihe initialisiert wird würde diese auch im HEX-File im segment TEXT stehen und somit die Codegröße beeinflussen. Es wäre allerdings dennoch interessant zu erfahren welcher Compiler eingesetzt wird, da man dem Linker mitteilen kann an welcher Stelle das Segment DATA angelegt wird.
Das ist für mich zunächst etwas zu tiefgründig, möchte aber noch etwas zur Klärung beisteuern. Zum Compiler: Es ist der MSP 430 IAR C/EC++ Compiler. In meiner Version sind Programme bis 2k möglich. Beim compilieren und linken wird weder bei einer Feldgröße von 2 000 Bytes noch bei 8 000 Bytes gemeckert. Nur wenn das Programm zu groß ist, kommt eine Fehlermeldung. Hoffentlich hab ich mich richtig ausgedrückt. <<schreibst du einfach den Bereich mit deinen Daten voll>> danke Tenner, hab es aber leider noch nicht ganz verstanden. Mit folgenden Anweisungen wollte ich die Daten in den RAM schreiben (Auszug aus meinem Programm): #include "MSP430x16x.h" // für MSP430F1611 unsigned int Tabelle[3000] ; //anlegen eines Feldes mit 3000 //Speicherplätzen á 16 Bit void zwischenspADW(void); void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer } void zwischenspADW(void) //eine Zwischentabelle wird im RAM angelegt { Tabelle[t] = ADC12MEM0; // weist dem Speicherplatz [t]den //Wert vom ADC12MEM0 zu t=t+1; } solange man an der Stelle [3000], Werte bis ca. [1100] einträgt, läuft das Programm wunschgemäß, aber mit [1200] läuft es nicht mehr. als Autodidakt muss ich mich mal mit malloc() beschäftigen. Oder kann man das in wenigen Worten leicht verständlich erklären? MfG Wolfgang
Ich vermute, dass du dir den Stack überschreibst. Du musst mal nachschauen, an welchen Adressen der bei dir steht bzw. wo dein Feld liegt. Diese Info erhälst du im MAP-File (unter Projekt->Option->Linker->Linkerlisting->Modulinformation auswählbar, oder so ähnlich)
malloc() hilft dir zunächst mal nicht weiter, da du nicht bestimmen kannst an welcher Adresse im RAM Speicher allociert wird. Grob gesagt allociert malloc( size_t size ) size bytes an Speicher. Dies erfolgt dynamisch zur Laufzeit des Programms. char* pszText; pszText = (char*) malloc( sizeiof(char) * 1000 ); reserviert also 1000 Bytes Speicher. Die Anfangsadresse wird in die Variable pszText geschrieben. Mit free( pszText ); kann der Speicher wieder Freigegeben werden. Ich habe mit dem IAR noch nicht gearbeitet, kann dir also nicht genau sagen wo du drehen mußt, das der extendet RAM Bereich für Daten benutzt wird. Dies müßte in den Vorlagen für den Linker verankert sein *.xcl Ich hab das den IAR gerade mal Installiert und dabei Festgestellt, dass (zumindest bei meiner Installation) ein neues Projekt immer mit den Linker-Einstellungen für den F149 angelegt wird. Geh mal im Menu unter Projekt->Options (oder einfach ALT+F7 drücken). Links im Fenster unter "Category" wählst du linker aus. Nun rechts auf "Config" gehen. Unter "Linker command file" "Overide default" aktivieren und den Eintrag "$TOOLKIT_DIR$\config\lnk430F149.xcl" in "$TOOLKIT_DIR$\config\lnk430F1611.xcl" ändern. Einstellungen mit OK speichern und das Projekt neu Compilieren. Ich hoffe das hilft dir. Ansonsten: Wenn man davon ausgehen würde das der Linker den Extended-RAM nicht nutzt, kann dieser Speicherbereich auch direkt Adressiert werden. ... unsigned int* Tabelle = 0x1900; #include "MSP430x16x.h" // für MSP430F1611 unsigned int* Tabelle = 0x1900; // anfangsadresse der Tabelle in auf // den Extende-RAM setzen void zwischenspADW(void); void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer } void zwischenspADW(void) //eine Zwischentabelle wird im RAM angelegt { Tabelle[t] = ADC12MEM0; // weist dem Speicherplatz [t]den //Wert vom ADC12MEM0 zu t=t+1; } man sollte dabei aber darauf achten, dass nur bis zur Endadresse 038FFh geschrieben wird.
Danke für die Hilfe.
Da mein IAR- Programm keine Fehler gefunden hatte, aber trotzdem keine
lauffähigen Programme produziert wurden, habe ich es mal mit
CCEssentials for MSP 430 versucht. Nach ersten positiven Versuchen
mit einem Kurzprogramm, bei dem ich die Feldgröße variiert habe, würde
ich sagen, meine IAR Version ist nicht in der Lage, den gesamten RAM
zu nutzen(oder ist begrenzt).
Leider kann ich nicht sagen, warum das so ist.
Mit CCEssentials for MSP 430 geht es.
Damit können wir das Thema zunächst erst einmal abhaken.
Nur noch eine Frage: Wie ist die folgende Warnung zu deuten und was
müsste man tun?
c:\CCEssentials\cgtools\bin\gmake.exe: *** Warning: File
`sources.mk' has modification time in the future (2005-10-11 17:19:32
> 2005-10-11 17:19:30)
MfG
Wolfgang
Hast du beim IAR mal die von mir aufgeführten Einstellungen kontrolliert und ggf. angepaßt??
Ja, ich habe alle Vorschläge geprüft und durchgearbeitet. <<unsigned int* Tabelle = 0x1900;>> ist 2x aufgeführt, 1x entfernt, aber trotzdem meckert der Compiler MfG Wolfgang
nein, ich meinte die einstellungen für den linker Geh mal im Menu unter Projekt->Options (oder einfach ALT+F7 drücken). Links im Fenster unter "Category" wählst du linker aus. Nun rechts auf "Config" gehen. Unter "Linker command file" "Overide default" aktivieren und den Eintrag "$TOOLKIT_DIR$\config\lnk430F149.xcl" in "$TOOLKIT_DIR$\config\lnk430F1611.xcl" ändern. Einstellungen mit OK speichern und das Projekt neu Compilieren.
Hallo Tennert, diese Einstellung wählt mein Programm automatisch, wenn man unter >general< den F1611 auswählt. Bei "Override default" muss man nur noch den Haken setzen. Daran kann es m.E. nicht liegen. Aber mal eine andere Frage: Hast du schon einen MSP430F1611 mit einem Programm betrieben, wo so richtig viel RAM (als Feld) benötigt wird und mit welchem Compiler hat es funktioniert? MfG Wolfgang
Moin Wolfgang, ich hab hier zwar einen F1611 liegen, hab mit dem allerdings noch nix gemacht, da mir zZ. der Speiches des F149 noch ausreicht. Ansonsten arbeite ich mit dem mspgcc. Kostet nix, hat keine Code-Größenbeschränkung und funktioniert. Gruß Tenner
Wieso nimmst du den gcc dann nicht für den 1611 mit her?
Hallo zusammen, ein ähnliches Promlem hatte ich auch mal, die Lösung bestand darin das Array mit __no_init zu initialisieren: z.B.: __no_init unsigned int Arrayname[4096] Das Array wird zwar nicht mit 0 initialisiert, wird aber normalerweise richtig im Speicher abgelegt. Wenn man die 0er drin stehen haben will kann man das Array ja beim Programmstart "manuell" überschreiben. Viele Grüße, Robert
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.