STM32F0 periph. library
Josef Štengl
ok1ced na nagano.cz
Středa Červenec 16 10:32:32 CEST 2014
Pokud myslíte ten kód v main() a ne tu union-bitové pole hrůzu*, tak je to asi lepší řešení. Tedy
+ je to nezávislé na endianitě (pokud pracujete s BiEndian procesorem (například arm) a překládá se to podle projektu,
tak je to nutnost – jinak by jste musel definovat bitová pole 2x)
+ kompilátor to má šanci rozumě zoptimalizovat
+ dá se to číst
- pro nastavení jednotlivých bitů je nutno definovat makro/funkci.
Používat k těmto účelům enum je hazard s infarktem. C definuje enum jako int (problém s nastavením nejvyššího bitu pro
unsigned registy) a překladače jsou přednastaveny všelijak - většinou packed (velikost typu podle hodnot v enumu +
signed/unsigned), což přináší takové zajímavé varování kompilátoru a statické analýzy kódu - většinou jsou v rozporu a
občas i v chování.
Mimochodem místo definování OR bych použil knihovnu <iso646.h>. Ale chápu, že je makra jsou tam definována malými písmeny :-)
Pro mě je elegantní definovat:
- registr o celé šířce
- konečné pozice jednotlivých složek bitů
- makro na skládání/pozici
zjednodušený příklad:
#define DEV_CTRL_A 0u
#define DEV_CTRL_B 1u
#define DEV_CTRL_C 3u
#define rbval(val, bitpos) ((uint32_t)val << bitpos)
volatile struct dev
{
uint32_t ctrl;
uint32_t set;
uint32_t clr;
...
}
dev;
dev.ctrl = rbval(0u, DEV_CTRL_A)
| rbval(3u, DEV_CTRL_B)
| rbval(1u, DEV_CTRL_C)
| rbval(1u, 6u) /* kdo by se s tím psal .. */
Ano, je otázkou, jak jsou zpracované dodané knihovny registrů.
.. a je docela pracné napsat ty pozice bitů.
ced
* opravdu mě nebaví se dívat co z toho kompilátor na které architektuře vytvoří a při jaké optimalizaci a verzi. Je to
zvrácenost jako mrkev s bramborami (tedy pro mě :-).
Dne 15.7.2014 21:43, Miroslav Mraz napsal(a):
> Dá se to vyřešit i jinak viz příloha. Moc se mi to ale taky nelíbí.
>
> Mrazík
>
> On 07/15/2014 04:52 PM, Jan Waclawek wrote:
>>> Ale zase tak moc dobrý nápad to není, kdy¾ pou¾iji typ enum, zkrácený
>>> jen na potøebný poèet bitù, default je interpretován jako byte, co¾
>>> nefunguje (pøekladaè pou¾ije ldrb, strb a to se asi pro ètení/zápis
>>> registru nehodí, blí¾ jsem to nezkoumal),
>> V RMxxxx na zaciatku kazdej podkapitoly popisujucej registre danej
>> periferie (co je vzdy posledna podkapitola kapitoly pre danu periferiu) je
>> jasne napisane, ako sa da k registrom pristupovat. Niekde je to dokonca
>> priamo pri popise jednotlivych registrov. Niekedy to tam nie je, co je
>> znamka ze dana kapitola je odflaknuta este viac nez ten zvysok... :-|
>>
>> Dost casto nie je mozne pristupovat bytovo, ale nie je to 100% pravidlo.
>> Tie definicie v stm32XXxx.h nie su urobene nahodne.
>>
>> (Aj) kvoli tomuto sa drzim stm32XXxx.h, aj ked spociatku som mal tiez
>> nutkanie si urobit bitove polia. Mozno to nie je najkrajsie, ale ja to
>> teraz robim takto:
>>
>> #define OR |
>> #define FPLED_USART USART2
>>
>>
>> FPLED_USART->CR2 = 0
>> OR ( 0 * USART_CR2_ADD_0 ) /* Address of
>> the USART node */
>> OR ( 0 * USART_CR2_LBDL ) /* LIN Break
>> Detection Length */
>> OR ( 0 * USART_CR2_LBDIE ) /* LIN Break
>> Detection Interrupt Enable */
>> OR ( 1 * USART_CR2_LBCL ) /* Last Bit
>> Clock pulse */
>> OR ( 0 * USART_CR2_CPHA ) /* Clock Phase */
>> OR ( 0 * USART_CR2_CPOL ) /* Clock
>> Polarity */
>> OR ( 1 * USART_CR2_CLKEN ) /* Clock Enable
>> */
>> OR ( USART_CR2_STOP__1_BIT * USART_CR2_STOP_0 ) /* Bit 0 */
>> OR ( 0 * USART_CR2_LINEN ) /* LIN mode
>> enable */
>> ;
>>
>> Akurat mi vadi, ze v stm32XXxx.h nie su definovane hodnoty bitove polia, A
>> ZAS A ZNOVA VYUZIVAM TUTO PRILEZITOST ABY SOM POPROSIL PRITOMNYCH Z ST ABY
>> SA ZASADILI ZA TO ABY TO TAM BOLO DOROBENE. Dakujem.
>>
>> wek
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list