Ich möchte das Thema nochmal aufgreifen, da ich neue "merkwürdige" Erkenntnisse gewonnen habe:
Mein Code läuft jetzt mit Allen möglichen Optimierungen, das war ein gutes Stück Arbeit.
Ein Fehler hat wirklich lange gedauert und dieser ist mir auch bisher nicht erklärlich. Vielleicht habt Ihr eine Erklärung dafür:
Diese Zeile hat der Compiler wegoptimiert wenn *base nicht volatile ist */
das darf er doch nur, wenn er wüste, dass da schon 0x83 drin steht, dem ist aber nicht so
*(base + UART_LCR) = 0x83; /* DLAB = 1 , 8 bits, no Parity, 1 Stop bit */
Dazu ein Ausschnitt aus dem Code zum Initialisieren der seriellen Schnittstelle:
Code:/*----------------------------------------------------------------------------*/ void uart_init(const U8 UartNo,const U32 baudrate) { volatile U8* base; base = (U8*) UART_BASE[UartNo]; /* base address of uart, Basisadreesen sind im Array abgelegt */ *(base + UART_LCR) = 0x83; /* <---- Zeilenklau Compiler DLAB = 1 , 8 bits, no Parity, 1 Stop bit */ /* .............Werte für DLL und DLM setzen............. */ *(base + UART_LCR) = 0x03; /* <--- diese Zeile lasst der Compiler drin DLAB = 0 , 8 bits, no Parity, 1 Stop bit */ }
warum verschwindet die Zeile lediglich bei Optimierungsstufe -O3 ?
Siro
PS. Das ist LPCXpresso v7.9.2 [Build 493] [2015-09-14]
Gnu-Compiler C/C++ GNU Toolchain Build Support 8.6.0.201502131403 org.eclipse.cdt.gnu.build.feature.group Eclipse CDT
Lesezeichen