PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Maximale Größe .hex file



Azubi007
11.12.2006, 08:52
Hallo zusammen!

Habe mal einen Frage zum .hex File.

Wir wollen unsere gesamten Programme zusammenschreiben und so gestalten, dass man sie über die Taster auswählen kann. Das funktioniert soweit auch ganz gut. Dann haben wir das ganze compiliert und es gab auch keine Fehler. Beim Flaschen sagt uns das Asuro Flash Tool jedoch:

Open COM1 --> OK !
Bulding RAM --> Hex file too large or address error!

Das .hex file ist 22kb groß. Wie groß kann das File maximal sein? Oder habt ihr einen andere Möglichklichkeit, warum das flashen nicht klappt?

Sind wieder mal für jede Hilfe dankbar!

mfg

azubi007

m.a.r.v.i.n
11.12.2006, 09:35
Hi,

an der Größe des Hex-Files kann man das schwer erkennen. Für das Programm auf dem Asuro stehen max 7kB Binärcode zur Verfügung (1kB belegt der Bootloader). Durch das Hex-File Format werden diese Programm Daten in 16 Byte Blöcke mit Adresse und Checksumme in ASCII codiert, insgesamt kommt man so für 16 Bytes auf 43 Bytes im Hex File. Macht also ca 19kB als Maximalgröße für das Hexfile. (7 * 1024 / 16 * 43) .

22kB sind also wirklich zu groß.

Gruß m.a.r.v.i.n

Azubi007
11.12.2006, 09:45
Hmm, schade. Dann müssen wir doch 2 Programme draus machen.

Danke für die Hilfe!

mfg

azubi007

damaltor
11.12.2006, 12:17
oder ihr müsst versuchen, die vorhandenen programme so stark wie möglich abzukürzen. versucht, funktionen zu benutzen, dinge die immer wieder benutzt werden in einer externen datei aufzubewahren, und was vor alklen dingen sehr helfen kann: macht euch eine sicherheitskopie von der asuro.c und der asuro.h. dann könnt ihr aus der bibliothek alle funktionen löschen, die ihr nicht mehr benötigt. auch das spart platz, weil nicht immer die ganze bibliothek mit kompiliert wird.

EDH
11.12.2006, 12:33
habt ihr mal probiert, ob der compiler den code azuf 19 kb zammquetschen kann, wenn im makefile maximale optimierung angeeben wird.

damaltor
11.12.2006, 13:12
oder postet doch mal euer programm (in c) dann können wir versuchen es so klein wie möglich zu machen...

die 3 kilobyte schaffen wir schon =)

Azubi007
12.12.2006, 07:56
Moin!

@EDH Nein, das haben wir noch nicht probiert. Mussten gestern Mittag eine Entscheidung treffen und hatten uns dann entschieden das ganze als 2 Programme zu realisieren. Einmal wenn wir den Aufbau für die Linienerkennung und wenn wir den US Aufbau drauf haben.

Stehe nämlich etwas unter zeitdruck, weil wir das ganze Projekt nächste Woche unserem Chef präsentieren sollen. :-b

Abwarten....

Aber poste mal unseren Code:

Wichtig: Es fehlen noch 2 "Programme" die als Funktion eingefügt werden sollen.

Abgrundfahrt und der Selftest

Der ganze Aufruf der einzelnen programmme soll immer so laufen wie bei der US-Fahrt.

Aber jetzt wirklich mal der Code:


#include "asuro.h"
#include "stdlib.h"
#include "string.h"

unsigned int mittel_links=0;
unsigned int mittel_rechts=0;
unsigned int mittel[2];
unsigned int geschw_l = 200;
unsigned int geschw_r = 200;
unsigned int odo_gL;
unsigned int odo_gR;
unsigned int gbr;
unsigned int gbl;

