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