I get the same result you do for the test you have sent. I have sent you (private email) my code in it's entirety. Attached is the ms-dos .bat file I use to generate the code and .lst files. I do use a different command line than you did. I got mine from the front page of mikrocontroller.net with a couple of additions (library and optimizer) from this list. Call the compiler with this command line: C:\>c mark -O2
-Mark PS I renamed to .txt so the mail programs wouldn't complain. -----Original Message----- From: mspgcc-users-ad...@lists.sourceforge.net [mailto:mspgcc-users-ad...@lists.sourceforge.net] On Behalf Of Steve Underwood Sent: Tuesday, May 13, 2003 8:00 AM To: mspgcc-users@lists.sourceforge.net Subject: Re: [Mspgcc-users] Another bug in Timer_A IRQ Hi Mark, How did you compile this? I have a project right now with a *huge* Timer_A0 interrupt service routine, that actually does most of the software's work. It gets a reti at the end without trouble, and handles all the registers properly. I tried to extract the C lines from your post and made a file. I didn't see where count8m was defined, so I made it a global, like lastcc. If I compile this: #include <signal.h> #include <io.h> volatile unsigned long int lastcc; volatile unsigned long int count8m; interrupt (TIMERA0_VECTOR) TimerACC0IRQ(void) { if ( TACTL & TAIFG ) // Check for overflow { count8m = 65535u - lastcc + TACCR0; TACTL &= ~TAIFG; // Clear Timer_A Interrupt flag } else { count8m = TACCR0 - lastcc; } lastcc = TACCR0; TACCTL0 &= ~CCIFG; // Clear CCIFG Interrupt flag } with this command: msp430-gcc -mmcu=msp430x435 -c -S -o mark.s mark.c I get this: .file "mark.c" .arch msp430x435 .text .p2align 1,0 .global TimerACC0IRQ .global vector_ffec .type TimerACC0IRQ,@function /*********************** * Interrupt Service Routine `TimerACC0IRQ' at 0xffec ***********************/ vector_ffec: TimerACC0IRQ: /* prologue: frame size = 0 */ .L__FrameSize_TimerACC0IRQ=0x0 .L__FrameOffset_TimerACC0IRQ=0xc push r15 push r14 push r13 push r12 push r5 push r4 /* prologue end (size=6) */ mov &0x0160, r15 and #llo(1), r15 jeq .L2 mov &0x0172, r15 mov r15, r12 clr r13 mov &lastcc, r14 mov &lastcc+2, r15 sub r14, r12 subc r15, r13 mov r12, r14 mov r13, r15 add #llo(65535), r14 addc #lhi(65535), r15 mov r14, &count8m mov r15, &count8m+2 bic #llo(1),&0x0160 jmp .L3 .L2: mov &0x0172, r15 mov r15, r12 clr r13 mov &lastcc, r14 mov &lastcc+2, r15 sub r14, r12 subc r15, r13 mov r12, r14 mov r13, r15 mov r14, &count8m mov r15, &count8m+2 .L3: mov &0x0172, r15 mov r15, r14 clr r15 mov r14, &lastcc mov r15, &lastcc+2 bic #llo(1),&0x0162 /* epilogue: frame size=0 */ pop r4 pop r5 pop r12 pop r13 pop r14 pop r15 reti /* epilogue end (size=7) */ /* function TimerACC0IRQ size 65 (52) */ .Lfe1: .size TimerACC0IRQ,.Lfe1-TimerACC0IRQ /********* End of function ******/ .comm lastcc,4,2 .comm count8m,4,2 /********************************************************************* * File mark.c: code size: 65 words (0x41) * incl. words in prologues: 6, epilogues: 7 *********************************************************************/ Since I believe you are using my installer, we should be building with the same version of mspgcc. Regards, Steve Mark Stokes wrote: >At the cost of more of my hair, I have found another possible bug in the >compiler. >When using Timer_A IRQ, the compiler doesn't save any registers it might >use for calculations. Here is a listing of my Timer_A ISR: >00001b76 <TimerACC0IRQ>: > >volatile unsigned long int lastcc; >/********************************************************************** * >******* > Timer_A Capture Compare Interrupt Service Routine (CCIFG0): >*********************************************************************** * >******/ >interrupt (TIMERA0_VECTOR) TimerACC0IRQ( void ) >{ > > if ( TACTL & TAIFG ) // Check for overflow > 1b76: 92 b3 60 01 bit #1, &0x0160 ;r3 As==01 > 1b7a: 13 24 jz $+40 ;abs 0x1ba2 > { > count8m = 65535u - lastcc + TACCR0; > 1b7c: 1f 42 72 01 mov &0x0172,r15 ;0x0172 > 1b80: 0e 4f mov r15, r14 ; > 1b82: 0f 43 clr r15 ; > 1b84: 1c 42 04 02 mov &0x0204,r12 ;0x0204 > 1b88: 1d 42 06 02 mov &0x0206,r13 ;0x0206 > 1b8c: 0e 8c sub r12, r14 ; > 1b8e: 0f 7d subc r13, r15 ; > 1b90: 3e 53 add #-1, r14 ;r3 As==11 > 1b92: 0f 63 adc r15 ; > 1b94: 82 4e 00 02 mov r14, &0x0200 ; > 1b98: 82 4f 02 02 mov r15, &0x0202 ; > TACTL &= ~TAIFG; // Clear Timer_A Interrupt flag >(overflow bit) > 1b9c: 92 c3 60 01 bic #1, &0x0160 ;r3 As==01 > 1ba0: 0e 3c jmp $+30 ;abs 0x1bbe > } > else > count8m = TACCR0 - lastcc; > 1ba2: 1f 42 72 01 mov &0x0172,r15 ;0x0172 > 1ba6: 0e 4f mov r15, r14 ; > 1ba8: 0f 43 clr r15 ; > 1baa: 1c 42 04 02 mov &0x0204,r12 ;0x0204 > 1bae: 1d 42 06 02 mov &0x0206,r13 ;0x0206 > 1bb2: 0e 8c sub r12, r14 ; > 1bb4: 0f 7d subc r13, r15 ; > 1bb6: 82 4e 00 02 mov r14, &0x0200 ; > 1bba: 82 4f 02 02 mov r15, &0x0202 ; > lastcc = TACCR0; > 1bbe: 1f 42 72 01 mov &0x0172,r15 ;0x0172 > 1bc2: 0e 4f mov r15, r14 ; > 1bc4: 0f 43 clr r15 ; > 1bc6: 82 4e 04 02 mov r14, &0x0204 ; > 1bca: 82 4f 06 02 mov r15, &0x0206 ; > > TACCTL0 &= ~CCIFG; // Clear CCIFG Interrupt flag > 1bce: 92 c3 62 01 bic #1, &0x0162 ;r3 As==01 > __asm__( "reti" ); > 1bd2: 00 13 reti > >00001bd4 <BasicTimerIRQ>: >} > >It would appear that this function is acting as if I had the "naked" >property set (which I don't). This is easily solved by manually adding >the push and pop statements that account for the registers used. Here's >my solution: > __asm__( "push r15" ); > __asm__( "push r14" ); > __asm__( "push r13" ); > __asm__( "push r12" ); >/******* Body of ISR *******/ > __asm__( "pop r12" ); > __asm__( "pop r13" ); > __asm__( "pop r14" ); > __asm__( "pop r15" ); > >This works, but obviously, I shouldn't have to do this. >Cheers >-Mark Stokes > > ------------------------------------------------------- Enterprise Linux Forum Conference & Expo, June 4-6, 2003, Santa Clara The only event dedicated to issues related to Linux enterprise solutions www.enterpriselinuxforum.com _______________________________________________ Mspgcc-users mailing list Mspgcc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mspgcc-users
@echo off echo Compiling %1.c REM Optomizing msp430-gcc -lm -mmcu=msp430x449 -W -Wall -g %2 -o %1.elf %1.c rem msp430-gcc -mmcu=msp430x449 -W -Wall -g %2 -o %1.elf %1.c -lfp -lm REM Not optomizing rem msp430-gcc -g -o %1.elf %1.c msp430-objdump -DS %1.elf > %1.lst msp430-objcopy -O ihex %1.elf %1.hex msp430-size %1.elf echo ROM size = text + data echo RAM size = data + bss + stack size required (not displayed) rem msp430-gcc -lm -mmcu=msp430x449 -W -Wall -g -O2 -o it400e.elf it400e.c