[elektro] C kérdés

Lajos Rancz lajos.rancz at gmail.com
Mon Dec 20 20:03:18 CET 2010


Hello!

Ha jol ertem van tobb fajta uC es te ugyanazt a programot akarod hasznalni
mindegyikhez. tehat futasi idoben akarod eldonteni, hogy melyik kontrolleren
mesz es ennek megfeleloen hasznalni a perfieriakat. (Pl annak erdekeben,
hogy konnyen lehessen tipus valtani, ne kelljen ujra forditni.)
Nem ismerem a uC csaladot, szoval tegyuk fel hogy van az STM32F64 (64 kbyte
FLASH, keves periferia), STM32F128 (128 kbyte FLASH, normal periferia) es
STM32F512 (512 kbyte, gigasok periferia). Valamint van egy struct-od ami
leirja pl az idozitot:
typedef struct {
U32 reg0;
U32 reg1;
U32 reg2;
} TIMER_STRUCT;

Valamint van a define ami beteszi a megfelelo helyre a strukturat.

Ekkor (nem definialjuk felul a gyari includodot):
*mySTM32F64.c:*
#include "STM32F64.h" // gyari header
TIMER_STRUCT * stm32f64_timer = TIMER0; // ezen a kontrolleren a TIMER0-ra
van kotve a bigyo

*mySTM32F128.c:*
#include "STM32F128.h" // gyari header
TIMER_STRUCT * stm32f128_timer = TIMER1; // Ezen a kontrolleren a TIMER1-re
van kotve a bigyo

*mySTM32F512.c:*
#include "STM32F512.h" // gyari header
TIMER_STRUCT * stm32f512_timer = TIMER5; // Itt meg a TIMER5-re

*mycontroller.c:*
extern TIMER_STRUCT* stm32f64;
extern TIMER_STRUCT* stm32f128;
extern TIMER_STRUCT* stm32f512;

TIMER_STRUCT** timer_ptrs[] = {stm32f64, stm32f128, stm32f512};

A hasznalatnal pedig van egy TIMER_STRUCT*-od amit inicializalsz a
timer_ptrs-el es utana az osszes fuggvenyben tudod hasznalni. Ha egy
kontrollercsaladot hasznalsz akkor kizartnak tartom, hogy a TIMEER_STRUCT
mas es mas legyen a kulonbozo tipusokon.

Igy vilagosabb vagy vmit nagyon felreertek? :)

Udv
Lajos

2010/12/20 hg12345 <hg12345 at freemail.hu>

