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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.