Witam

.
Na początek, jestem początkujący i dopiero od miesiąca stawiam pierwsze kroki w pisaniu programów ale dzięki BB, są to dość spore kroki.
Kawał dobrej roboty Panie Mirku
Muszę jeszcze tylko zrobić sobie streszczenie, do którego będzie można szybko sięgnąć i znaleźć potrzebne rzeczy, ale nie o tym...
Jak do tej pory przerobiłem kilka razy same podstawy C a teraz piszę, kombinuję i przerabiam przykłady z książki i zrodziło się kilka pytań.
Z góry przepraszam jeśli użyłem niefachowej terminologii lub coś pokręciłem.
1. Jak wiadomo zmienne globalne zawsze automatycznie inicjowane są wartością 0. To jest fakt oczywisty i niezaprzeczalny.
Jestem praktykiem i łatwiej mi coś zapamiętać jeśli sprawdzę to „namacalnie”.
Utworzyłem sobie tablicę (zakres globalny) a w funkcji głównej programu napisałem algorytm, który na wyświetlaczu co 1s wyświetla wartość poszczególnych elementów tablicy.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
- Dla pamięci RAM oczywiście wszystkie komórki przyjęły wartość 0.
- Dla pamięci FLASH komórki przyjęły wartość 0.
- Dla pamięci EEPROM i tu niespodzianka, poszczególne elementy tablicy przyjęły zupełnie przypadkowe wartości.
Zacząłem szukać przyczyny.
Upload EEPROM image ustawione na form build.
W fusach EESAVE odznaczone, zresztą sprawdzałem obie opcje.
Używam nowy Atmel toolchain, środowisko Eclipse, mkAVR Calculator, ATMEGA32, zestaw ATB 1.03.
Oczywiście to nie jest jakiś poważny problem, napisałem sobie prosty algorytm który poprzez przycisk kasuje zawartość tej tablicy. Potem wszystko działa poprawie.
Zastanawia mnie tylko dlaczego tak jest ?.
2. Panie Mirku co Pan myśli o wykonywaniu kopi zapasowej do pamięci EEPROM mikrokontrolera w razie utraty zasilania oraz dodatkowo co 12h (tak na wszelki wypadek gdyby po kilku latach podtrzymanie zwiodło).
Czytając Pana wypowiedź na jednym z postów
http://forum.atnel.pl/topic5370.html odniosłem wrażenie, że raczej jeśli są to bardzo ważne dane to, jest Pan raczej sceptyczny do tego typu rozwiązań. Możliwe że odniosłem złudne wrażenie.
Cytuj:
Chodzi mianowicie o to że po pierwsze - jeśli już trzymać dane w eeprom, to bezwzględnie trzeba pamiętać o fusebitach od BODLEVEL i utrzymywać odpowiedni poziom napięcia ... bo ? ... no bo możemy stracić zawartość eeprom .... Jeśli będziemy używać procka w jakichś szczególnie skrajnych warunkach pracy - no chociażby w aucie to nawet pomimo ustawionego Bodlevela i tak się nieraz przejedziemy na tym, że dane polecą w kosmos .... Ale to już każdy pewnie sam się musi o tym przekonać na własnej skórze
Czy w tym procesorze (ATMEGA1284-PU) również może się zdarzyć że jakieś dane z EEPROMu polecą w kosmos. Może mi Pan polecić jakieś niezawodne rozwiązanie ? Dlaczego ustawienie BODLEVEL może mieć wpływ na EEPROM ? Gdzie znajdę coś więcej na ten temat ? Tablice będą spore, nawet od 2kb do 4kb.
3. Moje ostatnie pytanie.
Dotyczy ono funkcji i zachowania stosu.
O ile rozumiem jak zachowuje się stos w przypadku takiej funkcji void funkcja (uint8t a) o tyle zastanawia mnie co będzie działo się ze stosem, gdy utworzę coś takiego.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Proszę mnie sprostować jeśli coś źle zrozumiałem.
Gdy z poziomu głównej funkcji main () wchodzę w poszczególne funkcje testx() to znaczy, że za każdym razem zostanie wykonana kopia wszystkich zmiennych globalnych na stos ? A po zakończeniu działania funkcji dojdzie do zapisu bezpośrednio na tych zmiennych ?
Czy w ten sposób stos przyrośnie:
- dla funkcji test0() tt[0]=3 o 2 bajty (1 element tablicy i adres powrotu),
- dla funkcji test1() o 2 bajty,
- dla funkcji test2() o 12 bajtów (1 bajt powrotu, 1 bajt na zmienną "i" oraz 10 na tablicę).
Rozumiem że gdybym te same działania umieścił w funkcji głównej main() to stos również przyrośnie o podane wyżej wartości tylko że bez adresów powrotu ?
Gdzie znajduje się rejestry mikrokontrolera który używany jest do optymalizacji dostępu do zmiennych globalnych, to jest element stosu ?
Przepraszam jeśli moje pytania są bzdurne, po prostu próbuję szybko opanować ten język i w pełni zrozumieć pewne mechanizmy.
W książce, chyba w rozdziale o stosie jest informacja, że w dalszej części w ćwiczeniach praktycznych, znajduje się przykład kodu dzięki któremu można kontrolować co się z nim dzieje ale jeszcze nie znalazłem. Zapewne w przeciągu dwóch tygodni się do tego dokopie jednak jeśli to nie problem to proszę o jakieś informację w którym rozdziale i ewentualnie gdzie jeszcze mogę znaleźć jakieś sensowne opracowanie tematu ?
Pytania kieruję do Pana Mirka ale oczywiście jeśli ktoś zna dobrze temat to również zapraszam do dyskusji, chętnie skorzystam z każdej pomocy
Pozdrawiam
Paweł