pole bitového pole v C

Miroslav Mraz mraz na seznam.cz
Sobota Leden 12 17:41:33 CET 2013


Tohle jsem taky řešil a dospěl jsem v podstatě ke stejnému výsledku. Lze
to udělat i jinak, ale tohle je asi nejlepší. Pro úplnost -

1.Napsat to celé v C++, pole bitů jako class, přetížit potřebné
operátory včetně []. Pak se s tím pěkně pracuje, ale bude to možná
trochu problém např. zapouzdřit do struktury. Neřeší to jednotlivé
bitové proměnné, jen pole.

2.Použít procesor s plnohodnotným jádrem Cortex-M3 a nedělat si s tím
problémy - pracuje se s bitem úplně stejně jako s plným slovem 32-bit,
hodnota je vyjádřena 0.bitem. Tedy on tam problém je a ne jeden.
- linker skript (nebo něco jiného) musí zaručit, aby se proměnné v
bitové oblasti nepřekrývaly s jinými.
- do struktury to nezapouzdříte spolu s jiným typem proměnné ani
náhodou. Nebo prostě nevím jak na to.
- ne každý CM3 to podporuje. Např. LPC13xx v dokumentaci (převzaté
doslova od ARM) píše, že ano, ale v dané oblasti paměťového prostoru
prostě žádná paměť není.
Zase to má tu výhodu, že můžete dělat pole i jednotlivé proměnné a budou
v paměti adresovány opravdu po bitech.

Mrazík

Jan Waclawek píše v So 12. 01. 2013 v 15:45 +0100:

> #include <stdint.h>
> uint8_t bits[3]
> 
> void SetBit(uint8_t * bitfield, uint8_t idx, _Bool value) {
> uint8_t mask;
>   mask = 1 << (idx % 8); 
>   if (value) {
>     bitfield[idx / 8] |= mask;
>   } else {
>     bitfield[idx / 8] &= (~mask) & 0xFF;
>   }
> }
> 
> _Bool GetBit(uint8_t * bitfield, uint8_t idx) {
>   return (_Bool)(bitfield[idx / 8] & (1 << (idx % 8))
> }
> 
> wek
> wek
> _______________________________________________




Další informace o konferenci Hw-list