void verzoegern(int zeit) //Programm um Zeitverzögerung einzubringen
{
int i=0;
for(i=0;i<zeit;i++)
{
Sleep(250);
}
}
void zeile(int zeilen) //Programm um leere Zeilen im HyperTerminal auszugeben
{
unsigned char newline = 10;
unsigned char cR = 13;
int i = 0;
for(i=0;i<zeilen;i++)
{
SerWrite(&newline,1);
SerWrite(&cR,1);
}
}
void countdown(void) //Countdown Programm
{
Init();
zeile(1);
SerWrite(">>>> Countdown <<<<",19);
zeile(2);
SerWrite(">>>> 3 <<<<",19);
zeile(2);
StatusLED(RED);
verzoegern(250);
SerWrite(">>>> 2 <<<<",19);
zeile(2);
StatusLED(YELLOW);
verzoegern(250);
SerWrite(">>>> 1 <<<<",19);
zeile(2);
StatusLED(GREEN);
verzoegern(250);
SerWrite(">>>> Start <<<<",19);
}
void odometrie(void) //Programm zu Kalibrierung der Motoren
{
long int summe_rechts=0;
long int summe_links=0;
unsigned char mittell[10];
unsigned char mittelr[10];
unsigned char flagl=FALSE;
unsigned char flagr=FALSE;
unsigned int mittelwert0=0;
unsigned int mittelwert1=0;
unsigned char fR[10];
unsigned char fL[10];
unsigned char UR[10];
unsigned char UL[10];
unsigned char SL[10];
unsigned char SR[10];
unsigned int data[2];
unsigned int faktorr;
unsigned int faktorl;
unsigned int count=0;
unsigned int i=0;
unsigned int L=0;
unsigned int R=0;
float a=0;
float b=0;


MotorDir(FWD,FWD);
MotorSpeed(200,200);

for(count=0;count<400;count++)
{
verzoegern(3);
OdometrieData(data);
summe_links = summe_links + data[0];
summe_rechts = summe_rechts + data[1];
}

mittelwert0 = summe_links / count;
mittelwert1 = summe_rechts / count;

itoa(mittelwert0, mittell,10);
itoa(mittelwert1, mittelr,10);
zeile(2);
SerWrite("Mittelwert links: ",18);
SerWrite(mittell,strlen(mittell));
zeile(2);
SerWrite("Mittelwert rechts: ",19);
SerWrite(mittelr,strlen(mittelr));

itoa(summe_links, SL,10);
itoa(summe_rechts, SR,10);

zeile(2);
SerWrite("Summe links: ",13);
SerWrite(SL,strlen(SL));
zeile(2);
SerWrite("Summe rechts: ",14);
SerWrite(SR,strlen(SR));

for(i=0;i<count;i++)
{
verzoegern(2);
OdometrieData(data);
if (data[0] < mittelwert0 && flagl == TRUE)
{
L++;
flagl = FALSE;
}
if (data[0] > mittelwert0 && flagl == FALSE)
{
L++;
flagl = TRUE;
}

if (data[1] < mittelwert1 && flagr == TRUE)
{
R++;
flagr = FALSE;
}
if (data[1] > mittelwert1 && flagr == FALSE)
{
R++;
flagr = TRUE;
}
}

if(L<R)
{
a=R/8;
b=L/8;
faktorl=(100/a)*b;
faktorr=100;
}

if(R<L)
{
a=R/8;
b=L/8;
faktorr=(100/b)*a;
faktorl=100;
}
if(R==L)
{
faktorr=faktorl=100;
}

MotorSpeed(0,0);

itoa(faktorl, fL,10);
itoa(faktorr, fR,10);
itoa(L, UL,10);
itoa(R, UR,10);

zeile(2);
SerWrite("Umdrehungen links: ",19);
SerWrite(UL,strlen(UL));
zeile(2);
SerWrite("Umdrehungen rechts: ",20);
SerWrite(UR,strlen(UR));
zeile(2);
SerWrite("Faktor links: ",14);
SerWrite(fL,strlen(fL));
zeile(2);
SerWrite("Faktor rechts: ",15);
SerWrite(fR,strlen(fR));
zeile(4);

odo_gL=(geschw_l*faktorr)/100;
odo_gR=(geschw_r*faktorl)/100;

}
void erkennung(void) //Programm um vordere Diodenwerte einzulesen
{


unsigned int datahell[2];
unsigned int datadunkel[2];
unsigned int temp_h[2];
unsigned int temp_d[2];

unsigned char temp_char0[4];
unsigned char temp_char1[4];
unsigned char temp_mit0[4];
unsigned char temp_mit1[4];

unsigned int i = 2;
unsigned int taster;

StatusLED(OFF);

while (i > 0)

{
taster = PollSwitch();
{
if (taster>0 && taster<33 && i==2)
{
FrontLED(ON);
verzoegern(150);
LineData(temp_h);
datahell[0]=temp_h[0];
datahell[1]=temp_h[1];
StatusLED(RED);
verzoegern(200);
StatusLED(OFF);
verzoegern(200);
FrontLED(OFF);
i=1;
itoa(temp_h[0],temp_char0,10);
itoa(temp_h[1],temp_char1,10);
SerWrite("Asuro: ",7);
zeile(2);
SerWrite("Hell l: ",8);
SerWrite(temp_char0,strlen(temp_char0));
zeile(1);
SerWrite("Hell r: ",8);
SerWrite(temp_char1,strlen(temp_char1));
zeile(2);
}
taster = PollSwitch();
if (taster>0 && taster<33 && i==1)
{
FrontLED(ON);
verzoegern(150);
LineData(temp_d);
datadunkel[0]=temp_d[0];
datadunkel[1]=temp_d[1];
StatusLED(YELLOW);
verzoegern(200);
FrontLED(OFF);
i=0;
StatusLED(GREEN);
itoa(temp_d[0],temp_char0,10);
itoa(temp_d[1],temp_char1,10);
SerWrite("Dunkel l: ",10);
SerWrite(temp_char0,strlen(temp_char0));
zeile(1);
SerWrite("Dunkel r: ",10);
SerWrite(temp_char1,strlen(temp_char1));
zeile(1);
}
}
}
mittel_links=(datahell[0]+datadunkel[0])/2;
mittel_rechts=(datahell[1]+datadunkel[1])/2;
mittel[0]=mittel_links;
mittel[1]=mittel_rechts;
itoa(mittel_links,temp_mit0,10);
itoa(mittel_rechts,temp_mit1,10);
zeile(2);
SerWrite("Mittelwert l: ",14);
SerWrite(temp_mit0,strlen(temp_mit0));
zeile(1);
SerWrite("Mittelwert r: ",14);
SerWrite(temp_mit1,strlen(temp_mit1));
}




