On Wed, Jul 22, 2009 at 4:06 AM, Rainer Haape <[email protected]> wrote:

> Hello,
> I have a problem with iomacros.h under linux with the latest Versions of
> mspgcc.
> All ioregisters seem to be 16 Bit instead of 8 Bit, so all but one adresses
> are wrong.
> The following lines in c:
>
> #include <msp430x16x.h>
> #include <iomacros.h>
>
> int main (void)
> {
>  char i;
>  i = port1.in.pin1;            // 0x0020
>  port1.out.pin1 = 1;           // 0x0021
>  port1.dir.pin1 = 1;           // 0x0022
>  i = port1.ifg.pin1;           // 0x0023
>  port1.ie.pin1 = 1;            // 0x0025
>  port1.ies.pin1 = 1;           // 0x0024
>  port1.sel.pin1 = 1;           // 0x0026
> }
>
> were compiled to:
> --- snip ---
>
> int main (void)
> {
>    4036:       31 40 00 39     mov     #14592, r1      ;#0x3900
>  char i;
>  i = port1.in.pin1;
>    403a:       e2 b3 20 00     bit.b   #2,     &0x0020 ;r3 As==10
>    403e:       4f 43           clr.b   r15
>    4040:       4f 63           adc.b   r15
>  port1.out.pin1 = 1;
>    4042:       e2 d3 22 00     bis.b   #2,     &0x0022 ;r3 As==10
>  port1.dir.pin1 = 1;
>    4046:       e2 d3 24 00     bis.b   #2,     &0x0024 ;r3 As==10
>  i = port1.ifg.pin1;
>    404a:       e2 b3 26 00     bit.b   #2,     &0x0026 ;r3 As==10
>    404e:       4f 43           clr.b   r15
>    4050:       4f 63           adc.b   r15
>  port1.ie.pin1 = 1;
>    4052:       e2 d3 2a 00     bis.b   #2,     &0x002a ;r3 As==10
>  port1.ies.pin1 = 1;
>    4056:       e2 d3 28 00     bis.b   #2,     &0x0028 ;r3 As==10
>  port1.sel.pin1 = 1;
>    405a:       e2 d3 2c 00     bis.b   #2,     &0x002c ;r3 As==10
> }
>
> --- snip ---
>
> What is going wrong?
>
> Thank you in advance,
> Rainer Haape
> [email protected]
>
>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Mspgcc-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users
>


I built the mspgcc toolchain on a Debian(Lenny) setup a few days ago, but
hadn't tried it out until I saw your message.

I got the same results you did, but after poking around the code a little I
don't think there's anything wrong in iomacros.h.  Instead, it looks like
for some reason the ioregister_t union from msp430/iostructures.h is getting
compled to twice the expected size.

#include <msp430/iostructures.h>

void main (void)
{
  char i;
  i=sizeof(char);
  i=sizeof(ioregister_t);
}

compiles to:

void main (void)
{
    fc36:       31 40 7e 02     mov     #638,   r1      ;#0x027e
    fc3a:       04 41           mov     r1,     r4
  char i;
  i=sizeof(char);
    fc3c:       d4 43 00 00     mov.b   #1,     0(r4)   ;r3 As==01,
0x0000(r4)
  i=sizeof(ioregister_t);
    fc40:       e4 43 00 00     mov.b   #2,     0(r4)   ;r3 As==10,
0x0000(r4)
}

googling for mspgcc union errors gave me a bunch of reports of misaligned
int reads from int/char unions, but nothing about the size of the union
going haywire.

Has anyone else seen/fixed this?

Thanks,
Steve

Reply via email to