[elektro] C kérdés

hg12345 hg12345 at freemail.hu
Tue Mar 23 10:48:09 CET 2010


Szia!

Ennél összetettebb a probléma, egy TIMER és CAPTURE kell egyszerre lekezelni, a program jelentős része közös, most sok ugrálást tartalmaz.
a kód méretét szeretném kicsiben tartani. (kb 80-150 C sor). Első nekifutásra egy subrutint hívott, de itt  8 általános célú regiszter mentése nem tetszett. (Arra még nem jöttem rá, hogyan tudom megmondani a fordítónak, hogy az adott subrutin melyik regisztereket használja)

Én megértem a f(ordító) program fejlesztőket, hogy szeretnének minél több féket elhelyezni a hibák kikűszöbölésére. Inkább tanítani kéne.... 

Tökéletes megoldás nincs, de "__preprologue__" már használható eredményt ad. 

A legszörnyűbb az, hogy ez ASM-ben egy sor, C-ben még megoldhatatlan....


   <elektro at tesla.hu>, ezt írta: 
  
  Helló!

Most jutott eszembe: makró nem jó neked? Vagy kicsinek meg gyorsnak is kell
lennie? :)

Üdv,
Lajos

2010/3/17 hg12345 <hg12345 at freemail.hu>

> Elnézést küldés után a WEBMAIL szerkesztő kiveszi a sortördelést :-( Ez nem
> 8 bites variáns, hanem 16 bites, ezért a IT kezelője egy kicsit összetettebb
> mint a 8 biteseké inkább a 32 bitesekhez hasonlít. Több 100 IT vektor van a
> kód memória elején, ez még nem lenne probléma. Az IT megírása C-ben itt már
> nem akkora probléma mint a 8 bites eszközöknél, optimalizált esetben elég jó
> minőségű kódot generál, a hordozhatóság miatt maradnék a C-nél.Tudom nem egy
> gyakori probléma, hogy két teljesen eltérő IT forrásból jó megszakítást kell
> egy azonos programmal feldolgozni, de van ilyen. Erre a programra (rutinra)
> kéne két IT vektort beállítani. A linkerscript-ben a nevek feltételezve
> vannak, ha nem az előre elképzelt nevet használod, akkor a DEFAULT IT
> vektorral helyettesíti. (Így nem kell 114db nem használt  IT rutin
> definiálni :-().A gyári linkerscripthez nem akarok hozzányúlni, de ezt a
> rész nem tudom hogyan lehet egy saját előzőleg futtatott linkerscipttel
> felülírni. Marad az a C és az ASM. C-ben : void
> __attribute__((interrupt,no_auto_psv, )) _T2Interrupt(void) {......};void
> __attribute__((interrupt,no_auto_psv, )) _T3Interrupt(void); Én semmi mást
> nem szeretnék, csak a T3 It-nek ne legyen teste csak címe és az azonos
> legyen a T2 rutinéval.Na ez ahol szerény C tudásom elvérzik. Nekem nem
> sikerült a következő megadás void __attribute__((interrupt,
> address(_T2Interrupt))) _T3Interrupt(void);  elvileg így lehetni egy  címet
> megadni, de az interrupt-tal együtt nem működik, vagy rosszul használom.  Ha
> írók egy közös szubrutint mint egy lehetséges megoldás, akkor bizony az IT
> latency megnő, ráadásul ezek a rendszer ben a legmagasabb piorításúak..... A
> szubrutin hívás miatt a 8 általános regisztert elnyomja a stackre..... Másik
> lehetőség amit a C megenged, hogy ez IT-ből meghívom szubrutinként a másik
> IT-t, erre még nem is kiabál, de korrekten mind a 8 általánosan használt
> regiszter nagy sietségben elteszi a stackre. Sajnos az optimalizáció ezekre
> nincs felkészítve, ezek kód részletek ha kell ha nem, benne maradnak. ASM
> nem találtam olyan parancsot, hogy egy egy globál definiciójú nevet egy
> extern definicójú névvel azonos címre állítsak.  Jelenleg itt tartok.    Üdv
> .
>
> "Gál Zsolt" <tralitoverin at gmail.com> írta:
> >Hát... elég zavaros számomra a kérdés, de azért annyit csak írok hozzá,
> hogy
> >talán nem kellene ennyire belebonyolódni.
> >Ha jól értem, akkor valamilyen PIC-ről méghozzá 18-as sorozatról írsz. Én
> az
> >SDCC-t használtam eddig és ott  arra jöttem rá, hogy a megszakítási rutint
> >érdemes inkább asm-be megírni. Szóval én azt javasolnám. Aztán majd
> >összelinkeled az objektumokat.
> >
> >2010/3/17 hg12345 <hg12345 at freemail.hu>
> >
> >> Hi! Hogyan lehet egy meghatározott függvényhívási, interrupt névhez
> >> érvényes definiciót és címet generálni?A nevek a linkerscriptben már
> >> leírtak, ha nincsenek definiálva akkor DefaultIT helyettesítődnek.Ehez a
> >> részhez nem szeretnék hozzá nyúlni. Az függvény/IT -t definiálnám és
> >> megírnám ez egyik név alatt, a másikat meg ehhez hozzárendelném.
> Definiálnám
> >> a nevet és a címet!  Az ami nem megy, C forrás szinten (GNU C variáns
> MPLAB
> >> C30). pl.:  IT1 és IT2 linkerscriptben ide használt nevek ettől nem
> lehet
> >> eltérni.... void __attribute__((interrupt,no_auto_psv)) _IT1(void){
> >> //feldolgozó program} ez nem müködik:void
> >> _-attribute__((interrupt,address(_IT1) _IT2(void);  Ez megoldható C-ben?
> >> -----------------------------------------
> >>          elektro[-flame|-etc]
> >>
> >
> >
> >
> >--
> >~~~~~~~~~~~~~~~~
> >http://galzsolt.zzl.org
> >-----------------------------------------
> >          elektro[-flame|-etc]
> -----------------------------------------
>          elektro[-flame|-etc]
>
-----------------------------------------
          elektro[-flame|-etc]



More information about the Elektro mailing list