void linienfahrt(void) //Programm um einer Linie zu folgen
{

unsigned int data[2];
unsigned int wert_links;
unsigned int wert_rechts;
unsigned int a=0;
unsigned int b=0;
FrontLED(ON);


while(1)
{




LineData(data);
wert_links=data[0];
wert_rechts=data[1];


if(b>20000)
{
a=0;
}

if((wert_links < mittel_links) && (wert_rechts < mittel_rechts))
{
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
BackLED(OFF,OFF);
a=0;
b=0;
}

if((wert_links > mittel_links) && (wert_rechts > mittel_rechts) && a==0)
{
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
}

if((wert_links > mittel_links) && (wert_rechts > mittel_rechts) && a==1)
{
MotorDir(FWD,FWD);
gbr=odo_gL*0,4;
gbl=odo_gR;
MotorSpeed(gbr,gbl);
b++;
}

if((wert_links > mittel_links) && (wert_rechts > mittel_rechts) && a==2)
{
MotorDir(FWD,FWD);
gbr=odo_gL;
gbl=odo_gR*0,4;
MotorSpeed(gbr,gbl);
b++;
}

if((wert_links < mittel_links) && (wert_rechts > mittel_rechts))
{
MotorDir(FWD,FWD);
gbr=odo_gL*0,6;
gbl=odo_gR;
MotorSpeed(gbr,gbl);
BackLED(ON,OFF);
a=1;
}

if((wert_links > mittel_links) && (wert_rechts < mittel_rechts))
{
MotorDir(FWD,FWD);
gbr=odo_gL;
gbl=odo_gR*0,6;
MotorSpeed(gbr,gbl);
BackLED(OFF,ON);
a=2;
}
}
}

void gatter(void) //Programm um in einem Kreis zu bleiben
{
unsigned int zwert[2];

while(1)
{
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
LineData(zwert);

if(zwert[0] < mittel_links && zwert[1] > mittel_rechts)
{
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(150);
MotorDir(FWD,RWD);
MotorSpeed(odo_gL,odo_gR);
StatusLED(GREEN);
verzoegern(150);
}

if(zwert[1] < mittel_rechts && zwert[0] > mittel_links)
{
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(150);
MotorDir(RWD,FWD);
MotorSpeed(odo_gL,odo_gR);
verzoegern(150);
StatusLED(GREEN);
}
}
}






