Prawie wszyscy powiedzą teraz błogosławieństwo:
wydajność !
Dobra, C pozwala na pisanie kodu sportowego. Ale przecież istnieją inne języki! A optymalizacja mocy nowoczesnych kompilatorów jest niesamowita. Czy C ma jakieś zalety, których nie ma żaden inny język? A może po prostu nie potrzebujesz bardziej elastycznych instrumentów w tej dziedzinie?
programming-languages
c
embedded-systems
winorośl
źródło
źródło
Odpowiedzi:
To część tego; deterministyczne wykorzystanie zasobów jest ważne na urządzeniach z ograniczonymi zasobami na początek, ale są też inne powody.
źródło
C został zaprojektowany do modelowania procesora, ponieważ C został stworzony, aby Unix był przenośny na różnych platformach, a nie tylko pisał asembler.
Oznacza to, że programy C działają dobrze jako język programowania dla programów, które muszą mieć poziom abstrakcji bardzo zbliżony do rzeczywistego procesora, co ma miejsce w przypadku wbudowanego sprzętu.
Uwaga: C został zaprojektowany około 1970 roku, a procesory były wtedy prostsze.
źródło
Jednym z powodów dominacji jest to, że ma odpowiednie narzędzia do tego zadania. Po opracowaniu na platformach osadzonych zarówno w Javie, jak i C / C ++, mogę powiedzieć, że podejście C ++ od podstaw do kości jest po prostu bardziej naturalne. Uratowanie programisty od poczucia, że przeskakuje on przez obręcze, ponieważ poziom języka jest zbyt wysoki, jest dość irytujące. Dobrym przykładem jest brak niepodpisanych zmiennych w Javie.
Przydatne funkcje języka VM / języków interpretowanych są zwykle niewykonalne i nie są wdrażane, np. Garbage collection.
źródło
C wymaga samo w sobie bardzo niewielkiego wsparcia w czasie wykonywania, więc narzut jest znacznie niższy. Nie poświęcasz pamięci ani miejsca na obsługę środowiska wykonawczego, nie spędzasz czasu / wysiłku, aby zminimalizować to wsparcie, ani nie musisz na to pozwalać w projekcie.
źródło
switch
es są straszne, a te same maszyny zbudowane z hierarchii klas są ładne i łatwe w utrzymaniu.switch
, można powiedzieć) jest nadal używana w wielu aplikacjach osadzonych. Łatwiejszy debugowanie, łatwiejszy do weryfikacji.Jak wspomniano w innych odpowiedziach, C został opracowany na początku lat siedemdziesiątych, aby zastąpić język asemblera w architekturze minikomputera. W tamtych czasach komputery te zazwyczaj kosztowały dziesiątki tysięcy dolarów, w tym pamięć i urządzenia peryferyjne.
Obecnie możesz uzyskać taką samą lub większą moc komputera dzięki wbudowanemu 16-bitowemu mikrokontrolerowi, który kosztuje cztery dolary lub mniej w pojedynczych ilościach - w tym wbudowaną pamięć RAM i kontrolery I / O. 32-bitowy mikrokontroler kosztuje może dolara lub dwa więcej.
Kiedy programuję tych małych facetów, co robię w 90% przypadków, gdy nie projektuję płyt, na których siedzą, lubię wizualizować, co będzie robił procesor. Gdybym mógł wystarczająco szybko programować w asemblerze, zrobiłbym to.
Nie chcę wszelkiego rodzaju warstw abstrakcji. Często debuguję, przechodząc przez listę dissemblera na ekranie. O wiele łatwiej jest to zrobić, gdy na początku napisałeś program w C.
źródło
Nie do końca dominuje, ponieważ coraz częściej używa się C ++, ponieważ kompilatory uległy poprawie, a wydajność sprzętu wzrosła. Jednak C jest nadal bardzo popularny z kilku powodów;
Szerokie wsparcie. Prawie każdy sprzedawca chipów zapewnia kompilator ac, a każdy przykładowy kod i sterowniki będą prawdopodobnie napisane w c. Kompilatory C ++ są coraz bardziej powszechne, ale nie są martwym certyfikatem dla danego układu i często są błędne. Wiesz również, że każdy inżynier wbudowany będzie mógł pracować w c. To lingua franca w branży.
Występ. Tak, powiedziałeś to. Wydajność jest nadal najważniejsza, aw środowisku, w którym podstawowe procedury są często zapisywane w asemblerze lub przynajmniej zoptymalizowane w odniesieniu do danych wyjściowych asemblera, nigdy nie lekceważą tego znaczenia. Często osadzone cele będą bardzo tanie i będą miały bardzo małe wspomnienia i kilka mipsów.
Rozmiar. C ++ jest zwykle większy. Z pewnością wszystko, co używa STL, będzie większe. Zasadniczo zarówno pod względem wielkości programu, jak i wielkości pamięci.
Konserwatyzm. To bardzo konserwatywny przemysł. Częściowo dlatego, że koszty awarii są często wyższe, a debugowanie jest często mniej dostępne, częściowo dlatego, że nie trzeba go zmieniać. W przypadku małego osadzonego projektu c dobrze sobie radzi.
źródło
W przypadku systemów wbudowanych najważniejsza jest wydajność . Ale tak jak powiedziałeś, dlaczego C, a nie jakiś inny wykonawczy język?
Jak dotąd wiele osób wspomniało o dostępności kompilatorów , ale nikt nie wspomniał o dostępności programistów . O wiele więcej programistów zna już C niż, powiedzmy, OCaml.
To są trzy duże.
źródło
Oprogramowanie wbudowane jest bardzo różne.
W aplikacji komputerowej abstrakcje i biblioteki oszczędzają dużo czasu na programowanie. Masz problem z rzuceniem kolejnej pary megabajtów lub gigabajtów pamięci RAM lub niektórych 64-bitowych rdzeni procesora 2 + GHz na problem, a ktoś inny (użytkownicy) płaci za ten sprzęt. Możesz nie wiedzieć, na jakich systemach aplikacja będzie działać.
W projekcie osadzonym zasoby są często bardzo ograniczone. W jednym projekcie, nad którym pracowałem (procesory z serii PIC 17X), sprzęt miał 2 słowa pamięci programu, 8 poziomów stosu (sprzętowego) i 192 bajty (<0,2 kB) pamięci RAM. Różne piny we / wy miały różne możliwości i skonfigurowałeś sprzęt w razie potrzeby, pisząc do rejestrów sprzętowych. Debugowanie obejmuje oscyloskop i analizator logiki.
W osadzonych abstrakcjach często przeszkadza i zarządza (i kosztuje) zasoby, których nie masz. Np. Większość systemów osadzonych nie ma systemu plików. Kuchenki mikrofalowe to systemy wbudowane. Sterowniki silnika samochodowego. Niektóre elektryczne szczoteczki do zębów. Niektóre słuchawki z redukcją szumów.
Jednym z bardzo ważnych dla mnie czynników przy tworzeniu systemów wbudowanych jest znajomość i kontrolowanie tego, co kod przekłada się na instrukcje, zasoby, pamięć i czas wykonania. Często dokładna sekwencja instrukcji steruje np. Synchronizacją przebiegów interfejsów sprzętowych.
Abstrakcje i „magia” za kulisami (np. Śmieci) jest świetna do aplikacji komputerowych. Śmieciarki oszczędzają dużo czasu, ścigając wycieki pamięci, gdy pamięć jest / może być dynamicznie przydzielana.
Jednak w świecie osadzonym w czasie rzeczywistym musimy wiedzieć i kontrolować, jak długo to trwa, czasem nawet do nanosekund, i nie możemy rzucić kolejnego megabajta pamięci RAM lub szybszego procesora na problem. Jeden prosty przykład: przy programowym przyciemnianiu diod LED przez kontrolowanie cyklu pracy (CPU miał tylko kontrolę włączania / wyłączania diod LED), NIE jest OK, aby procesor zgasł i wykonał np. Usuwanie śmieci na 100 ms, ponieważ wyświetlacz byłby widoczny błyskaj jasno lub gaśnie.
Bardziej hipotetycznym przykładem jest sterownik silnika, który bezpośrednio odpala świece zapłonowe. Jeśli ten procesor się wyłączy i zbierze śmieci na 50 ms, silnik wyłączyłby się na chwilę lub uruchomiłby niewłaściwe położenie wału korbowego, potencjalnie blokując silnik (podczas przejeżdżania?) Lub uszkadzając go mechanicznie. Możesz kogoś zabić.
źródło