[elektro] C kérdés
hg12345
hg12345 at freemail.hu
Mon Dec 20 17:13:00 CET 2010
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]>
More information about the Elektro
mailing list