Hey Hauke,

I have a hard time to believe that a modern compiler makes worse
code for bitfields. Volatile or otherwise.

When I convert sam21_common spi.c to use the bitfields, the code
becomes 4 bytes less.

Of course it is a different story if you want to modify several bits together.
Splitting it, just to use the bitfields can increase the code size.
-- Kees


On 27-10-16 09:05, Hauke Petersen wrote:
Hi Neil, hi Kees,

though named bitfields are kind of nice when it comes to code readability, they behave very poorly when it comes to code size. This is especially true for register maps, as these are typically volatile. For this reason, we don't use them in RIOT and I strongly advice not to use those.

As example I was able to save several 100 bytes of ROM when removing the named bitfield use from the samr21s peripheral drivers.

Cheers,
Hauke



On 26.10.2016 21:24, Kees Bakker wrote:
On 26-10-16 16:52, Neil Jones wrote:
Hi,

What is RIOT's position on using named bitfields for register
definitions ? I know they are frown upon as there are no endian
guarantees in the C standard, personally I don't use them, but the PIC32
device files supplied by Microchip do include bitfield structures for
most registers so could make life easier ? (thankfully there are #define
for most register fields too, if the answer is not to use them).

I can't speak for RIOT, but personally I don't have a problem with them
when they are used for register definitions.

And I know that SAMD21 uses them too in Atmel's CMSIS include files.

In many cases it makes the code much nicer. That doesn't mean the
SAMD21 already uses them a lot. For example, we currently have code
like

    dev(bus)->CTRLA.reg |= SERCOM_SPI_CTRLA_SWRST;
    while ((dev(bus)->CTRLA.reg & SERCOM_SPI_CTRLA_SWRST) ||
           (dev(bus)->SYNCBUSY.reg & SERCOM_SPI_SYNCBUSY_SWRST));
    ...
    while (!(dev(bus)->INTFLAG.reg & SERCOM_SPI_INTFLAG_DRE)) {}
    ...
    dev(bus)->CTRLA.reg &= ~(SERCOM_SPI_CTRLA_ENABLE);


which could use bitfields and be written like this

    dev(bus)->CTRLA.bit.SWRST = 1;
    while ((dev(bus)->CTRLA.bit.SWRST) ||
           (dev(bus)->SYNCBUSY.bit.SWRST)) {}
    ...
    while (!(dev(bus)->INTFLAG.bit.DRE)) {}
    ...
    dev(bus)->CTRLA.bit.ENABLE = 0;


_______________________________________________
devel mailing list
[email protected]
https://lists.riot-os.org/mailman/listinfo/devel


--
Kees Bakker
Founder
SODAQ
M. 0031617737165
www.sodaq.com

_______________________________________________
devel mailing list
[email protected]
https://lists.riot-os.org/mailman/listinfo/devel

Reply via email to