Gast
#846
Hi, hat einer von Euch schon mal mit dem IAR-Compiler den AVR programmiert? Ich hab da ein Problem mit der Codeoptimierung. Das folgende C-Programm wird in den darunterliegenden Assembler-Code umgesetzt. Aber der Asm-Code führt nicht die mit dem C-Code programmierte Funktion aus. Stell ich die Optimierung aus klappt es. Danke für Eure Antworten, Grüße Timo //--- Includes: #include<inavr.h> #include<io8515.h> //--- Macros: #define ClearBit(ADRESS,BIT) (ADRESS&=~(1<<BIT)) #define SetBit(ADRESS,BIT) (ADRESS|=(1<<BIT)) #define TestBit(ADRESS,BIT) ((ADRESS&(1<<BIT))) //--- Main Routine: void main(void) { unsigned char Temp=0; //--- µC Configuration: UBRR=51; // Baudrate SetBit(UCR,3); // TX enable SetBit(UCR,4); // RX enable //--- Mainloop: while(1) { while(!TestBit(USR,7)); // Warten bis RXC-Flag gesetzt wurde Temp=UDR; // Read out UART __no_operation(); // sonst löscht der Optimierer den folgenden Befehl UDR=Temp; // Write to UART (ECHO) } } *0000000D:main *0000000D: *0000000D: unsigned char Temp=0; +0000000D: E010 LDI R17,0x00 ; 0x00 = 0b00000000 = 0 *0000000E: UBRR=51; +0000000E: E303 LDI R16,0x33 ; 0x33 = 0b00110011 = 51 +0000000F: B909 OUT 0x9,R16 *00000010: SetBit(UCR,3); +00000010: 9A53 SBI 0xA,3 +00000011: E001 LDI R16,0x01 ; 0x01 = 0b00000001 = 1 *00000012: SetBit(UCR,4); +00000012: 9A54 SBI 0xA,4 +00000013: E001 LDI R16,0x01 ; 0x01 = 0b00000001 = 1 *00000014: while(!TestBit(USR,7)) +00000014: 995F SBIC 0xB,7 *00000015: Temp=UDR; +00000015: B11C IN R17,0xC *00000016: __no_operation(); +00000016: 0000 NOP *00000017: UDR=Temp; +00000017: B91C OUT 0xC,R17 +00000018: CFFB RJMP while(!TestBit(USR,7))