Skocz do zawartości

Pytanie odnośnie Arduino


Jung

Pomocna odpowiedź

I tak i nie.

Tak, Mikroprocesor jednordzeniowy może w danej chwili wykonywać tylko jedną operację... ale ponieważ tych operacji może wykonywać miliony na sekundę a do tego można użyć przerwań do dzielenia tego czasu na "paczki" możesz w niezauważalnym (dla człowieka) czasie wykonywać wiele skomplikowanych funkcji w tym samym czasie.

Czyli np. masz timer co 1ms, który przełączy mikrokontroler na inną funkcję - to jest taka bardzo ogólna zasada działania systemów operacyjnch -, albo wywoła jakąś specjalną funkcjonalność ( np. co 10ms przerywasz program i odczytujesz stan klawiatury czy jakiegoś czujnika ).

Z drugiej strony mikrokontroler ma też dużo dodatkowych sprzętowych rozwiązań, które pozwalają wykonywać mu wiele czynności jednocześnie. Dla przykładu konwertery ADC, transmisja po SPI/USART/I2C, generowanie sygnałów PWM czy różnego rodzaju liczniki mogą działać bez ciągłego nadzoru mikroprocesora.

Link do komentarza
Share on other sites

Ale z trzeciej strony 😉 środowisko Arduino raczej nie wspiera takich schematów działań. Program a raczej funkcja loop() jest jedna i jednowątkowa. Jeżeli chcesz robić wiele rzeczy równolegle, musisz opierać się na własnych pomysłach lub pewnych bibliotekach wprowadzających mechanizmy wielowątkowości poprzez korzystanie z timerów i callbacków. W każdym razie raczej zapomnij o wywłaszczaniu, ochronie pamięci czy wygodnej komunikacji między procesami. Daje się robić quasi-równoległość, ale znakomita większość dostępnych przykładów (choćby korzystania z shieldów) to jednak prymitywny kod jednowątkowy. A bardzo trudno przerabiać coś takiego na pracę równoległą w tak prymitywnym środowisku.

Link do komentarza
Share on other sites

Super dzięki za wnikliwe wyjaśnienie. A co z bibliotekami czy mogę wprowadzać na początku szkicu dowolną ilość bibliotek z których będę korzystał pod czas pisania szkicu?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Sam język ani środowisko (kompilator, linker) nie ograniczają liczby wstawionych plików nagłówkowych. Pamiętaj jednak, że jeśli za "includowanym" plikiem .h kryją się konkretne funkcje a nie tylko definicje symboli lub też "wciąga on" kolejne pliki (np. .c lub .cpp) to wtedy rozpychasz sobie kod. Procesory mega328 mają tylko 32k pamięci FLASH i 2k RAMu a to - szczególnie w przypadku co bardziej rozbudowanych rozszerzeń (np. FLASH/SD file system, obsługa Ethernetu czy GSMu) bardzo szybko się kończy. Sytuację ratuje trochę Arduino Mega, ale tam też RAMu jest co kot napłakał. Trzeba sobie uzmysłowić, że Arduino na procesorach ATmega to platforma dla początkujących hobbystów: do prostych, pojedynczych zadań wykonywanych krok-po-kroku. Same biblioteki wcale nie ułatwiają współpracy z innymi a często wręcz "gryzą się" pomiędzy sobą. Owszem, istnieją implementacje ciekawszych aplikacji, ale wtedy to ich autorzy wyciskają siódme poty z biednego procesorka wkładając nieproporcjonalnie dużo pracy w uzyskanie efektu, który np. na systemach linuxowych jest na pstryknięcie. Małe ATmegi są niezastąpione w krótkich i szybkich zadaniach czasu rzeczywistego. I to nie obliczeniowo-DSP bo tam padają jak muchy, ale raczej sterowaniowo-kontrolnych. Mogą generować precyzyjne sygnały, mierzyć impulsy, odpalać silniki, serwa czy łączyć dane z kilku bardzo różnych czujników i przesyłać to po SPI, I2C czy UART do kogoś mądrzejszego. Z uwagi na malutki RAM słabo radzą sobie ze skomplikowanymi protokołami komunikacyjnymi (np. TCP/IP) w których trzeba dużo buforować i pamiętać wiele kontekstów. Jeden sektor karty SD to 512 bajtów, a wypadałoby podwójnie buforować do zapisu i do odczytu więc.. już cały RAM zajęty, a gdzie stos, sterta, zmienne statyczne? Robi się jakieś myki z odczytem na kilka razy (jeśli dana karta to wspiera), ale to łapanie prawą ręką za lewe ucho. Sprzętowa ramka Ethernetu to ponad 1000 bajtów, itd..

EDIT: Pisałem i pisałem... aż deshipu zrobił to lepiej i szybciej 🙂

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.