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; }
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;
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);
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ß
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?
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.
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ß.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.