> Szia,
>
> Azt hiszem félre értettél, A #define kifejtésről írtam hogy teljesen
> mindegy, hogy
> A = 0x1000;
> vagy
> #define Aconst 0x1000
> A=Aconst;
>
> Egy gyári include file rendszer van, CMSIS és ennek a gyári kiterjesztése,
> ehhez nem akarok hozzányulni.
> A probléma nem az includokkal van, hanem a linker butaságával.
>
> Vegyesen adták meg az eszköz leíró includokat, a perifériák bázis cimei
> #define határozzák meg, majd a periféria részletes leírása már TYPEDEF
> STRUCT-ként van meghatározva. Van egy komplett library könyvtár az include
> leírásokhoz (STM32Fxxx) ami lassú és nagy ezért nem használom. A library
> könyvtár ezeket a strukturákat mint lokális változó használja, dinamikus
> generálással, hiszen a perifériák megörzik tartalmukat a következő
> hozzáférésig :-)
>
> Amit szerettem volna megoldani (címfordító funkció) egy BASE (#define) +
> OFFSETOF (dinamikus struct) igényel ezt a linker nagy valószinüség szerint
> nem tudja ezért kiabál. megpróbáltam  @(cim) definiálni, de ezt csak int
> változora tudja :-(
>
> igy maradt az offsetof értékek #define való előállítása, de ez kétszeres
> definiálás és ez számomra nem szimpatikus.
>
> A szipla definiálást kerestem, de ennél a rendszernél ez úgy tünik nem
> megoldható
>
>  Üdv
>
>
>
>
>
> írok, mert az elöfeldogozó behelyettesíti még fordítás elött.
>
> Lajos Rancz <lajos.rancz at gmail.com> írta:
> >Hello!>
> >
> Asszem kicsit más nyelvet beszélünk, de megoldjuk :)>
> (1. Már hogy ne lenne, const-ra mutató pointer van, #define-ra (érték)-re>
> nincs)>
> Kezdem érteni, hogy mit akarsz. Én így csinalnám:>
> controller1.c:>
> #include "controller1.h" // gyari header>
> >
> short * controller1_ptrs[] = {>
> ....>
> }>
> >
> controller2.c:>
> #include "controller2.h" // gyari header>
> >
> short * controller2_ptrs[] = {>
> ....>
> }>
> >
> controllern.c:>
> #include "controllern.h" // gyari header>
> >
> short * controllern_ptrs[] = {>
> ....>
> };>
> >
> controllers.c:>
> extern short* controller1[];>
> extern short* controller2[];>
> >
> short ** controllers[] = {>
> controller1,>
> controller2,>
> ....>
> controllern>
> };>
> >
> A trükk, hogy minden controllerx c fájlban egy adott kontrollerhez tartozó>
> header van beinkludolva, így az annak megfelelő pointer értékek lesznek a>
> táblában. Utána a táblákat összefogod egy nagy táblában (short pointerre>
> mutató pointer).>
> >
> Üdv,>
> Lajos>
> >
> 2010/12/19 hg12345 <hg12345 at freemail.hu>>
> >
> > Szia!>
> >>
> > Köszönöm, hogy segíteni próbálsz.>
> >>
> > Mint sejtettem, sajnos ez a megoldás se tökéletes :-(>
> > 1, a #define és a konstans között nincs semmi különbség, mert az>
> > elöfeldolgozó még fordítás elött a valódi értékeket előállítja>
> > 2, sajnos igy értéket adni egy struktura tömbre mutató pointernek nem>
> > lehet, mert struktura tömbre mutató pointer castolást igényel.... a sima>
> > mezei konstans nem emészti.>
> > 3, a fentiek miatt az eredmény ugyan az.>
> >>
> > Ez a megoldás nem volt szimpatikus, a kód hordozhatóságát nem segíti
> elő,>
> > más eszköz esetén ez elképzelhető más perifériához kapcsolódik... Amit>
> > kiítam az csak a kód lényeges része, több periféria előválasztó
> tartalmaz.>
> >>
> > Szerintem a hiba leginkább a linker butaságára vezethető vissza amikor
> nem>
> > képés két pointer összadni, csak pointer + konstans müveltet ismer. (A
> GNU-c>
> > leginkább ilyenkor kiabált)...>
> >>
> > De minden ötletre kiváncsi vagyok.....>
> >>
> >>
> >>
> > Info <info at kiralyelektronika.hu> írta:>
> > >Szia !>>
> > >>
> > > TIM_TypeDef *TIMbase = TIMbaseAddr;  //Én globál változóként>>
> > >                                használom, és müködik a programban.>>
> > > ..\HWlayer\It_TimerBase.c(97): error:  #28: expression must have a>>
> > >                                constant value>>
> > >>
> > Naszal, innentől nem adhatod meg konstansnak, csak #define.>>
> > Vagy ezt alakítod át #define, aztán lehet konstans.>>
> > >>
> > Most tehát ez van:>>
> >   TIM_TypeDef *TIMbase  =  0x40000000;>>
> > >>
> > >>
> > Ez a sor nem kell:>>
> >  TIM_TypeDef     *TIMbase = TIMbaseAddr;>>
> > >>
> > Ezt pedig így:>>
> >  #define  HwPwm1Reg      (TIMbaseAddr.CCR2)>>
> >  #define  HwPwm2Reg      (TIMbaseAddr.CCR3)>>
> >  #define  HwPwm3Reg      (TIMbaseAddr.CCR1)>>
> > >>
> > >>
> > ----------------------------------------->>
> >          elektro[-flame|-etc]>>
> >>
> > ----------------------------------------->
> >          elektro[-flame|-etc]>
> >>
> ----------------------------------------->
>          elektro[-flame|-etc]>
>
> -----------------------------------------
>          elektro[-flame|-etc]
>


More information about the Elektro mailing list