Forum: Mikrocontroller und Digitale Elektronik MSP430F1611 wie gesamten RAM verwenden?


von Wolfgang (Gast)


Lesenswert?

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

von Tenner (Gast)


Lesenswert?

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

von Carsten S. (carsten)


Lesenswert?

Du hast nicht zufällig einen "Code-Größen" limitierten Compiler ?!?

von Tenner (Gast)


Lesenswert?

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.

von Carsten S. (carsten)


Lesenswert?

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.

von Tenner (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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

von Carsten S. (carsten)


Lesenswert?

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)

von Tenner (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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

von tenner (Gast)


Lesenswert?

Hast du beim IAR mal die von mir aufgeführten Einstellungen kontrolliert
und ggf. angepaßt??

von Wolfgang (Gast)


Lesenswert?

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

von Tenner (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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

von Tenner (Gast)


Lesenswert?

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

von Florian (Gast)


Lesenswert?

Wieso nimmst du den gcc dann nicht für den 1611 mit her?

von Robert (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.