Hello,
I think I have found a bug in mspgcc:
I'm using Windows XP
I'm using prebuilt installer msp430-toolchain-win32-20030210.exe
I use a MSP430F149
I compile every c file with the following rule :
%.o: %.c
msp430-gcc -g -mmcu=msp430x149 -O3 -c -I./include -o $@ $<
dword is defined as follows:
typedef unsigned long int dword;
this is the code for cpu_demand (it doesn't do anything but the
generated code is correct)
dword cpu_demand(dword t, word taskcount, OS_Task_Specification *spec)
{
word i;
dword sum=0,tmp;
sum=0x12345678;
return (dword) sum;
}
000069fe <cpu_demand>:
69fe: 3e 40 78 56 mov #22136, r14 ;#0x5678
6a02: 3f 40 34 12 mov #4660, r15 ;#0x1234
6a06: 30 41 ret
demand is a global variable defined as:
dword demand;
and its location is:
0000066c g O .bss 00000004 demand
What I want is to execute the following line of code:
demand=cpu_demand((dword) SHELL_PERIOD,1,(OS_Task_Specification
*)taskspec);
This results in the following code:
8768: 3c 40 86 86 mov #-31098,r12 ;#0x8686
876c: 1d 43 mov #1, r13 ;subst r3 with As==01
876e: 3e 40 20 03 mov #800, r14 ;#0x0320
8772: 0f 43 clr r15 ;
8774: b0 12 fe 69 call #27134 ;#0x69fe
8778: 82 4f 6c 06 mov r15, &0x066c ;
877c: 92 42 6c 06 6e 06 mov &0x066c,&0x066e ;src addr 0x066c
8782: 92 52 6e 06 6e 06 rla &0x066e ;
8788: 92 72 6e 06 6e 06 subc &0x066e,&0x066e ;src addr 0x066e
878e: b2 e3 6e 06 xor #-1, &0x066e ;subst r3 with As==11
Since the global defined var demand resides at 0x066c
I expect that with the following prototype:
extern dword cpu_demand(dword t, word taskcount,
OS_Task_Specification *spec);
the value of r14 (lsw) is written at 0x066c and the value of r15 (msw)
at 0x066e
This however not the case (see code)
If I use the global var demand afterwards the value it contains is
0000:msw instead of msw:lsw
Maybe I'm doing something realy stupid....
regards,
Tjerk Hofmeijer
[email protected]