MSP430: CCS Compiler Problem

Gast #6473418
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;
}
Gast #6473735
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);
(Firma: Torrox.de) #6473862
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?
Gast #6473974
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ß.
(Firma: MED-EL GmbH) #6474366
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren