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ę

brak miejsca

quwert
-
-
Posty:7
Rejestracja:17 lut 2006, o 15:25
Lokalizacja:Kraków
brak miejsca

Postautor: quwert » 25 lip 2006, o 13:54

witam
napisałem prgramik (tak na początek) którego zadaniem było wyświetlanie kolejnych liter alfabetu ale niestety okazało się ze pamięci wystarcza (w attiny2313) na 7 pierwszych liter.
Teraz mam pytanie (programik jest w języku C):
np. definiuje: int k=....; //zmienna k zajmuje x miejsce w pamięci uk
..
.. //operuje na zmiennej k
a teraz chcę aby zmienna k przestała istnieć w pamięci uk(zwolniła miejsce)
Jak to zrobić?

Awatar użytkownika
bis
-
-
Posty:134
Rejestracja:12 maja 2005, o 08:11
Lokalizacja:Warszawa

Postautor: bis » 25 lip 2006, o 15:13

To co dalej jest bezpośrednią odpowiedzią na zadane pytanie, ale myślę że rzeczywisty problem tkwi zupełnie gdzie indziej(błędny algorytm zasttosowany przez Ciebie do rozwiązania zadania)
Niezbyt jasno opisałeś co tak włściwie chcesz uzyskać. zakładam ze napisałes coś takiego:

Kod: Zaznacz cały

char xx; ......... // jakieś inne zmienne GLOBALNE int k = ..; // nasza zmienna globalna ........ // jakieś następne zmienne globalne void main(void) { int k =.. ; // ewentualnie k zdefiniowane tutaj, lokalna ale na początku main() ... // program ....... //------ tu część gdzie używasz zmiennej k ..... .... // ----- dalsza część programu gdzie k nie jest używane ......... }
Tak zdefiniowane k statycznie i globalnie zajmuje panięć RAM przez cały czas działania programu (to samo będzie gdy zdefiniujesz k jako zmienną w main() ale na początku tej funkcji). Nie bardzo wiadomo co rozumiesz jako "zwolnienie", gdy zaalokowane statycznie to nie bardzo jest jak to zwolnić. pierwszym rozwiązaniem jest uzycie wskażników i funkcji malloc() i free() ale na małych prockach może być za bardzo "zasobożerne"
Jest pewna sztuczka działająca na większości kompilatorów

Kod: Zaznacz cały

void main(void) { int a = 10; ........ ........ // a teraz chcę mieć trochę zmiennych ale tylko dla wybranego kawałka programu { // <- zaczynamy blok int k = 10; int b; int a; // UWAGA!! to jest teraz inna zmienna o tej samej nazwie, ogólnie nie polecam // teraz na stosie zostalu zaalokowane bajty dla tych zmiennych: k, b, a ........ ........ // kod operujący na tych zmiennych : k,b,a ........ } // <- zamykamy blok, tutaj stos zostaje skorygowany, a miejsce zajmowane przez //k,b,a można uznać za "zwolnione" ...... ...... }
oczywiście prawie to samo można uzyskać rozbijając main() na zestaw funkcji i wtedy deklarowane wewnątrz nich zmienne tak samo istnieja tylko w czasie wywołania funkcji, (ten sposób jest naturalniejszy ale zabiera dodatkowe miejsce na stosie na adres powrotu z funkcji i czasami na zachowanie części rejestrów)

Podkreślam że moim zdaniem Twój kłopot tkwi zupenie w innym miejscu!!!
bis

quwert
-
-
Posty:7
Rejestracja:17 lut 2006, o 15:25
Lokalizacja:Kraków

Postautor: quwert » 28 lip 2006, o 10:52

kazda litera jest budowana wg tego schematu:
int A()
{
DDRB=0xFF;
int a=0;

do{


PORTB=0x18;
PORTB=0x00;
PORTB= 0x03;
PORTB= 0x04;
PORTB= 0x06;
PORTB= 0x09;
PORTB= 0x0a;
PORTB= 0x0e;
PORTB=0x0d;
PORTB= 0x11;
PORTB= 0x12;
PORTB= 0x15;
PORTB= 0x02;
PORTB= 0x13;
a++;
}while(a!=9000);
a=0;

}

(diody są sterowane demultipleksermi)

Sprawdze jeszcze z zakresem lokalnym {} zmiennej

stan24
-
-
Posty:60
Rejestracja:16 lut 2004, o 10:19
Lokalizacja:Łódź

Postautor: stan24 » 28 lip 2006, o 15:03

Witaj :D
Przy okazji takiego "algorytmu" warto sie zastanowic jakiego procka nalezy zastosowac do wyswietlenia liter chinskiego alfabetu.
Pozdrawiam :)
S

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 28 lip 2006, o 15:08

