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