Forum: Mikrocontroller und Digitale Elektronik MSP430: CCS Compiler Problem


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;
}

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.