@quwert
diody są sterowane demultipleksermi
czy można prosić o załączenie schematu jak te ledy masz podłączone do portu i multiplekserów?
bo w/g mnie to chyba niewłaściwie podchodzisz do samego zagadnienia ich sterowania...

pozdrawiam,
tasza

quwert
-
-
Posty:7
Rejestracja:17 lut 2006, o 15:25
Lokalizacja:Kraków

Postautor: quwert » 29 lip 2006, o 17:05

Udało mi sie wepchnąć na uk cały alfabet ale i tak zajmuje on ok 3/4pamięci.
Jeśli chodzi o schemat to jest w załączniku(w danej chwili zaświecana jest tylko 1 dioda widać to na foto-świeci najjaśniej).
(@quwert -czyżby uszczypliwa uwaga?
Układ ten zrobiłem po to aby się nauczyć porogramowania-to jet mój 2 programik na uk)
Załączniki
P7290247 k.jpg

stan24
-
-
Posty:60
Rejestracja:16 lut 2004, o 10:19
Lokalizacja:Łódź

Postautor: stan24 » 29 lip 2006, o 19:50

Udało mi sie wepchnąć na uk cały alfabet ale i tak zajmuje on ok 3/4pamięci.
Wiec sprobuj moze tak i zobacz ile zyskasz:

Kod: Zaznacz cały

#include <avr/pgmspace.h> #include <avr/io2313.h> const char ledA[] PROGMEM={0x99, 0x9F, 0x69}; const char ledB[] PROGMEM={0x97, 0x97, 0x79}; void showChar(const char *pCharVect){ char c1=pgm_read_byte(&pCharVect[0]); char c2=pgm_read_byte(&pCharVect[1]); char c3=pgm_read_byte(&pCharVect[2]); char pb= PORTB & 0xe0; PORTB= pb | (0x0f & c1); PORTB= pb | (0x0f & c2); PORTB= pb | (0x0f & c3); pb|= 0x10; PORTB= pb | (0x0f & c1>>4); PORTB= pb | (0x0f & c2>>4); PORTB= pb | (0x0f & c3>>4); } int main(void){ DDRB=0xFF; showChar(ledA); showChar(ledB); return 0; }
Wlasciwie to nalezy jeszcze zadeklarowac bufor znaku i wyswietlac literki co pewien czas np. 10 ms wywolujac funkcje showChar z poziomu przerwania ktoregos z timerow.
Zalaczone foto jest super - piekna dokumentacja :)
Milej zabawy :)
S

Awatar użytkownika
tasza
-
-
Posty:456
Rejestracja:17 sty 2005, o 10:52

Postautor: tasza » 29 lip 2006, o 21:39

@quwert -czyżby uszczypliwa uwaga?
Nie, to nie uszczypliwa uwaga tylko informacja że zwracam się do Ciebie a nie przedmówcy ( @ = at )

Za załączenie schematu dziękuje, ale skoro już otrzymałeś pomoc, to nic tu po mnie.

pozdrawiam

stan24
-
-
Posty:60
Rejestracja:16 lut 2004, o 10:19
Lokalizacja:Łódź

Postautor: stan24 » 30 lip 2006, o 09:45

to nic tu po mnie
Mysle, ze jeszcze male co nie co mozna w tym listingu zmienic :) . Zdefiniowane literki zajmuja w pamieci programu nie 3 ale 4 bajty. Kazda literka to strata 1 bajtu. Jezeli w chinskim alfabecie jest tych znakow ok 2 tys. nie trudno wyobrazic sobie jakie to marnotrastwo. Jest to moja kolejna uwaga ale nie uszczypliwa :) .
Pozdrawiam
S

Wróć do „AVR/AVR32”

Kto jest online

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