Minnesbrist & stora textmassor (AVR)
Minnesbrist & stora textmassor (AVR)
Hej jag använder mig utav Atmega16, och har problem med minnesbrist i sram minnet som är på (1KB).
Jag har en stor display där jag skriver ut mycket text , och min fråga är hur ska man spara texten utan att den tar upp ramminnet? Det är inte mycket text i vanlig mening, men det är för mycket för att ha allt hela tiden i sram minnet.
Programmet är skrivet i C (winavr/gnu), och jag måste tyvärr ha för mycket text i programmet. Jag har ej heller möjlighet att byta microcontroller eller externt sram då den ej stöder det.
Nu har jag löst det såhär
char text[]=" hejsan svejsan";
while(text != 0)
{
PORTC = text; //skriv ut strängen på displayen
e_rs_clock();
i++;
}
Vilket innebär att hela charen[] text sparas i ramminnet. Det är inte så farligt, men jag har ett antal såna texter som skall skrivas ut. Texten behöver aldrig användas så mitt flashminne på 16KB skulle räcka hur bra som helst, om en bara visste hur..
Jag har även testat detta med samma resultat.
char text[10];
strcpy(text,"hejsan svejsan: ");
Där jag endast använde samma text[] för alla texter, och använde olika strcpy.
Någon som har ett bra tips? Detta måste väl vara ett vanligt problem, och jag trodde 1KB skulle räcka bra då jag hade kört med en 512B sram microcontroller innan (8515).
Jag har en stor display där jag skriver ut mycket text , och min fråga är hur ska man spara texten utan att den tar upp ramminnet? Det är inte mycket text i vanlig mening, men det är för mycket för att ha allt hela tiden i sram minnet.
Programmet är skrivet i C (winavr/gnu), och jag måste tyvärr ha för mycket text i programmet. Jag har ej heller möjlighet att byta microcontroller eller externt sram då den ej stöder det.
Nu har jag löst det såhär
char text[]=" hejsan svejsan";
while(text != 0)
{
PORTC = text; //skriv ut strängen på displayen
e_rs_clock();
i++;
}
Vilket innebär att hela charen[] text sparas i ramminnet. Det är inte så farligt, men jag har ett antal såna texter som skall skrivas ut. Texten behöver aldrig användas så mitt flashminne på 16KB skulle räcka hur bra som helst, om en bara visste hur..
Jag har även testat detta med samma resultat.
char text[10];
strcpy(text,"hejsan svejsan: ");
Där jag endast använde samma text[] för alla texter, och använde olika strcpy.
Någon som har ett bra tips? Detta måste väl vara ett vanligt problem, och jag trodde 1KB skulle räcka bra då jag hade kört med en 512B sram microcontroller innan (8515).
Senast redigerad av Antigonos 13 september 2005, 17:45:48, redigerad totalt 2 gånger.
Kod: Markera allt
const uint8_t char text[] PROGMEM = " hejsan svejsan";
while (pgm_read_byte(&text[i]) != 0)
{
PORTC = pgm_read_byte(&text[i]);
e_rs_clock();
i++;
}
edit: Rättning
Senast redigerad av cykze 13 september 2005, 17:03:47, redigerad totalt 1 gång.
Re: Minnesbrist & stora textmassor (AVR)
Det "smartaste" är nog som du redan har fått tips om, att lägga det i annat minne än programminnet. Men du vet vär att du inte behöver använda strcopy in i en buffer? Du kan juh bara ha en char-pekare som du sätter till början av strängen du vill använda. Se bara till att dina stränar är null-terminerade. Det borde spara ett par bytes i kod iafAntigonos skrev: Jag har även testat detta med samma resultat.
char text[10];
strcpy(text,"hejsan svejsan: ");
Där jag endast använde samma text[] för alla texter, och använde olika strcpy.

Peace