Bitove polia v C

Jan Waclawek konfera na efton.sk
Středa Duben 4 17:18:39 CEST 2012


Tak toto zhodou okolnosti nema s bitovymi polami v C nic spolocne, len slovo "bit".

Jadro ARM Cortex-M3 ktore je (ak sa nemylim) pouzite v spomenutom mcu, ma implementovane tzv. bit-banding, co znamena, ze jednotlive bity z urcitej pamatovej oblasti sa daju citat/zapisovat po jednom citanim/zapisovanim celych slov v inej oblasti. 

bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)

Detaily najdete v Reference Manual (RM0008) od ST a v  Cortex-M3 Technical Reference Manual od ARMu.

Navonok sa teda jedna o vykonanie jednej instrukcie, interne vsak hardware na rozhrani procesora a zbernice AHB vykona operaciu read-modify-write (ak sa jedna o pisanie) resp. read-mask (ak sa jedna o citanie). Toto je neprerusitelna ("atomicka") operacia.

V C teda jednoducho pisete 32-bitovu 0x00000000 alebo 0x00000001 na horeuvedenu premapovanu adresu bit_word_addr (vyrobite si podla uvedeneho vzorca smernik a do neho zapisete).

Upozornujem vsak na jeden zaujimavy gotcha - aj ked je ta operacia neprerusitelna, nie je zarucene, ze sa z hladiska casovania vykona uplne presne tak, ako by si clovek predstavoval. Je to nasledok toho, ze tie ARMy nie su mikrokontrolery ale SoC, t.j. procesor zlepeny s periferiami roznymi medzikusmi na jednom cipe, pricom tie medzikusy su zlozite a ich presne casovanie nie je zverejnene a nemusi byt uplne priamociare. Pri hratkach s LPC17xx som napriklad zistil, ze ked som cez bit-banding robil bit-banged (naschval som pouzil tento davno zauzivany a podobne znejuci vyraz, aby bolo jasne co si myslim o idiocii ARMovskeho nazvu pre to bitove premapovanie) SPI, tak sa mi pri urcitom poradi instrukcii menili dva piny (dva bity z jedneho wordu prisluchajuceho danemu vystupnemu portu) naraz, aj ked som ich menil dvomi roznymi instrukciami ktore dokonca ani nenasledovali tesne za sebou. Ten bit-bandovaci medzikus zrejme pri prvej instrukcii urobil to "read" z "read-modify-write", 
 ale skor nez stihol nastat "write" prisla poziadavka na "read-modify-write" pre ten isty word (pricom tie medzilahle instrukcie fungovali len na registroch procesora, cize sa tym z pohladu periferii nic nepokazilo), a tak medzikus uz nerobil dalsi "read" ale len dalsie "modify" a potom to finalne "write" zahrnujuce obe zmeny.


wek


>Zdravim konferenci
>Podobna tema sa tu pravdepodobne prebelala ale opakovanie je matka mudrosti.
>Prosim, existuje nejaky standardny zapis v C ako implementovat bitove 
>pole? Bezne pouzivam maskovanie a rotaciu ale vzhladom na to ze pouzity 
>MCU (STM32F103) obsahuje bitovu pamat, rad by som ju vyuzit.
>Problem je ze potrebujem aby dana implementacia bola zarucene atomicka.
>
>Dakujem za rady
>Stano



Další informace o konferenci Hw-list