Ez nem semmi

VF vf at elte.hu
Mon Feb 16 16:51:24 CET 2004


Thus spake Füzesi Arnold <arno at freemail.hu>:

> Az hogy bemasoltam egy kodreszletet, meg semmit nem jelent.

:))

> Egy nyamvadt iom128.h file-t nem tudsz megerteni hogy muxik, es sirankozol
> ossze-vissza.

Ha nem ertettem volna meg, hogy csinaltam volna meg mukodore szerinted?
A problema ennel kicsit komplikaltabb. Leirom, hatha akkor valaki
veszi a faradsagot, es belenez.
Az iom128.h tele van ilyesmi sorokkal:

SFR_B(SREG,0x3F)

Valamint ilyenekkel:

SFR_B_EXT(DDRF,0x61)

Ezek a sorok, melyek az extended IO teruletet definialjak, asm programban
_nem_ mukodnek.
Error[40]: Bad instruction
Vagy:
Error[42]: Duplicate label:'SFR_B_BITS_EXT'
Ugyanezt a fajlt C progiba includolva mukodik. (Miert???)

Az SFR_B es SFR_B_EXT makrok az iomacro.h-ban vannak definialva, a
kovetkezokepp:

#define SFR_B(_NAME,_ADDR) SFR_B_BITS(_NAME,_ADDR, \
            Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)

#define SFR_B_EXT(_NAME,_ADDR) SFR_B_BITS_EXT(_NAME,_ADDR, \
            Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7)

Most figyelj! Ha az also makrot atirom ugy, hogy a felsoben levo
masik makrot hivja meg, asm-ben mukodik, C-ben nem.
(Ezt csinalom egy #ifdef-fel a modositott includokban)
Viszont, ha az SFR_B_BITS makrot lemasolom mondjuk jozsi neven
(bocs Jozsi :), es azt irom be, mar nem mukodik...
Arra gondoltam, hogy a garantaltan mukodo SFR_B_BITS makrot lepesenkent
atirom olyanra mint az SFR_B_BITS_EXT, es akkor kiderul hogy melyik
lepesnel jelentkezik a hiba, hol rossz. Mar a nevenel hibazott :)
En itt akadtam el, hogy ugyanaz a prepocesszor makro ket kulonbozo nev
alatt mar nem mukodik.
Ha valaki tudja hogy mi a hiba, ne kimeljen!
Lehet hogy en vagyok a hulye, de nem valoszinu, mert ezek az _eredeti_,
a forditohoz gyarilag adott fajlok, es C-ben mukodnek is!
Minden jel compiler hibara utal, de ezt nem mernem kijelenteni, amig
egy szakerto nem nezi meg.

> Nem beszelve a makrokrol stb stb stb. Alap C dolgok...

Sot, IAR-ben az asm progikban is mukodik a C prepocesszor.
Hasznalom is kemenyen... Mint ha mar honapokkal ezelott irtam volna,
hogy ezzel csinaltam a Z80 cross-assemblert, stb...

> A lenyeg ugyan az, ha kulso strukturaban/tombben tarolom a konstanst mintha
> beleirnam az sprintf-be a problema szempontjabol.

Igy van.

> Sajna ha ez a formatumstring a flash-ben van, akkor nem tudja hasznalni az
> IAR az en tudasom szerint, ha parametere is van.

De tudja. Kiprobaltam, mukodik. Az opciot a setupban nem kell bekapcsolni,
mert akkor tenyleg kulso memoriaba akarja tenni, meg ha az le is van
tiltva, en sem ertem miert. Hanem meg kell adni hogy __flash.
Igy hasznalom en is. Nekem mindegy lett volna hogy flash vagy RAM, csak
azert kell flash, mert az init kodot nem hasznalom, es az masolna at
RAM-ba... De ha flashba teszem no problem.

> Igaz, az elso level nem 100%-ban erre iranyult, szembekerultem egy
> problemaval, amit tisztazni akartam.

Hat igen a C sem tokeletes. De lehet hogy ez fordito hiba...
Ha lenne idom megneznem hogy mit csinal asm-ben, milyen szegmensbe
akarja rakni, es miert.

> Viszont a masodikban errol volt szo.

> Ha tudsz jobb megoldast szivesen fogadom.

Egy ugyes kis prepocesszor makro meg tudja csinalni az altalad irt
elso, mukodo, de sok gepelest igenylo modszert, ugy, hogy ugyanugy
nezzen ki mint a nem mukodo, de keves gepelest igenylo.
(Pontosabban valtozo parameterhosszal nem nagyon... En mashogy
adom at a parametereket, ugyhogy nem problema)

> Sajna kicsi az atmega RAM-ja. Az lenne a tuti, ha az egesz struktura
> beleferne, ami a menut tarolja.

Csak C-bol kicsi, mint emlitettem, a sprintf float support nelkul is
elhasal 256 bajt stackkel, 512 kell neki. Nem takarekoskodik a memcsivel.
Asm-bol nem gond.
De ne aggodj C-ben is meg lehet csinalni amit akarsz, nyilvanvaloan,
csak kicsit turni kell hozza, nem lesz olyan elegans mint asm-ben.

> Most eppen cache-elem be a flash-bol a menu kivant reszet, es a cache-elt
> stringbe irok bele szamolt adatokat.
> De valszeg igy sem fog beleferni...

Hat ez nagyon kellemetlen. A rohadr forditok nem talaljak ki hogy
mit akarsz...

