Miert lenne elszallt meg orultseg a struktura, strukturatomb? Az a legegyszerubb reprezentacioja valami memoriaban vagy memoria-szeru objektumban lakozo entitasnak, peldaul egy adott periferia MMIO regisztereinek. Fogod, veszed a data sheet-et, reprezentalod egy strukturaban/objektumban, pontosan ugy nevezed el a membereket ahogy a data sheet-ben van, opcionalisan osszeejted anonymous union-okon keresztul ha van szamottevo bitfield is (miert ne, nem ker enni, se a kod, se a memoriafoglalas nem lesz ettol nagyobb, cserebe kevesbe lesz write-only a program), es pontosan ugy programozod ezek utan ahogy le van irva a gyari doksiban. Pelda: stm32f0xx.h. Es a peripheral base address-t passzolgatod at a hardware abstraction layer-nek mint strukturapointer, attol fuggoen hogy melyik periferiaval is dolgozol a sok kozul. Enelkul hogy csinalnad meg hogy pl ugyanaz a layer 3+ absztrakcio van mondjuk egy dual UART rendszerben, mondjuk interrupt handler eseten? Pl:
__attribute__ (( interrupt(USCI_A2_VECTOR) )) void USCI_A2_ISR (void)
{
UART_handler(&rs485_uhs,UCA2);
}
__attribute__ (( interrupt(USCI_A3_VECTOR) )) void USCI_A3_ISR (void)
{
UART_handler(&debug_uhs,UCA3);
}
Ahol az UCA2 es az UCA3 egy USCI_UART* tipusu pointer:
typedef struct
{ volatile uint16_t CTLW0;
volatile uint16_t CTLW1;
volatile uint16_t __padding_1;
volatile uint16_t BRW;
volatile uint16_t MCTLW;
volatile uint16_t STATW;
volatile uint16_t RXBUF;
volatile uint16_t TXBUF;
volatile uint16_t ABCTL;
volatile uint16_t IRCTL;
volatile uint16_t __padding_2[3];
volatile uint16_t IE;
volatile uint16_t IFG;
volatile uint16_t IV;
} USCI_UART;
es a megfelelo MMIO cimre mutat.
Aztan innentol kezdve ez a "miert is dolgozunk ugy ahogy strukturatombokkel", meg aztan "miert is jo szorozni, foleg ha van szorzas" mar viszonylag konnyen megvalaszolhato kerdes :)