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