www.mikrocontroller.net

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


Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carsten St. (carsten)
Datum:

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

Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carsten St. (carsten)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tenner (Gast)
Datum:

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

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian (Gast)
Datum:

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

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.