> Mivel az emlitett stringbe iro "alkalmazasok" szama akkora, hogy a flash-be
> nem beteheto
> formatumstringjukkel megtelik a RAM.
> De valszeg total nem erted amirol beszelek...

Pont jokor irod, ugyanis ezt az utolso mondatod pont nem ertem :))
Most konstans sztring, vagy nem konstans? Egesz eddig arrol volt szo,
hogy konstanst szeretnel a flashben tarolni. De akkor miert akarsz
irni bele?

> (Kivancsi vagyok, ebbol mit hozol ki. Azt mar tudjuk, hogy sem asm-ben, sem
> C-ben nem vagyok versenykepes, gagyit gyártok. Elképzelni nem tudom mi lesz
> a következõ... :)))

Ugyan! Nem mondtam hogy nem vagy versenykepes. Csak bizonyos projectek
nem neked valok. Azokat keruld el, mint ordog a tomjent, es akkor meg
sok sikerelmenyed lehet.

> Ezeket a stringeket kulon tombbe tenni meg olyan lenne, mintha a levelezom
> body reszebe most gépelt szöveget egy
> külön _elõre_ megírt file-ból rántanám fel. Mivel nem a menurendszer
> része...Hanem ha nagyképû akarok lenni, akkor az
> "alkalmazásé". Annak ott a helye. Nem a menurendszer adatai kozott.

Ezt nem ertem teljesen, de a konstans sztringeket, amennyiben azokat
nem kell futasidoben valtoztatni, szerintem nem csak hogy nem rossz egy
konstans tombben tarolni, hanem szerintem egyenesen ajanlott megoldas.
Egyszeruen modosithato stb...
Igaz, futas kozben nem tudsz pl nyelvet valtani, de mar sokkal jobb
mint amit a listara irtal. (Tudom az nem szamit, de.. :)

> Hallottal mar a valtozo parameterhosszusagu fuggvenyekrol?
> Sajna ezt a C makrok nem tudjak...

Ez gaz. Sajna hallottam rola, ugyanis a mult heten csinaltam az egyik
C-ben keszulo projecthez sajat printf-et, ami soros porton kuldi ki a
formazott szoveget, debug celokra.
(Nem irtam meg az egeszet, a _formatted_write()-t hasznalom)
Ez esetben csak olyan megoldast tudok, melyhez szinten keveset kell
gepelni, de kicsit mashogy mukodik, viszont sokkal rugalmasabb.
Lasd lejjebb...

> Meg nalad is valami lila kodbe vesz a dolog.
> Hozza vagy szokva a gagyi kis rutinjaidhoz....

Melyikekhez? Amelyek kivaloan mukodnek a tieiddel ellentetben? :-\

> Van meg egy rakas valtozo, stack, heap bla. Nem sok marad az egyedi
> formatumstringeknek...

Es miert nem csinalod egysegesen?

> De a Te szavaiddal elve miert kellene átirni? :)))
> Hiszen ha egyszer készen vagy, akkor nem kell karbantartani, valtoztatni
> rajta szerinted.
> Idézzem? ;)
> Csúnya öngól. :))))

Igen. Idezd! De akkor az egesz szovegkornyezetet is.
Ha meg ugy is ongol, akkor nem tudsz olvasni...

> Essek hasra?
> 
> void kiir(menuszam)
> {
>    sprintf(lcd_buf,menuitems[menuszam].sztring[language]);
>    lcd_pos(menuitems[menuszam].x,menuitems[menuszam].y)
>    myprintf(LCD,lcd_buf);
> }

Ez kivalo egy forditoprogramhoz, ha egyszerre tobb nyelven is meg kell
jeleniteni a szoveget :) Egyebkent csak feleslegesen sokat gepelsz...
Mellesleg az asm verzio meg forrasban is(!!) rovidebb, kevesebbet
kell gepelni, es ugyanolyan rugalmas/attekintheto!
Amire feljebb utaltam: szakadj el a sprintf-tol, csinalj egy sajat
fuggvenyt, melynek a szoveget nem sztring konstanskent adod meg, hanem
pl egy azonositoval. Attekintheto is marad, hatekony is lesz.
Persze az olyan trukkoket, hogy pl eredmeny=jo vagy eredmeny=rossz,
legfeljebb tobb formazasi lepessel fogod tudni %s-sel generaltatni,
nekem megy 1 lepesben is az asm progimmal...

> Te viszont csak az elsot ismered. Eleg sokszor tanubizonysagat adtad ennek,
> hogy zold vagy a C-hez.

:)) Igy van, zold vagyok. De nem annyira, mint azt szeretned beallitani.
Nem vagyok programozo, bar mostanaban foleg azt csinalom. Altalaban
asm-ben, de neha C. Eddig mindent meg tudtam csinalni, csak nem szeretem.
De ha mar itt tartunk, meg valamivel adosok vagytok!
Azt allitottatok, hogy lehet prepocesszor makroban if-et csinalni.
Szeretnem vegre latni. En a C ismereteim alapjan ugy gondoltam hogy
lehetetlen, ezert utaneneztem konyvben, kerdezoskodtem, es tovabbra is
ugy tunik hogy lehetetlen. Egyaltalan nem lehet tovabbi prepocesszor
direktivakat hasznalni egy prepocesszor makroban.
Nem en talaltam ki, valamelyik C expert volt...

> Arnold

-- 
Valenta Ferenc <vf at elte.hu>   Visit me at http://ludens.elte.h u/~vf/
"My love is REAL, unless declared INTEGER."



More information about the Elektro mailing list