Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

wskazniki i łańcuchy tekstowe

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
wskazniki i łańcuchy tekstowe

Postautor: Sławek5 » 31 paź 2005, o 06:45

Czesc.

Mam znowu taki problem.
Chce stworzyc cos takiego (postac uproszczona na potrzeby forum):

Program napisany w ImageCraft AVR 6.29
#include "macros.h"
#include <io2313v.h>

/*********** STALE *******************/
const unsigned char *txt[3]={
"poniedzialek\0",
"wtororek\0",
"sroda\0" };

void lcdConst(const char *ptr)
{
unsigned char i;

for (i=1;i<41;i++)
{
if (*ptr == 0x00) break;
PORTD=*ptr;
ptr++;
}
}

void lcd(char *ptr)
{
unsigned char i;

for (i=1;i<41;i++)
{
if (*ptr == 0x00) break;
PORTD=*ptr;
ptr++;
}
}


void main(void)
{
lcd("test lcd \0 ");
lcdconst(txt[1]);
}

Potrzebowalem zrobic cos takiego ze w zaleznosci od wartosci zmiennej i przyjmujacej wartosci 0, 1, 2 bedzie wyswietlane
na lcd pon, wtor, srod. Probowalem zrobic cos takiego jak wyzej z tym ze chcialem aby byly te stringi umieszczone w pamiecie programu, a nie w RAM. Ale jak sprawdzałem w AVRStudio kompilator i tak umieszcza je w RAM, co gorsza dzieje sie dziwna rzecz:
wywolujac po koleji funkcje
lcd("lancuch\0");
lcdConst(txt[1]);
wyswietla sie na lcd: lancuch a za nim jakies glupoty.
jezeli napisze
lcdconst("lancuch\0");
lcdConst(txt[1]);
dzieje sie zupelnie inaczej jest ok.

Może w tym jest cos zle???

tomek_j
-
-
Posty:264
Rejestracja:14 sty 2004, o 09:06

Re: wskazniki i łańcuchy tekstowe

Postautor: tomek_j » 31 paź 2005, o 08:46

Czesc.

Mam znowu taki problem.
......Potrzebowalem zrobic cos takiego ze w zaleznosci od wartosci zmiennej i przyjmujacej wartosci 0, 1, 2 bedzie wyswietlane
na lcd pon, wtor, srod.
Moze sprobujesz tak:

Kod: Zaznacz cały

if(zm==0) wysLCD("poniedzialek",0);//wypisz poniedzialek od pozycji (adresu) 0 if(zm==1) wysLCD("wtorek,0); ............ void wysLCD(const rom char *napis,unsigned char poz) { wr_cmd(poz|0x80);//zapisz adres while(*napis!=0) {wr_data(*napis); ++napis;} }
peocedurka wr_cmd wpisuje komende do sterownika wyswietlacza, a wr_data dana do wyswietlacza - musi je sobie napisać. Ne wiem jak to zadziala z AVR bo nie uzywam, ale z MPLAB C-18 dziala. Podobna konstrukcja dziala z kompilatorem C keila. Popatrz i pomyśl jak to działa :D

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 31 paź 2005, o 12:07

Właśnie jeżeli piszę coś w stylu WriteLcd("lancuch"); to ten tekst jest najpierw w pamieci programu (flash) co jest normalne, ale nastepnie jest kopiowany do RAM (niepotrzebnie) i dopiero z RAM jest pobierane do wyświetlania. Szkoda pamięci RAm na takie coś i nie wiem jak sobie z tym poradzić.