void tast(void) //Programm um mit Tastern zu fahren
{
unsigned char t1, t2;


Init();
while(1)
{
t1 = PollSwitch();
t2 = PollSwitch();

if(t1 == 0 && t2 == 0) /* keine Taste */
{
MotorDir(FWD,FWD);
MotorSpeed(odo_gL,odo_gR);
StatusLED(GREEN);
FrontLED(ON);
BackLED(OFF,OFF);
}

else if (t1 && t2 && t1 == t2)
{

if(t1 == 1 && t2 == 1) /* Taster 1 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(OFF,ON);
gbr=odo_gL*0,75;
gbl=odo_gR*0;
MotorSpeed(gbr,gbl);
verzoegern(450);
}

if(t1 & 0x02 && t2 & 0x02) /* Taster 2 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(OFF,ON);
gbr=odo_gL*0,75;
gbl=odo_gR*0;
MotorSpeed(gbr,gbl);
verzoegern(450);
}

if(t1 & 0x04 && t2 & 0x04) /* Taster 3 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(OFF,ON);
gbr=odo_gL*0,75;
gbl=odo_gR*0;
MotorSpeed(gbr,gbl);
verzoegern(450);
}

if(t1 & 0x08 && t2 & 0x08) /* Taster 4 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(ON,OFF);
gbr=odo_gL*0;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(450);
}

if(t1 & 0x16 && t2 & 0x10) /* Taster 5 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(ON,OFF);
gbr=odo_gL*0;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(450);
}

if(t1 & 0x32 && t2 & 0x20) /* Taster 6 gedrückt? */
{
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
MotorDir(RWD,RWD);
gbr=odo_gL*0,75;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(333);
BackLED(ON,OFF);
gbr=odo_gL*0;
gbl=odo_gR*0,75;
MotorSpeed(gbr,gbl);
verzoegern(450);
}

}
}
}
void LocalInit(void) //Programm für US
{
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
ADCSRA = 0x00;
ACSR = 0x02;
ADMUX = 0x03;
SFIOR |= (1 << ACME);
DDRD &= ~(1 << 6);
}
void Ping(unsigned char length) //Programm für US
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
while(count72kHz < length)
{
OCR2 = 0x64 + length / 2 - count72kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64;
}
void ultraschall (void) //Programm um mit US zu fahren
{
int pos, i;
int posmarker;
Init();
LocalInit();
while(TRUE)
{
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++)
{
Sleep(10);
if((ACSR & (1 << ACI)) != 0)
{
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker > 10)
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(odo_gL,odo_gR);
}
else
{
StatusLED(RED);
MotorDir(FWD, RWD);
MotorSpeed(odo_gL*0,odo_gR);
for(i = 0; i<100; i++) { Sleep(200); }
}
}
}
int main(void)
{

unsigned int taster_1=0;
unsigned int taster_2=0;
unsigned int abfrage_1=0;
unsigned int abfrage_2=0;
unsigned int x=0;


Init();
zeile(1);
SerWrite(">>>> Willkommen in der unglaublichen Welt des Asuro! <<<<",57);
zeile(5);
SerWrite("Mit welcher Erweiterung soll der Asuro betrieben werden: ",57);
zeile(2);
SerWrite("Druecken sie bitte den entsprechenden Taster:",44);
zeile(2);
SerWrite("1 >>> Ultraschallerweiterung",28);
zeile(1);
SerWrite("2 >>> Lienienerkennung",22);


while(x==0)
{
taster_1=PollSwitch();
abfrage_1=taster_1;
x=taster_1;
taster_1=0;
taster_2=0;

if(x==1) //Ultraschallerweiterung
{
zeile(24);
SerWrite(">>>> Sie moechten den Asuro mit Ultraschallerweiterung betreiben. <<<<",70);
zeile(5);
SerWrite("Programmauswahl:",16);
zeile(2);
SerWrite("Druecken sie bitte den entsprechenden Taster:",44);
zeile(2);
SerWrite("1 >>> Ultraschall-Fahrt",23);
zeile(1);
SerWrite("2 >>> Taster-Fahrt",18);
zeile(1);
taster_2=PollSwitch();
abfrage_2=taster_2;
taster_1=0;
taster_2=0;

if(abfrage_1==1 && abfrage_2==1) //Ultraschall
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Ultraschall-Fahrt gewaehlt! <<<<",59);
zeile(5);
SerWrite(">>>> Kalibrierung der Motoren... <<<<",37);
zeile(5);
odometrie();
SerWrite(">>>> Kalibrierung abgeschlossen <<<<",37);
zeile(5);
verzoegern(100);
countdown();
ultraschall();
}
if(taster_1==1 && taster_2==2) //Taster
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Taster-Fahrt gewaehlt! <<<<",54);
zeile(5);
countdown();
}
}
if(x==2) // Auswahl Linienverfolgung
{
zeile(24);
SerWrite(">>>> Sie moechten den Asuro mit Linienerkennung betreiben. <<<<",63);
zeile(5);
SerWrite("Programmauswahl:",16);
zeile(2);
SerWrite("Druecken sie bitte den entsprechenden Taster:",44);
zeile(2);
SerWrite("1 >>> Selbsttest",16);
zeile(1);
SerWrite("2 >>> Abgrund-Fahrt",19);
zeile(1);
SerWrite("3 >>> Gatter-Fahrt",18);
zeile(1);
SerWrite("4 >>> Linienverfolgungs-Fahrt",29);
zeile(1);
SerWrite("6 >>> Taster-Fahrt",18);
zeile(1);
taster_2=PollSwitch();
abfrage_2=taster_2;
taster_1=0;
taster_2=0;

if(abfrage_1==2 && abfrage_2==1) //Selbsttest
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Sebsttest gewaehlt! <<<<",59);
zeile(5);
countdown();


}
if(abfrage_1==2 && abfrage_2==2) //Abgrund
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Abgrund-Fahrt gewaehlt! <<<<",55);
zeile(5);
countdown();


}
if(abfrage_1==2 && abfrage_2==4) //Gatter
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Gatter-Fahrt gewaehlt! <<<<",55);
zeile(5);
countdown();

}
if(abfrage_1==2 && abfrage_2==8) //Lienienverfolgung
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Lienenverfolgungs-Fahrt gewaehlt! <<<<",65);
zeile(5);
countdown();

}
if(abfrage_1==2 && abfrage_2==32) //Taster
{
zeile(24);
SerWrite(">>>> Sie haben das Programm Taster-Fahrt gewaehlt! <<<<",55);
zeile(5);
countdown();

}
}
}
while(1);
return 0;
}



