Nie wiem jak fachowo zacytować i odpowiedzieć na komentarz do posta na tym forum to robię to w taki sposób:
Wskaźnik zawiera zawsze adres o takim samym rozmiarze. Bez względu na to czy wskazuje na unię, long long czy obiekt. Unię wprowadzasz tylko po to by zawęzić typy do tych określonych czyli implementujesz bez dodatkowych kosztów ograniczoną i niedoskonałą kontrolę typu której by nie było gdyby był to wyłącznie void *. Dobrze że powiedziałeś że to MCU. To zupełnie inny problem (kombinacje void const i ofsetów struktur). Radzę zerknąć do implementacji portów w CMSIS dla ARM. Robi się to zupełnie inaczej niż Ty chcesz :-) - Mokrowski dzisiaj, 10:13
Implementacja portów:
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
__IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset registerBSRR, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function register, Address offset: 0x20-0x24 */
__IO uint32_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */
}GPIO_TypeDef;
Tak się składa, że kod który piszę ma być na procek pod architekturę ARM (STM32F1). A z przyzwyczajenia z AVR'ów nie przepadam za tymi funkcjami od ST i wole pisać własne funkcje, więc z tymi strukturami dość często obcuję :P. Ale do rzeczy.
To co sugerowałeś Mokrowski moim zdaniem jest najlepszą i najbardziej słuszną opcją. Gdybym to robił sam od podstaw to pewnie tak bym to zorganizował. Jednak nie ja ustaliłem sposób komunikacji, wielkość zmiennych i rozmieszczenie adresów. Po prostu podpinam się do istniejącego już urządzenia i mam zapewnić mu możliwość zdalnego sterowania tym co ja stworze przez jakiś protokół. Co ma swoje plusy i minusy. Największym minusem jest to, że ktoś nie przemyślał adresowania, pokażę to na poniższym przykładzie:
Dla ustalenia uwagi - zmienne/struktury, które przechowują odpowiednie wartości, dalej będę je określał mianem rejestrów.
/\ 1b | 1b | 1b | 1b | 8b | 16b | 4b+/+4b.
! !
Tu początek zmiennej Tutaj koniec
Tu gdzie kończy się zmienna ja mam zmieścić wartość 8bitową stąd 4b+4b. Pewnie zaraz ktoś napisze, abym zmarnował te 4bity i zaczął je zapisywać w innej zmiennej. Ok, w porządku :D. Jednak tu pojawia się inny problem. Jak do tych zmiennych się odnosić skoro adres rejestru nie uwzględnia długości danych. W przypadku powyższego przykładu mam coś takiego:
/\ 1 | 2 | 3 | 4 | 5 | 6 | 7 /
Gdzie kolejne wartości to po prostu adresy pod jakie muszę się odnosić. Ułożenie zmiennych jest strasznie randomowe więc nie da się jakoś łatwo obliczać tego adresu. A ma być to na tyle proste i czytelne, żeby inna osoba, która z tego będzie korzystała bez problemu rozszerzyła tego funkcjonalność. Z flashem i ramem, aż takiej biedy na ARM'ach nie ma, więc ostatecznie skuszę się na opcję stryka, tyle że jednak zdefiniuję sobie te unie. Okazało się, że pracowanie w ten sposób na void'ach w C jest strasznie upierdliwe.
Pozdro, dzięki wam naprawdę za takie zaangażowanie :]