PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMEGA 8 - sprintf Funktion



jojo.glaser
18.12.2006, 12:48
HILFE!

Hallo, ich habe folgendes Problem:

Mein Programmspeicher ist voll und ich möchte was einspaen.

Im Moment sieht das was ich ändern möchte so aus:


unsigned char buffer[21] ;

if(VariableEgal == 1)
{
sprintf(buffer, "\ TestEgal1 ");
}

if(VariableEgal == 2)
{
sprintf(buffer, "\ TestEgal2 ");
}

if(VariableEgal == 3)
{
sprintf(buffer, "\ TestEgal3 ");
}

//Buffer in Display schreiben.
UART_PrintfProgStr(buffer);


Um ein wenig speicher vom Programmspeicher in den Data speicher zu verlagern möchte ich das Programm wie folgt abändern:

unsigned char bufferText1[21] = {?,?,?,?,?,...};
unsigned char bufferText2[21] = {?,?,?,?,?,...};
unsigned char bufferText3[21] = {?,?,?,?,?,...};

if(VariableEgal == 1)
{
UART_PrintfProgStr(bufferText1);
}
if(VariableEgal == 1)
{
UART_PrintfProgStr(bufferText2);
}
if(VariableEgal == 1)
{
UART_PrintfProgStr(bufferText3);
}


So steht jetzt der Text nicht mehr im Programm, sondern in den arrays und ich spare mir ne menge Programmspeicher.

Das Problem ist aber, ich weis nicht, was ich in den array ohne die sprint funktion schreiben soll. (Dort wo die Frageszeichen sind.)

Giebt es ein Windows Programm, dass mit Text in einen array schreibt oder kann ich einfach die Buschstaben in den array schreiben?

Ich hoffe, ihr versteht mein Problem.
Ich hab mich bemüht, es verständlich zu erklähren.

DANKE für eure Hilfe!

Pascal
18.12.2006, 14:58
Ich weiß nicht, ob ich dich richtig verstehe...Meinst du, du schreibst die Daten in ein array um damit Speicherplatz im Flash zu sparen?
Wenn ja, würde das wohl nicht funktionieren, weil das array ja auch im Flash gespeichert wird.

Aber, falls du nicht soviel Text hast, könntest du ihn in das EEPROM schreiben.


Du kannst die Buchstaben einzeln in ein array schreiben, wenn du einfache Anführungsstriche ('hier kommtdann der Buchstabe rein') verwendest.

jojo.glaser
18.12.2006, 15:45
Ich mein anstatt:
sprintf(buffer, "\r TestX ");
im Programmtext



Lieber in einem Array z.b. Buffer {"T","E","X","T","X"};

also dann steht das ja nicht im Programmspeicher sondern im "Variablenspeicher".

Aber das mit den "" geht irgendwie nich,so wie ichs oben gezeigt hab.

m.a.r.v.i.n
18.12.2006, 15:59
Hi,

so sollte es eigentlich gehen:


char buffer[] = "Text";

Bei Strings hängt der C-Compiler automatisch ein 0-Zeichen hinter die Zeichenkette. Deshalb man kann auch schreiben:


char buffer[5] = { 'T', 'e', 'x', 't', '\0' };

Trotzdem steht der String bzw. das Array sowohl im Programmspeicher und im RAM. Es spart aber natürlich ungemein an Programmspeicher sprintf nicht zu verwenden.

Ansonsten bliebe noch die Möglichkeit Strings in den EEPROM Bereich zu packen.

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

SprinterSB
18.12.2006, 16:00
Du kannst die Nachrichten dich direkt ausgeben:


const char *messages[] = { "egal1", "egal2", "egal3"};
...
{
UART_PrintfProgStr (messages[variableEgal-1]) ;
}

Den Platz im Falsh kannst du nicht sparen, irgendwoher müssen die Strings ja initialisiert werden. Das einzige was du machen kannst, ist Platz im RAM zu sparen, indem du die Strings nicht ins RAM legst sondern in Flash lässt.

In RN-Wissen steht was dazu im [wiki="avr-gcc"] Artikel unter Optimierungen.

Platz kannst du hier vor allem sparen, indem du kein sprintf verwendest. Sobalt du eine lib-Funktion anfasst, wird ihr Code dazugelinkt. Eine lib-Funktion 1x zu benutzen ist also nicht billiger, als sie 2x oder 3x zu benutzen. Sie garnicht zu verwenden wird erst die Ersparnis bringen.

jojo.glaser
18.12.2006, 16:05
oh sorry ich hab " mit ' vertauscht.

Ich habe das mal eingegeben
unsigned char buffer2[21] = {'\r','b','c','d','e','f','g','h','i','j','k','l', 'm','n','o','p','q','r','s','t','u'} ;

das display zeigt jetzt folgendes an;

abwechselnd

abcdefghijklmnopqrstu
[°cdefghijklmnopqrstu


voran kann das liegen?

jojo.glaser
18.12.2006, 16:07
DANKE an alle
Der wahnsinn es geht!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

DANKE DANKE DANKE ................