mfg

damaltor
12.12.2006, 11:03
sieht doch ganz gut aus... werd mich nachher mal dransetzen, evtl kann man da noch was abkürzen.

was ihr schonmal probieren könntet wäre die stdlib.h rauszulassen. diese ist schon in einem der anderen includes drin. aber weniger wirds dadurch glaub ihc nicht... naja probierts mal.

mal was anderes: warum macht ihr die tasterabfrage so komplex? reicht nicht eine variable "taster_1" und eine Variable "taster_2"? wozu noch extra abfrage_1 und abfrage_2 sowie das x? also zumindest abfrage_1 und abfrage_2 sollten sich doch wegoptimieren lassen. ist nicht viel, aber zumindest etwas...

dan die funktion zeile(): diese lässt sich super abkürzen indem ihr folgendes macht:

for(i=0;i>zeilen;i++)
{SerWrite("\n\r",2)}


auch nicht wieder gerade viel, aber etwas... ich werd mich nachher mal dransetzen, evtl kann man da noch mehr machen. mal sehen.

EDH
12.12.2006, 11:40
void zeile(int zeilen) //Programm um leere Zeilen im HyperTerminal auszugeben
{
unsigned char newline = 10;
unsigned char cR = 13;
int i = 0;
for(i=0;i<zeilen;i++)
{
SerWrite(&newline,1);
SerWrite(&cR,1);
}
}

(1) bezweifel ich, das diese funktion überhaupt funktionier, zweitens kann man das mit #define einfacher lösen

bsp;

#define 5ZEILEN "\n\n\n\n\n"
SerWrite(5ZEILEN,5);


