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
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
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ć?
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ć?
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:
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
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
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
.........
}
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"
......
......
}
Podkreślam że moim zdaniem Twój kłopot tkwi zupenie w innym miejscu!!!
bis
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
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
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)
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)
Wiec sprobuj moze tak i zobacz ile zyskasz:Udało mi sie wepchnąć na uk cały alfabet ale i tak zajmuje on ok 3/4pamięci.
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;
}
Zalaczone foto jest super - piekna dokumentacja
Milej zabawy
S
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 .to nic tu po mnie
Pozdrawiam
S
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości