avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] 24 bits (u)ints


From: Diogo Martins Silva
Subject: Re: [avr-gcc-list] 24 bits (u)ints
Date: Wed, 30 Nov 2016 20:08:27 -0200

Thanks, guys.

I asked because I tried a code snippet, but was getting errors.

I found later that the errors came from my IDE's code analysis, not the
compiler. The code works fine.

Thumbs up for the assembly examples!

Diogo


On Wed, 2016-11-30 at 14:14 +0100, Georg-Johann Lay wrote:
> On 30.11.2016 08:40, Diogo Martins Silva wrote:
> > Hello all.
> >
> > The avr-gcc wiki (https://gcc.gnu.org/wiki/avr-gcc) lists 24 bits
> > (u)ints as an extension since version 4.7. How do I use them?
> >
> > Thanks
> >
> > Diogo
> 
> You can use it basically like any other integer type, for example:
> 
> 
> __uint24 mul24 (unsigned char a, unsigned int b)
> {
>      return (__uint24) a * b;
> }
> 
> __int24 get_val24 (const __flash __int24 vals[], unsigned char pos)
> {
>      return vals[pos];
> }
> 
> For a MCU with MUL, this gives
> 
> mul24:
>       mul r24,r22
>       movw r18,r0
>       mul r24,r23
>       add r19,r0
>       mov r20,r1
>       clr __zero_reg__
>       adc r20,__zero_reg__
>       mov r24,r20
>       movw r22,r18
>       ret
> 
> get_val24:
>       ldi r18,lo8(3)
>       mul r22,r18
>       add r24,r0
>       adc r25,r1
>       clr __zero_reg__
>       movw r30,r24
>       lpm r22,Z+
>       lpm r23,Z+
>       lpm r24,Z
>       ret
> 
> When you are passing a 24-bit value to a variadic function like printf, 
> you have to cast it to (un)signed long by hand; avr-gcc does not 
> automatically promote such types to 32-bit types.  printf et al. have no 
> format specifiers for 24-bit types.
> 
> Johann
> 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]