(10-12-2018, 02:51)sitevnic napisał(a): nasunęło mi się pytanie:
"nie wiadomo ile RAM pożera kod" - czy kod nie jest umiejscowiony w zupełnie innej pamięci? w pamięci flash 32kb?
o ile dobrze wiem dane, tablice itp. są umieszczone w pamięci ulotnej - 2kb i z tego co mi się wydaje po kompilacji kodu ta zajętość pamięci ulotnej na zmienne powinna się nie zmieniać.
Czytając z czym masz problem i jak go rozumiesz nie potrafisz określić zajętości RAM ani bezpiecznej granicy. Nie jest to łatwe z kilku powodów:
- ile RAM zużywa uC w czasie przerwania?
- czy przerwania są zagnieżdżone?
- ile RAM zajmuje sterta w czasie działania programu?
Jeśli nie znasz odpowiedzi na powyższe pytania, to nie wiesz, czy 1 czy 99% jest bezpieczną granicą. Przykład dałem wcześniej, teraz dam jeszcze bardziej dosadny. Skompiluj kod:
Kod:
void setup() {
// put your setup code here, to run once:
DDRB |= _BV(PB3);
}
void loop() {
// put your main code here, to run repeatedly:
char t[3000];
for(uint16_t x=0; x<3000;x++) t[x] = x;
PORTB ^= _BV(PB3);
delay( 500 );
}
Program powinien zmieniać stan portu PB3 co 500ms. Uruchom go. I co? Działa? Możesz dodać jakiś serial.print. Nie działa! Dlaczego? RAM przecież full a właśnie problemem jest brak pamięci RAM.
Jak chcesz,to mogę napisać kod, gdzie freemem pokazuje full wolnej ram a będzie jej brakować. Jeszcze inny przykład, problem zarządzania RAM w Arduino (tu zachowuje się jak Windows) spowodowany przez użycie C++ zamiast C gdzie możesz tak posiatkować pamięć, że masz wolne 7kB (w Mega2560) a nie możesz zarezerwować 256 bajtów.
PS
Do końca życia nie zrozumie dlaczego Arduino używa C++. To nie język na małe uC. Aby używać C++ na małych uC trzeba bardzo dobrze znać ten język a początkujący, bo dla nich powstało Arduino, nie znają dobrze C++, przeważnie, nie znają go wcale.