
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
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
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???
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???
Re: wskazniki i łańcuchy tekstowe
Moze sprobujesz tak: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.
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;}
}

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";)
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";)
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.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ć.
sa 2 mozliwościWłanie 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.
1. jest to beznadziejny kompilator,
2. jest jakis sposob zeby to ominąć, ale to juz nie ze mną, bo nie znam tego kompilatora

-
- -
- Posty:651
- Rejestracja:13 sty 2005, o 18:38
- Lokalizacja:Krasnystaw
- Kontaktowanie:
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
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 OnlyMasz 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
Piotrek
PS
"Łmańce"(\0) są zbędne

Kod: Zaznacz cały
char const *tydzien[] ={"Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota","Niedziala"};
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości