Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C - Potrzebny przykładowy program z wykorzystaniem stosu uC

slawko9 07 Sty 2016 20:36 972 9
  • #1 07 Sty 2016 20:36
    slawko9
    Poziom 10  

    Witam!!!

    Mam mały problem. Od niedawna zacząłem programowanie mikrokontrolerów i chciałbym ograniczać objętość programu (piszę w języku C). Z tego co przeczytałem, aby zmniejszyć objętość programu należy dodatkowo używać pamięci SRAM. Tylko nie mam pojęcia jak adresować w niej dane. Przydałby mi się jakiś przykładowy kod, w którym używany jest stos. Od kilku dni szukam informacji na temat adresowania komórek pamięci SRAM lecz nie mogę znaleźć żadnego przykładowego programu.

    0 9
  • #2 08 Sty 2016 14:51
    szelus
    Specjalista - Mikrokontrolery

    Opowiadasz Waść coś.
    Objętość programu - chodzi o ilość pamięci zajmowanej przez kod, czy dane?
    Jeżeli chodzi o rozmiar kodu, to jak piszesz w czymkolwiek, poza asemblerem, w szczególności w C, to w zasadzie jedyne co możesz zrobić to korzystać sensownie z funkcji i włączyć w opcjach kompilatora optymalizowanie programu pod kątem rozmiaru kodu.
    Cała reszta to sztuki zależne od architektury procesora i wersji kompilatora, w które absolutnie nie warto się bawić w dzisiejszych czasach - kwestia dobrania procesora do zadania, aby pamięci starczyło.
    Jeżeli chodzi o pamięć danych, to oczywiście programista ma największy wpływ na zużycie, ale tego nie da się opisać w kilku prostych zdaniach.

    Mam wrażenie, że albo nie zrozumiałeś tego, co przeczytałeś, albo miałeś niefart trafić na jakieś bzdury, których jest trochę w sieci. Może podaj link albo cytat i opisz konkretnie z czym masz problem i co chcesz uzyskać.

    0
  • #3 08 Sty 2016 18:44
    slawko9
    Poziom 10  

    Z tego co zrozumiałem czytając różne artykuły to kod jest przechowywany w pamięci Flash. Idąc dalej tym tokiem rozumowania dane (wyniki obliczeń) też są tam przechowywane (czyli muszą zajmować jakiś rejestr w tej pamięci). Jeżeli przeniosę te dane do pamięci Sram to zmniejszy się objętość mojego kodu. Tylko jak to zrobić? Chciałbym możliwie jak najlepiej pisać swoje programy więc zainteresowałem się właśnie przechowywaniem danych w tej pamięci. Jeżeli to są dane z wynikami obliczeń i pomiarów to nie przeszkadza to w tym że zostaną utracone po zaniku napięcia. Jeżeli jestem w błędzie proszę o sprostowanie.

    0
  • Pomocny post
    #4 08 Sty 2016 21:57
    szelus
    Specjalista - Mikrokontrolery

    Zdecydowanie tak to nie działa. Pamięć flash jest w zasadzie pamięcią typu "tylko do odczytu", zatem nie bardzo nadaje się do przechowywania bieżących wyników obliczeń. To, że można przeprogramować jej zawartość, czasem nawet z programu, to inna sprawa.
    Natomiast zmienne programu lądują z zasady w pamięci RAM (w mikrokontrolerach zwykle SRAM, nie ma znaczenia).
    Natomiast język C ma taką właściwość, że zmiennym globalnym i statycznym można nadawać wartość początkową. Kompilator umieści te wartości początkowe w pamięci flash razem z programem i doda rozbiegówkę przepisującą te wartości do pamięci RAM przed rozpoczęciem funkcji main(). Inaczej się nie da, bo, jak sam napisałeś zawartość pamięci RAM jest tracona po odłączeniu zasilania.
    Musisz jeszcze sporo doczytać, polecam tutejsze forum o mikrokontrolerach https://www.elektroda.pl/rtvforum/forum12.html i linki do stron dla początkujących tam zamieszczone.
    --
    A, i jeszcze taki hint, żeby nie było, że piszę całkiem nie na temat. :)
    Tzw. zmienne automatyczne w C (zmienne lokalne w funkcjach, niezadeklarowane inaczej) co do zasady (bywają wyjątki) zostają umieszczone przez kompilator na stosie.

    0
  • #5 10 Sty 2016 19:37
    slawko9
    Poziom 10  

    Mam jeszcze kilka pytań i byłbym wdzięczny gdybyś mi na nie odpowiedział.

    1.Pamięć FLASH i EEPROM mają swoją trwałość odpowiednio około 10 000/100 000 cykli odczytu/zapisu. Czy każde włączenie mikrokontrolera liczone jest jako odczyt tzn. czy jak włączę uC 10 000 razy pamięć FLASH zostanie uszkodzona?

    2.Po co zapisywać dane w pamięci EEPROM? Co to daje? Czy zamiast zapisywać dane w pamięci EEPROM można wykorzystać uC z większą pamięcią FLASH i RAM?

    3.Pisałeś coś o włączeniu opcji optymalizowania kodu. Mógłbyś podać mi nazwę tego narzędzia/rozszerzenia (Piszę w Atmel studio 6.0)?

    0
  • Pomocny post
    #6 10 Sty 2016 19:47
    dondu
    Moderator Mikrokontrolery Projektowanie

    slawko9 napisał:
    Czy każde włączenie mikrokontrolera liczone jest jako odczyt tzn. czy jak włączę uC 10 000 razy pamięć FLASH zostanie uszkodzona?

    Nie, chodzi o programowanie pamięci, a konkretnie jej kasowanie (ten proces powoli uszkadza pamięci) przed ich ponownym zaprogramowaniem.

    slawko9 napisał:
    2.Po co zapisywać dane w pamięci EEPROM? Co to daje? Czy zamiast zapisywać dane w pamięci EEPROM można wykorzystać uC z większą pamięcią FLASH i RAM?

    EEPROM przechowuje dane po wyłączeniu zasilania, np, rekordy w grze, ustawienia zapisane przez użytkownika, inne dowolne dane. EEPROM ma więcej cykli zapisu niż FLASH, co może być bardzo istotne, ale nie musi - wszystko zależy od wymagań projektu i projektanta.


    slawko9 napisał:
    3.Pisałeś coś o włączeniu opcji optymalizowania kodu. Mógłbyś podać mi nazwę tego narzędzia/rozszerzenia (Piszę w Atmel studio 6.0)?

    http://mikrokontrolery.blogspot.com/2011/04/atmel-studio-pelne-ide-avr-arm-cz1.html

    0
  • #7 11 Sty 2016 20:13
    slawko9
    Poziom 10  

    W Atmel Studio po kompilacji znalazłem taką informację.
    Program Memory Usage : 480 bytes 1,5 % Full
    Data Memory Usage : 6 bytes 0,3 % Full

    Czy dobrze rozumiem, że pierwsza informacja oznacza obszar zajęty w pamięci FLASH a druga w pamięci RAM?
    Jeżeli nie to w jaki sposób sprawdzić ile pamięci zajmuje kod?

    0
  • Pomocny post
    #8 11 Sty 2016 20:25
    dondu
    Moderator Mikrokontrolery Projektowanie

    slawko9 napisał:
    Czy dobrze rozumiem, że pierwsza informacja oznacza obszar zajęty w pamięci FLASH a druga w pamięci RAM?

    Dobrze rozumiesz.

    Warto także zainstalować dodatek Data Size Viewer: http://mikrokontrolery.blogspot.com/2011/03/A...ize-Viewer-szukanie-oszczednosci-pamieci.html

    0
  • #9 01 Lut 2016 15:59
    slawko9
    Poziom 10  

    Mam problem i nie mogę znaleźć odpowiedzi w dokumentacji technicznej uC a mianowicie potrzebuję odmierzać czas przerwaniami po przepełnieniu licznika a do tego ciągle wykonywać pomiar na ADC (przez określony czas).
    W związku z tym mam kilka pytań:

    1. Ile cykli zegarowych trwa przerwanie? Jeżeli 1 proste polecenie wykonywane jest w 1 cyklu zegarowym to czy przerwanie z 1 poleceniem będzie trwało 1 cykl zegarowy?

    2. Czy mogą równocześnie wystąpić 2 przerwania?

    3.Jeżeli w pytaniu nr 2 była odpowiedź NIE To co się stanie gdy w czasie wykonywania poleceń w przerwaniu od ADC musi wystąpić przerwanie od licznika. Skoro przerwanie licznikowe ma wyższy priorytet
    to czy wystąpi przerwanie w przerwaniu czy przerwanie ADC zostanie niewykonane?

    0
  • Pomocny post
    #10 02 Lut 2016 12:07
    kinggustav
    Poziom 20  

    Przerwanie wykonuje kilka rozkazów niezależnie od tego jak napiszesz obsługę. Musi przecież zapamięteć stan procesora, aby potem wrócić do wykonywanego programu. Nie wiem czy o to pytałeś.
    A więcej niż jedno przerwanie w tym samym czasie musisz sam dobrze przemyśleć w swoim konkretnym przypadku. To trochę niebezpieczne, gdy będzie ich za dużo, albo obsługa będzie zbyt długo trwała. Ogólnie jest to możliwe, ale często w obsłudze przerwania blokuje się (na chwilę) generowanie kolejnych o tym samym lub niższym priorytecie.

    0