Co mnie najbardziej zaskakuje to, ze jak wspomniałem wczesciej jesli mam dwie funkcje
WLcdConst(const *ptr); oraz WLcd(char *ptr); to jak piszę WLcdConst(tab); oraz WLcd("tekst2); są zupełnie inne wyniki (oczywiscie char *tab="tekst";)

tomek_j
-
-
Posty:264
Rejestracja:14 sty 2004, o 09:06

Postautor: tomek_j » 31 paź 2005, o 12:36

Właśnie jeżeli piszę coś w stylu WriteLcd("lancuch"); to ten tekst jest najpierw w pamieci programu (flash) co jest normalne, ale nastepnie jest kopiowany do RAM (niepotrzebnie) i dopiero z RAM jest pobierane do wyświetlania. Szkoda pamięci RAm na takie coś i nie wiem jak sobie z tym poradzić.
Po co masz sobie z tym "radzić" ? jeżeli ten kompilator tak robi, to niech mu bedzie. I tak na pewno zajmuje zmienne lokalne i potem te lokacje zwalnie dla innych zmiennych. Kompilatory języka C ( jak i innych wyższego poziomu) maja to do siebie, że przydzielaja sobie pamiec RAM zaleznie od swoich potrzeb: optymalizacji szybkośc działania, zajetości pamieci itp. Jezeli chcesz analizować jak one to robia, to analizuj, ale to raczej bez sensu. Zasada jest prosta: im lepszy kompilator, tym kod wynikowy mniejszy, program szybciej dziala i zajmuje mniej RAMu. Jezeli chcesz byc lepszy od tego, który masz, to napisz sam w asemblerze.

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 31 paź 2005, o 13:13

Właœnie okazuje się zemuszę. Jak napiszę za długi tekst to kompilator pokazuje błšd ze za mała pamieci Ram. Jak patrzę w AVRStudio, to okazuje się ze on te stringi umieszcza w RAM i cału czas one tam sš nie zwalnia tego obszaru pamieci.

tomek_j
-
-
Posty:264
Rejestracja:14 sty 2004, o 09:06

Postautor: tomek_j » 31 paź 2005, o 13:30

Właœnie okazuje się zemuszę. Jak napiszę za długi tekst to kompilator pokazuje błšd ze za mała pamieci Ram. Jak patrzę w AVRStudio, to okazuje się ze on te stringi umieszcza w RAM i cału czas one tam sš nie zwalnia tego obszaru pamieci.
sa 2 mozliwości
1. jest to beznadziejny kompilator,
2. jest jakis sposob zeby to ominąć, ale to juz nie ze mną, bo nie znam tego kompilatora 8) Moze sama deklaracja const nie wystarcza i traktuje string jako stały w pamięci RAM a nie rom. Zauważ, że ja użyłem const rom. Moze tn kompilator tez wymaga podobnej deklaracji.

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 31 paź 2005, o 14:50

Sławku - poeksperymentuj więcej samodzielnie. Będzie to z pożytkiem dla Ciebie, zapewniam!

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 1 lis 2005, o 10:19

Masz rację i cenię Twoją radę. Ale uwierz mi jak ciężko się czasami poruszć w tym wszystkim jak się nie ma tak dużego doświadczenia. Ja nie proszę o zrobienie czegoś za mnie tylko wyjaśnienie problemu i ewentualne nakierowanie na rozwiązanie. Zanim napisze posta zawsze staram się sprawdzić to.
A z tym to naprawde nie rozumiem dlaczego on tworzy te same łańcuchy zarówno we flaszu jak i RAM

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 1 lis 2005, o 16:56

Masz rację i cenię Twoją radę. Ale uwierz mi jak ciężko się czasami poruszć w tym wszystkim jak się nie ma tak dużego doświadczenia. Ja nie proszę o zrobienie czegoś za mnie tylko wyjaśnienie problemu i ewentualne nakierowanie na rozwiązanie. Zanim napisze posta zawsze staram się sprawdzić to.
A z tym to naprawde nie rozumiem dlaczego on tworzy te same łańcuchy zarówno we flaszu jak i RAM
To może w ramach "poeksperymentuj" , zaznacz w opcjach projektu Strings in FLASH Only

Piotrek

PS
"Łmańce"(\0) są zbędne :D Kompilator i tak każdy ze stringów , zakończy zerem.

Kod: Zaznacz cały

char const *tydzien[] ={"Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota","Niedziala"};

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości