Bitove polia v C

Josef Štengl ok1ced na nagano.cz
Pátek Duben 6 16:45:13 CEST 2012


Dne 6.4.2012 15:47, Stano napsal(a):
> Dobry den
> Este oprasim tuto temu.
> Jeden zo sposobou ako vyuzivat bitband ako pisal vyssie map Povalac, s
> vyuzitim makra
>
> #define BitBand(VarAddr, BitNumber) \
> (*(__IO uint32_t *) (SRAM_BB_BASE + \
> (((uint32_t)(&VarAddr) - SRAM_BASE) << 5) + \
> ((BitNumber) << 2)))
>
>
> Druhy sposob, pomocou struktury:
> typedef struct {
> unsigned int b0 : 1;
> unsigned int b1 : 1;
> unsigned int b2 : 1;
> unsigned int b3 : 1;
> } bity;
>
> Otazka je ktory z tychto sposobov je vhodnejsi na prenasanie informacie
> z/do interruptu.
podle mě, pokud se jedná o bitovou paměť (pokud ne a jedná se o zápis do 
registrů tak také) tak jedině první způsob. Druhý nemusí fungovat, viz níže.

> Je mozne nejako compileru napovedat aby pouzil bitove operacie pre
> pripad zo strukturou, je nejaky sposob ako zabezpecit aby aj v tomto
> pripade boli operacie atomicke?

atomické operace se snad řeší až v C11 (nečetl jsem zatím), jinak se ji 
musíte zajistit sám a doufat že správně (co s tím udělá kompilátor a 
pipe-line a ostatní v CPU je docela pěkná zábava. Jen si v životě 
nějakou tu zábavu musíme odpustit, není čas :-).

> A posledna otazka. Zarovnanie dat, ak do strukturi pridame napriklad:
> > typedef struct {
> char data8;
> unsigned int b1 : 1;
> ...
> Da sa a ak tak ako zabezpecit aby bitove premenne nezdielali tu istu
> 32bit pamatovu adresu ako 8bitova premenna.

Nedá, ani kdyby to byl union. Dá se to vyzkoušet, ale je to silně 
závislé na implementaci v kompilátoru a ještě to může záviset na 
optimalizaci. Ono to pravdě podobně s unionem bude fungovat, jen to 
nesmíte psát pro litte a big endian procesory zároveň ;-)

citace z ISO/IEC 9899:1999 (C99, C11 nemám, pro mě drahá:-)
6.7.2.1 Structure and union specifiers
bod 10

An implementation may allocate any addressable storage unit large enough 
to hold a bit-
field. If enough space remains, a bit-field that immediately follows 
another bit-field in a
structure shall be packed into adjacent bits of the same unit. If 
insufficient space remains,
whether a bit-field that does not fit is put into the next unit or 
overlaps adjacent units is
implementation-defined. The order of allocation of bit-fields within a 
unit (high-order to
low-order or low-order to high-order) is implementation-defined. The 
alignment of the
addressable storage unit is unspecified.


ehm...
Ono se dá obejít buď unionem - proměnná  + struktura s bitovým polem, 
nebo struktura a pointer na promměnnou o správné velikosti s adresou 
struktury, ale je učebnicový příklad toho, jak se to NEMÁ dělat.

> Dakujem za odpovede pripadne za akekolvek navedenie spravnym smerom ako
> bezpecne predavat data z/do interruptu.
> Architektura je cortexM3 ale tieto problemy su platne vseobecne.
>
jediný způsob který mi napadá je při práci s proměnnou zakázat interrupt 
a říci shleduleru aby nepřepínal (měla by na to být nějaká funkce). Pak 
zapsat a povolit zakázané.

> S pozdravom
> Stano
> _______________________________________________

ced


Další informace o konferenci Hw-list