Hallo Dmitry, unfortunately the version 3.2.2 is the last mspgcc release available for download for linux from mspgcc's sourceforge website. There is also no a _really clear_ explanation which versions to compile and download with which patches to get all the toolchain running smooth.
I use 3.2.3, compiled with mspgcc patch CVS head for the 3.2.3 branch from end of july 2004 and it works quite well. The only downside is the lack of backtracing in my gdb (430x147), but I've promised myself, when I'll have some time to look at the issue and try to compile it for 6.2 and make the backtrace work. I've put my archives with a bit fresher runtime at http://www.pp.org.pl/~trevor/mspgcc/mspgcc_20040730.tar.bz2 Readme file how to install it (available also inside of the package) http://www.pp.org.pl/~trevor/mspgcc/README.txt - the versions and details are contained inside. It's still prefered to compile and and install from sources, but for people it can really simplify the life. Everything is inside, except gdbproxy - the licence issues of the tools don't permit to package it together. I'm not providing the sources, because it's compiled from one of the patch revisions available from mspgcc website and regular gnu tools distributions. The patch everyone can download from mspgcc website, there is no single modification by myself in the sourcecode. Regards, T. W liĆcie z czw, 23-09-2004, godz. 09:45, Dmitry pisze: > There is something _really_ odd. > The listing file you've generated is incomplete. For example, > jmp &0x000 > bic rN, &0x000 > is impossible. > > Also, try to use something like gcc-3.2.3, not a pre-release. > ~d > > Tommy Andersson wrote: > > > Hello maintainers, > > > > I am using msp430-gcc and friends, and I have found some possible > > bugs. My computer is setup according to: > > > > cat /etc/slackware-version > > Slackware 9.0.0 > > > > uname -a > > Linux gaston 2.4.20 #2 Mon Mar 17 22:02:15 PST 2003 i686 unknown > > > > I have included some source-code in this message, which begins at > > "Listing 1", and also some assembly output which begins at > > "Listing 2". The following files have been downloaded and installed: > > > > msp430-gcc-3.2.2.20030214.tar.bz2 > > msp430-libc-1.0.20030207.tar.bz2 > > > > The commandline used to compile the program in listing 1 was: > > > > msp430-gcc -O -S -fpeephole -fpeephole2 -mmcu=msp430x147 bugsdemo.c -o > > bugsdemo.s > > > > The reason that I activated the flag -fpeephole2, was that I was not > > satisfied with the optimization when using the datatype long int. The > > flag made the optimizer remove a few redundant instructions, but also, > > as we will see, a few necessary instructions as well. > > > > Now to the details: > > > > 1. Sourcecode line 63 and line 74 generates an invalid opcode, "jne > > &0x0000", as can be seen in lines 44 and 61 in the assembly > > listing. The workaround was to rewrite the macros DISABLE_TX_INTR > > and ENABLE_TX_INTR to generate function calls. This is not a very > > efficient way of coding however. > > > > 2. Sourcecode line 137 generates an invalid opcode, "jl &0x001D", as > > can be seen in line 151 in the assembly listing. The workaround was > > to rewrite the macro DATA_DIR_OUT to generate a function call. The > > phenomenom seems to be related the one above. > > > > 3. Lines 237 to 244 have an #if/#else/#endif macro. If the first case > > is compiled, the value of grid[0] will not be correct when the call > > to pr_txchar( grid[0] ) in line 239 is made. A "mov @r11, r15" > > between lines 266 and 267 would save the day. The second case of > > the macro always compile correctly. During the writing of this > > message I found that the problem disappeared when I omitted the > > flag -fpeephole2 on the commandline. The commndline now was: > > msp430-gcc -O -S -fpeephole -mmcu=msp430x147 bugsdemo.c -o bugsdemo.s > > > > I do not know if -O automatically sets -fpeephole, is there any way of > > checking this ? > > > > NOTE that the line-numbers above refers to line-numbers in the source, > > not to line-numbers in this text. > > > > The code in the example below is copied from different files in > > production code. > > > > With Best Regards, Tommy Andersson > > > > tommy.anders...@geodynamik.com > > > > --- Listing 1 begins here --------------------------------------- > > #include <io.h> > > #include <signal.h> > > > > #define ENABLE_TX_INTR SFR_CMD(bis.b,IE1,UTXIE0) > > #define DISABLE_TX_INTR SFR_CMD(bic.b,IE1,UTXIE0) > > > > #define U0_BUFSIZE 10 > > #define PRC_PRINTER 2 > > > > // Push flags and disable interrupts > > inline static void pushf_disable( void ) > > { > > asm volatile ( "push r2 \n\t" : : ); > > dint(); > > asm volatile ( "nop \n\t" : : ); // dint() is delayed 1 clock ! > > } > > > > // Pop the flags, possibly enabling interrupts > > inline static void popf( void ) > > { > > asm volatile ( "pop r2 \n\t" : : ); > > } > > > > typedef unsigned char BYTE; > > > > /*** Global control variables: ***/ > > extern volatile unsigned char curr_pid; > > > > /*---------------------------------------------------------------------- > > Local variables > > ----------------------------------------------------------------------*/ > > static volatile BYTE tx0_buffer[U0_BUFSIZE]; > > static volatile BYTE *tx0_head = tx0_buffer; > > static volatile BYTE *tx0_tail = tx0_buffer; > > > > static volatile BYTE tx0_stop; > > static volatile BYTE tx0_pending; > > > > static volatile BYTE suspended, wait_data_flag; > > > > /*---------------------------------------------------------------------- > > Transmit a character through the serial interface. Returns -1 on a > > failure, otherwise 0 is returned. > > ----------------------------------------------------------------------*/ > > int pr_txchar( char ch ) > > { > > BYTE *ptr; > > > > retry: > > DISABLE_TX_INTR; > > > > if ( !tx0_pending ) { // NO pending transmissions > > U0TXBUF = ch; > > tx0_pending = 1; > > } > > else { > > ptr = tx0_head; > > if (++ptr >= tx0_buffer+U0_BUFSIZE) > > ptr = tx0_buffer; > > if (ptr == tx0_tail) { // Buffer is FULL ! > > ENABLE_TX_INTR; > > > > if ( curr_pid == PRC_PRINTER ) { > > pushf_disable(); > > suspended = 1; // This flag MUST BE SET before suspending the proc > > ! > > proc_suspend( PRC_PRINTER ); // Suspend printer process > > popf(); > > goto retry; > > } > > else > > return -1; // Otherwise, return error. > > } > > *tx0_head = ch; // Save next printer character. > > tx0_head = ptr; > > } > > ENABLE_TX_INTR; > > return 0; > > } > > > > #define CLOCK_LOW SFR_CMD( bic, P4OUT, 1<<0 ) > > #define CLOCK_HIGH SFR_CMD( bis, P4OUT, 1<<0 ) > > #define DATA_LOW SFR_CMD( bic, P4OUT, 1<<1 ) > > #define DATA_HIGH SFR_CMD( bis, P4OUT, 1<<1 ) > > #define DATA_DIR_IN SFR_CMD( bic, P4DIR, 1<<1 ) > > #define DATA_DIR_OUT SFR_CMD( bis, P4DIR, 1<<1 ) > > #define DATA_IN (P4IN&(1<<1)) > > > > /*---------------------------------------------------------------------- > > Read one byte of data from the RTC. > > > > The argument 'bytecount' shall be assigned the number of to be read at > > this 'session', and is used to control the acknowledge bit. > > ----------------------------------------------------------------------*/ > > static unsigned char rtc_read( signed char bytecount ) > > { > > unsigned char bitcount, data_read; > > static signed char count; > > > > if (bytecount) > > count = bytecount-1; > > else > > --count; > > > > DATA_DIR_IN; // DATA goes high (hi-z) > > for (bitcount = 0; bitcount < 8; bitcount++ ) { > > CLOCK_HIGH; > > delay_us( 4 ); > > > > data_read <<= 1; > > if ( DATA_IN ) > > data_read |= (1<<0); > > else > > data_read &= ~(1<<0); > > > > CLOCK_LOW; > > delay_us( 4 ); > > } > > DATA_LOW; > > > > if ( count > 0 ) > > DATA_DIR_OUT; // DATA goes low -> Acknowledge */ > > > > delay_us( 2 ); > > CLOCK_HIGH; > > delay_us( 4 ); > > CLOCK_LOW; > > delay_us( 2 ); > > DATA_DIR_IN; > > > > return data_read; > > } > > > > #define LF 10 > > #define FF 12 > > #define CR 13 > > #define ESC 27 > > > > #define WIDTH_CHAR 12 > > #define WIDTH_PRINTROW 400 > > #define MAXWIDTH_PRINTROW > > (WIDTH_PRINTROW>WIDTH_LOGO?WIDTH_PRINTROW:WIDTH_LOGO) > > #define LOGO_HORZ_TAB ((480-300)/2) > > #define HDR_HORZ_TAB 49 > > #define DATA_HORZ_TAB 49 > > #define FOOT_HORZ_TAB 49 > > #define HEIGHT_TEXTLINE 12 > > #define HEIGHT_PRINTROW 8 > > #define HEIGHT_FOOTER (12*HEIGHT_TEXTLINE) > > #define HEIGHT_A4 ((int)(VERT_DPI*297/25.4)) > > #define HORZ_GRIDLINE_SPACE 30 > > #define COARSE_VERT_GRIDLINE_SPACE 67 > > #define FINE_VERT_GRIDLINE_SPACE 100 > > #define CURVE_WIDTH 3 > > > > #define PC_BEGIN_LOGO {pr_txchar(ESC);pr_txchar('L');\ > > pr_txchar((WIDTH_LOGO+LOGO_HORZ_TAB)&0xff);\ > > pr_txchar((WIDTH_LOGO+LOGO_HORZ_TAB)>>8);} > > #define PC_BEGIN_HDRTAB {pr_txchar(ESC);pr_txchar('L');\ > > pr_txchar(LOGO_HORZ_TAB&0xff);\ > > pr_txchar(LOGO_HORZ_TAB>>8);} > > #define PC_BEGIN_GRAPHIC {pr_txchar(ESC);pr_txchar('L');\ > > pr_txchar((WIDTH_PRINTROW)&0xff);\ > > pr_txchar((WIDTH_PRINTROW)>>8);} > > #define PC_BEGIN_GRA_RMV {pr_txchar(ESC);pr_txchar('L');\ > > pr_txchar((WIDTH_PRINTROW+5)&0xff);\ > > pr_txchar((WIDTH_PRINTROW+5)>>8);} > > #define PC_SET_LINESPACING(x) > > {pr_txchar(ESC);pr_txchar('A');pr_txchar(x);} > > #define PC_SET_GRLINESPACING > > {pr_txchar(ESC);pr_txchar('A');pr_txchar(8);} > > #define PC_SET_TXTLINESPACING > > {pr_txchar(ESC);pr_txchar('A');pr_txchar(12);} > > #define PC_SELECT_CHARSET(x) > > {pr_txchar(ESC);pr_txchar('R');pr_txchar(x);\ > > pr_txchar(ESC);pr_txchar('t');pr_txchar(x);} > > #define PC_CRLF {pr_txchar(CR);pr_txchar(LF);} > > #define PC_PIXELTAB(x) {int q;pr_txchar(ESC);pr_txchar('L');\ > > pr_txchar((x)&0xff);pr_txchar((x)>>8);\ > > for(q=(x);q;q--)pr_txchar(0);} > > #define PC_FEED pr_txchar(FF) > > #define PC_SET_CONDENSED pr_txchar(0x0f) > > #define PC_SET_NORMAL pr_txchar(0x12) > > > > static int timeaxis; > > > > unsigned char *make_grid_and_frame( int horz_pos, int vert_pos ); > > unsigned char create_data_curve( int pos ); > > > > int print_data( void ) > > { > > int printbyte; > > unsigned char vline8, *grid; > > > > PC_SET_GRLINESPACING; > > // Left margin > > grid = make_grid_and_frame( 0, timeaxis ); > > if (grid[1] != 128) { > > #if (DATA_HORZ_TAB - 4*WIDTH_CHAR -1) < 0 > > #error "***** Not enough space for numeric scale at left edge *****" > > #else > > #if (DATA_HORZ_TAB - 4*WIDTH_CHAR -1) > 0 > > PC_PIXELTAB(DATA_HORZ_TAB - 4*WIDTH_CHAR -1); > > #endif > > #endif > > > > pr_txnum_i( (timeaxis+7-grid[1])/3, 3 ); pr_txchar( 's' ); > > PC_PIXELTAB(1); > > } > > else > > PC_PIXELTAB(DATA_HORZ_TAB); > > > > // Data > > PC_BEGIN_GRA_RMV; > > > > for (printbyte = 0; printbyte<WIDTH_PRINTROW; printbyte++ ) { > > grid = make_grid_and_frame( printbyte, timeaxis ); > > #ifndef COMPILER_BUG // This does not work due to a compiler bug > > grid[0] |= create_data_curve( printbyte ); > > pr_txchar( grid[0] ); > > #else > > vline8 = grid[0]; > > vline8 |= create_data_curve( printbyte ); > > pr_txchar( vline8 ); > > #endif > > } > > pr_txchar( 0 ); > > pr_txchar( 0 ); > > vline8 = create_rmv8( printbyte ); > > pr_txchar( vline8 ); > > pr_txchar( vline8 ); > > pr_txchar( vline8 ); > > PC_CRLF; > > > > timeaxis += 8; > > return HEIGHT_PRINTROW; > > } > > > > --- Listing 2 begins here --------------------------------------- > > .file "bugsdemo.c" > > .arch msp430x147 > > > > /* Hardware multiplier registers: */ > > __MPY=0x130 > > __MPYS=0x132 > > __MAC=0x134 > > __MACS=0x136 > > __OP2=0x138 > > __RESLO=0x13a > > __RESHI=0x13c > > __SUMEXT=0x13e > > > > .data > > .p2align 1,0 > > .type tx0_head,@object > > .size tx0_head,2 > > tx0_head: > > .short tx0_buffer > > .p2align 1,0 > > .type tx0_tail,@object > > .size tx0_tail,2 > > tx0_tail: > > .short tx0_buffer > > .text > > .p2align 1,0 > > .global pr_txchar > > .type pr_txchar,@function > > /*********************** > > * Function `pr_txchar' > > ***********************/ > > pr_txchar: > > /* prologue: frame size = 0 */ > > .L__FrameSize_pr_txchar=0x0 > > .L__FrameOffset_pr_txchar=0x2 > > push r11 > > /* prologue end (size=1) */ > > mov.b r15, r11 > > .L2: > > /* #APP */ > > bic.b #llo(-128), &0x0000 > > /* #NOAPP */ > > cmp.b #llo(0), &tx0_pending > > jne &0x0000 > > mov.b r11, &0x0077 > > mov.b #llo(1), &tx0_pending > > jmp .L4 > > .L3: > > mov &tx0_head, r14 > > add #llo(1), r14 > > cmp #tx0_buffer+10, r14 > > jlo .L5 > > mov #tx0_buffer, r14 > > .L5: > > cmp &tx0_tail, r14 > > jne .L6 > > /* #APP */ > > bis.b #llo(-128), &0x0000 > > /* #NOAPP */ > > cmp.b #llo(2), &curr_pid > > jne &0x0000 > > /* #APP */ > > push r2 > > > > dint > > nop > > > > /* #NOAPP */ > > mov.b #llo(1), &suspended > > mov #llo(2), r15 > > call #proc_suspend > > /* #APP */ > > pop r2 > > > > /* #NOAPP */ > > jmp .L2 > > .L7: > > mov #llo(-1), r15 > > jmp .L1 > > .L6: > > mov &tx0_head, r15 > > mov.b r11, @r15 > > mov r14, &tx0_head > > .L4: > > /* #APP */ > > bis.b #llo(-128), &0x0000 > > /* #NOAPP */ > > mov #llo(0), r15 > > .L1: > > /* epilogue: frame size=0 */ > > pop r11 > > ret > > /* epilogue end (size=2) */ > > /* function pr_txchar size 64 (61) */ > > .Lfe1: > > .size pr_txchar,.Lfe1-pr_txchar > > /********* End of function ******/ > > > > .local count.0 > > .comm count.0,1 > > .p2align 1,0 > > .type rtc_read,@function > > /*********************** > > * Function `rtc_read' > > ***********************/ > > rtc_read: > > /* prologue: frame size = 0 */ > > .L__FrameSize_rtc_read=0x0 > > .L__FrameOffset_rtc_read=0x4 > > push r11 > > push r10 > > /* prologue end (size=2) */ > > cmp.b #llo(0), r15 > > jeq .L12 > > add.b #llo(-1), r15 > > mov.b r15, &count.0 > > jmp .L13 > > .L12: > > add.b #llo(-1), &count.0 > > .L13: > > /* #APP */ > > bic #llo(2), &0x001E > > /* #NOAPP */ > > mov.b #llo(0), r10 > > .L20: > > /* #APP */ > > bis #llo(1), &0x001D > > /* #NOAPP */ > > mov #llo(4), r15 > > call #delay_us > > rla.b r11 > > bit.b #llo(2),&0x001C > > jeq .L18 > > bis.b #llo(1), r11 > > jmp .L19 > > .L18: > > bic.b #llo(1),r11 > > .L19: > > /* #APP */ > > bic #llo(1), &0x001D > > /* #NOAPP */ > > mov #llo(4), r15 > > call #delay_us > > add.b #llo(1), r10 > > cmp.b #llo(8), r10 > > jlo .L20 > > /* #APP */ > > bic #llo(2), &0x001D > > /* #NOAPP */ > > cmp.b #llo(1), &count.0 > > jl &0x001D ; &0x001D > > /* #APP */ > > bis #llo(2), &0x001E > > /* #NOAPP */ > > .L21: > > mov #llo(2), r15 > > call #delay_us > > /* #APP */ > > bis #llo(1), &0x001D > > /* #NOAPP */ > > mov #llo(4), r15 > > call #delay_us > > /* #APP */ > > bic #llo(1), &0x001D > > /* #NOAPP */ > > mov #llo(2), r15 > > call #delay_us > > /* #APP */ > > bic #llo(2), &0x001E > > /* #NOAPP */ > > mov.b r11, r15 > > /* epilogue: frame size=0 */ > > pop r10 > > pop r11 > > ret > > /* epilogue end (size=3) */ > > /* function rtc_read size 61 (56) */ > > .Lfe2: > > .size rtc_read,.Lfe2-rtc_read > > /********* End of function ******/ > > > > .p2align 1,0 > > .global print_data > > .type print_data,@function > > /*********************** > > * Function `print_data' > > ***********************/ > > print_data: > > /* prologue: frame size = 0 */ > > .L__FrameSize_print_data=0x0 > > .L__FrameOffset_print_data=0x4 > > push r11 > > push r10 > > /* prologue end (size=2) */ > > mov.b #llo(27), r15 > > call #pr_txchar > > mov.b #llo(65), r15 > > call #pr_txchar > > mov.b #llo(8), r15 > > call #pr_txchar > > mov &timeaxis, r14 > > mov #llo(0), r15 > > call #make_grid_and_frame > > cmp.b #llo(-128), 1(r15) > > jeq .L25 > > mov.b 1(r15), r15 > > mov &timeaxis, r14 > > sub r15, r14 > > mov r14, r15 > > add #llo(7), r15 > > mov r15, r12 > > mov #llo(3), r10 > > call #__divmodhi4 > > mov r12, r15 > > mov #llo(3), r14 > > call #pr_txnum_i > > mov.b #llo(115), r15 > > call #pr_txchar > > mov.b #llo(27), r15 > > call #pr_txchar > > mov.b #llo(76), r15 > > call #pr_txchar > > mov.b #llo(1), r15 > > call #pr_txchar > > mov.b #llo(0), r15 > > call #pr_txchar > > mov #llo(1), r11 > > .L30: > > mov.b #llo(0), r15 > > call #pr_txchar > > add #llo(-1), r11 > > jeq .L31 > > jmp .L30 > > .L25: > > mov.b #llo(27), r15 > > call #pr_txchar > > mov.b #llo(76), r15 > > call #pr_txchar > > mov.b #llo(49), r15 > > call #pr_txchar > > mov.b #llo(0), r15 > > call #pr_txchar > > mov #llo(49), r11 > > .L36: > > mov.b #llo(0), r15 > > call #pr_txchar > > add #llo(-1), r11 > > jne .L36 > > .L31: > > mov.b #llo(27), r15 > > call #pr_txchar > > mov.b #llo(76), r15 > > call #pr_txchar > > mov.b #llo(-107), r15 > > call #pr_txchar > > mov.b #llo(1), r15 > > call #pr_txchar > > mov #llo(0), r10 > > .L41: > > mov &timeaxis, r14 > > mov r10, r15 > > call #make_grid_and_frame > > mov r15, r11 > > mov r10, r15 > > call #create_data_curve > > bis.b r15, @r11 > > call #pr_txchar > > add #llo(1), r10 > > cmp #llo(400), r10 > > jl .L41 ; .L41 > > mov.b #llo(0), r15 > > call #pr_txchar > > mov.b #llo(0), r15 > > call #pr_txchar > > mov r10, r15 > > call #create_rmv8 > > mov r15, r11 > > call #pr_txchar > > mov.b r11, r15 > > call #pr_txchar > > mov.b r11, r15 > > call #pr_txchar > > mov.b #llo(13), r15 > > call #pr_txchar > > mov.b #llo(10), r15 > > call #pr_txchar > > add #llo(8), &timeaxis > > mov #llo(8), r15 > > /* epilogue: frame size=0 */ > > pop r10 > > pop r11 > > ret > > /* epilogue end (size=3) */ > > /* function print_data size 153 (148) */ > > .Lfe3: > > .size print_data,.Lfe3-print_data > > /********* End of function ******/ > > > > .local tx0_buffer > > .comm tx0_buffer,10,2 > > .local tx0_stop > > .comm tx0_stop,1 > > .local tx0_pending > > .comm tx0_pending,1 > > .local suspended > > .comm suspended,1 > > .local wait_data_flag > > .comm wait_data_flag,1 > > .local timeaxis > > .comm timeaxis,2,2 > > > > /********************************************************************* > > * File bugsdemo.c: code size: 278 words (0x116) > > * incl. words in prologues: 5, epilogues: 8 > > *********************************************************************/ > > > > --- End Of File --------------------------------------- > > > > ------------------------------------------------------- > > This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170 > > Project Admins to receive an Apple iPod Mini FREE for your judgement on > > who ports your project to Linux PPC the best. Sponsored by IBM. > > Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php > > _______________________________________________ > > Mspgcc-users mailing list > > Mspgcc-users@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/mspgcc-users > > > > ------------------------------------------------------- > This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170 > Project Admins to receive an Apple iPod Mini FREE for your judgement on > who ports your project to Linux PPC the best. Sponsored by IBM. > Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users