[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