Forum: Mikrocontroller und Digitale Elektronik MSP430: CCS Compiler Problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von völkner (Gast)


Lesenswert?

Hallo,
bin vor kurzem auf CCS 10.1.1.00004 umgestiegen und bin auf ein
Problem gestoßen, das ich nicht beheben kann.
Ich kann es mit einem minimalem von CCS gemanagdes Beispiel
reproduzieren. Siehe unten.

Nach der zweiten Addition geht die Adresse des Arrays verloren. Die 
Array
Adresse wird hier in einem Register gehalten, das nach Ausführung einen 
anderen Wert hat.
Mein alter Compiler macht es richtig , er benutzt RAM und
kein Register an der Stelle.
Vielleicht mache ich noch was falsch. Könnte das mal bitte jemand 
ausprobieren?

Die Optimierung ist ganz abgeschaltete, der Compiler ist TI v20.2.3.LTS,
die CPU ist MSP430F2274.

Vielen Dank.

#include <msp430.h>
/**
 * main.c
 */
static void test_list(unsigned char *data, unsigned int len)
{
 unsigned long ul_id;
      ul_id  = (unsigned long)(data[0]);
      ul_id += ((unsigned long)(data[1])<<8); //<< danach ist array 
Adresse von data weg !!
      ul_id += ((unsigned long)(data[2])<<16);
      ul_id += ((unsigned long)(data[3])<<24) ;
}

void Test()
{
    unsigned char buffer[8] = { 0,1,2,3,4,5,6,7};
    test_list(buffer,8);
}

int main(void)
{
  WDTCTL = WDTPW | WDTHOLD;  // stop watchdog timer
  while (1) {
      Test();
  }
  return 0;
}

von Jürgen W. (Firma: MED-EL GmbH) (wissenwasserj)


Lesenswert?

Probier' mal so:

      ul_id  = ((unsigned long)(data[0]));
      ul_id += ((unsigned long)(data[1]))<<8;
      ul_id += ((unsigned long)(data[2]))<<16;
      ul_id += ((unsigned long)(data[3]))<<24;

von völkner (Gast)


Lesenswert?

Geht auch nicht, aber Danke.

von dummschwaetzer (Gast)


Lesenswert?

mach mal ul_id static volatile

von dummschwaetzer (Gast)


Lesenswert?

oder
unsigned long ul_id;
      ul_id  = (unsigned long)(data[0]);
      ul_id += ((unsigned long)(data[1])<<8);
      ul_id += ((unsigned long)(data[2])<<16);
      ul_id += ((unsigned long)(data[3])<<24) ;
mach_was_mit(ul_id);

oder

ul_id  = ((unsigned long)(data[3])*0x01000000l)+
         ((unsigned long)(data[2])*0x00010000l)+
         ((unsigned long)(data[1])*0x00000100l)+
         ( unsigned long)(data[0]);
mach_was_mit(ul_id);

von Franko P. (sgssn)


Lesenswert?

Hi
hätte auc noch ne Idee: Die Zeile

unsigned char buffer[8] = { 0,1,2,3,4,5,6,7};

ganz oben, global anzuschreiben, noch vor der Zeile

static void test_list(unsigned char *data, unsigned int len)

Gruß

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

völkner schrieb:
> Nach der zweiten Addition geht die Adresse des Arrays verloren. Die
> Array
> Adresse wird hier in einem Register gehalten, das nach Ausführung einen
> anderen Wert hat.

Wie beobachtest Du das den? Im Debugger mit einem optimierten build?

Was passiert den, wenn Du test_list den Wert von ul_id zurück geben läßt 
und die Funktion 2 mal aufrufst und die Ergebnisse in volatile 
deklarierten Variablen speicherst?

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Das liegt hier wohl an deinem MWE, das Verhalten ist absolut ok. 
test_list macht ja nichts also gibt es keinen Grund data oder ul_id zu 
behalten.

von völkner (Gast)


Lesenswert?

Danke für die diversen Hinweise.

Das Beispiel funktioniert, war mein Fehler.

Die Adresse des Arrays wird in andere Register umgeladen während der 
Abarbeitung was aber der Debugger nicht wissen kann, deshalb stand ich
da auf dem falschen Fuß.

von Jürgen W. (Firma: MED-EL GmbH) (wissenwasserj)


Lesenswert?

Tschuldigung, nochmal ein Nachtrag, komplett vergessen:

Deine Variable wird nach der Summation nicht mehr gebraucht. Der 
Compiler verwirft also die Daten und das war's.

Willst Du sehen, ob die Daten stimmen, gib' der Funktion einfach die 
long-Variable als Rückgabewert:

long test_list(unsigned char *data, unsigned int len)
{
      unsigned long ul_id;
      ul_id  = (unsigned long)(data[0]);
      ul_id += ((unsigned long)(data[1])<<8);
      ul_id += ((unsigned long)(data[2])<<16);
      ul_id += ((unsigned long)(data[3])<<24) ;
      return ul_id;
}

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]
  • [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.