die funktione erkennung() wird doch gar nicht verwendet oder?
auserdem ist des linienfolgeprogramm ziemlich umstädnlich. das kann man auch ganz einfach mit dem code von der anleitung machen.


nochn kleiner tipp:
das ganze würde übersichtlicher und professioneller wriken, wenn ihr den ganzen code in einzelne module aufteilt.

damaltor
13.12.2006, 08:14
warum sollte das nicht funktionieren? eigentlich geht das echt gut, ist nur mega umständlich. da aber immer mal wieder eine andere anzahl von zeilen gebraucht wird, ist das mit dem define schwierig... siehe meinen post oben =)

funktionen die nicht gebrauct werden, brauchen trotzdem speicherplatz auf dem roboter. also: alles raus haun, aus dem eigenen programm und evtl auch aus der lib auskommentieren was nicht gebraucht wird.

EDH
13.12.2006, 15:31
die variante mit define ist sicher umständlicher, aber speichersparender, weil dadurch der verwaltungsaufwand einer gnazen funktion weggfällt.

und darum gehts ja wohl.

damaltor
13.12.2006, 20:00
ist aber eigentlich doch eher unwirtschaftlich, weil dann vor dem compilieren nur jedes 5ZEILEN durch \n\n\n\n\n ersetzt wird (was ausserdem unter win2000 nicht funktioniert, es müsste mit \n\r\n\r\n\r\n\r\n\r ersetzt werden). es wird also jedes mal die ganze große funktion gespeichert, mit den 10 bytes im serwrite (und dem serwrite selbst usw.). bei der funktion hingegen wird nur 1x eine schleife gespeichert.

ich vermute, im endeffekt wird das bei +- null rauskommen... allerdings ist eine funktion dann flexibler. DEFINEs werden vor dem kompilieren ersetzt, und dann jedes mal gespeichert. funktionen müssen nur einmal gespeichert werden.

aber an so kleinen dingen hängts nicht. der größte teil kann denk ich mal rausgeholt werden, wenn die asuro.c angepasst wird und alle nicht benötigten funktionen rausgenommen werden.

EDH
13.12.2006, 20:31
bei der standard lib giebts gar nicht soviee funktionen die man nicht brauchen könnte.
so viel wird da nicht weggfallen

SprinterSB
13.12.2006, 21:32
Dir ist ja klar, daß du ein Großteil des Flash mit Strings vollhaust, gleiches gilt für den SRAM. Du hast hier eine kleinen ATmega8 vor dir, kein PC mit 1GB Hauptspeicher und nem virtuellen Speicher von oo.

Den Platz, den das Programm belegt, kannst du mit avr-size anzeigen lassen. Wie das geht erzählt dir

avr-size --help

Allein die main() hat riesiges Sparpotential!

Die Multiplikationen mit 0,75 machen nicht das, was du willst!!!
https://www.roboternetz.de/wissen/index.php/Fallstricke_bei_der_C-Programmierung?robotik_mw_session=d1a39dbc233c260a 0c099ea7a86c8d1c#Ein_.2C_anstatt_._in_Konstante
Eine Multiplikation mit 0.75 wirst du auch nicht wollen, weil das dem ATmega8 erst recht den Boden raushaut. Also: Multipliziere mit 3 und teile dann durch 4 (gcc ist übrigens gescheit genug, um /4 durch einen Shift zu ersetzen).

Die beste Oprimierungsstufe für AVR ist -Os

Falls das RAM voll mit den Strings ist, dann legt die ins Flash und schreibt euch ne Funktion, die die Strings aus dem Flash ausgibt (merke: konstante Strings im RAM belegen Platz um RAM *und* im Flash).
https://www.roboternetz.de/wissen/index.php/Avr-gcc#Konstante_Strings_ins_Flash

Die Länge zu übergeben braucht bei jedem Aufruf nochmal 4 Bytes unnötig... und und und...

damaltor
14.12.2006, 15:36
hmmm... wie siehts aus mit dem eeprom? könnte man da nicht auch ncoh etwas zwischen lagern (mit einer art vorbereitungs programm), so allgemeine werte oder die auszugebenden strings oder ähnliches? das ist immerhin ein halbes kb...