Czy w przyszłości będzie możliwe pisanie kodu w C ++ dla mikrokontrolerów PIC?

8

Czy kiedykolwiek będzie można używać C ++ do kodowania PIC? Czy są jakieś ograniczenia sprzętowe, które uniemożliwiają nam używanie C ++? O ile większy jest rozmiar generowanego pliku .hex i czas działania programu, gdy używamy C ++ zamiast C? Czy jest praktycznie możliwe użycie C ++ dla obecnych PIC? Czy są jakieś plany na przyszłość lub dalszy rozwój?

hkBattousai
źródło
Myślę, że jest to możliwe i pozostanie możliwe, ale AFAIK nie jest zalecane, ponieważ implementuje struktury wysokiego poziomu i funkcje, które nie są odpowiednie do programowania silnie związanego ze sprzętem
clabacchio
3
Do debaty na temat przydatności - electronics.stackexchange.com/questions/3027/…
Toby Jaffey
2
Ponieważ odpowiedź brzmi: „Tak, istnieją już kompilatory C ++”, pozwolę sobie na to, ale w przyszłości powinieneś być świadomy, że pytania Stack Exchange powinny dotyczyć sprawdzalnych faktów, a nie przypuszczeń dotyczących przyszłości.
Kevin Vermeer
2
@clabacchio: Niekoniecznie prawda. W C ++ płacisz tylko za to, czego używasz. Zobacz moją odpowiedź na stronie: electronics.stackexchange.com/questions/3027/…
Rocketmagnet
„PIC” to bezużyteczne uogólnienie. W niektórych niższych modelach PIC (10F200) użycie C jest prawie niemożliwe. Mówi się, że w niektórych wysokiej klasy PIC-ach (seria 32MX) C ++ ma być teraz używany i na pewno nie ma technicznych powodów, dla których nie mógłby. Więc lepsze skupienie może dać bardziej użyteczną odpowiedź, teraz wszyscy w rzeczywistości odpowiadają na inne pytanie.
Wouter van Ooijen

Odpowiedzi:

17

Czy kiedykolwiek będzie można używać C ++ do kodowania PIC?

Tak, teraz jest to możliwe. W przypadku dsPIC istnieje kompilator IAR Systems C ++ (chociaż jest bardzo stary i nie jest obsługiwany).

Inną opcją jest użycie konwertera C ++ na C. Korzystając z kroku przed kompilacją, przekonwertuj C ++ na C, a następnie (nieprzyjemnie wyglądający) C na normalny kompilator C. Spójrz na LLVM lub kompilator C ++ Comeau, które to robią. Comeau's kosztuje tylko 50 USD, ale prawdopodobnie zajmie trochę wysiłku, aby cały łańcuch narzędzi i biblioteki działały poprawnie.

Czy są jakieś ograniczenia sprzętowe, które uniemożliwiają nam używanie C ++?

Krótka odpowiedź, nie, nie ma ograniczeń sprzętowych. Długa odpowiedź, C ++ z pewnością zachęca do korzystania ze sterty i / lub stosu, z którymi zmagają się mniejsze MCU z ograniczoną pamięcią RAM.

Dlaczego walczą ze stosem / stosem? Z dwóch powodów: A) wiele MCU ma ograniczoną pamięć RAM, niewystarczająco na stertę i ledwo na stos. B) wiele MCU nie radzi sobie dobrze ze wskaźnikami, więc użycie zmiennych na stosie naprawdę zabija wydajność.

Kiedy ludzie pytają o użycie C ++ na MCU, uważam, że konstruktywne jest porównywanie C ++ z C. Dokładnie te same pytania były (i nadal są) zadawane o C na MCU. Ludzie zwykli niepokoić się tym pomysłem. Język wysokiego poziomu, na 256 bajtowej pamięci MCU RAM? Niemożliwy. Ale teraz wszyscy wiemy, że to możliwe. Napisałem C dla PIC12. Nie ma problemu. Jest to możliwe, ponieważ A) twórcy oprogramowania wiedzą, że muszą być trochę ostrożni: nie używaj malloc () itp. I B) kompilator został napisany specjalnie dla MCU. Kompilator będzie również bardzo ostrożny przy alokacji pamięci, nie będzie próbował utworzyć sterty i może nie utworzyć stosu. Niektóre kompilatory C po prostu nie pozwalają pisać kodu rekurencyjnego (rekurencyjnego), który absolutnie wymaga stosu.

Wiedząc, że można napisać C dla MCU, te same odpowiedzi dotyczą pytania o pisanie C ++ na MCU. Tak długo, jak kompilator rozumie ograniczenia urządzenia docelowego, a użytkownik rozumie również język, tak naprawdę nie ma problemu. W C ++ płacisz tylko za to, czego używasz. Jest całkowicie możliwe, aby napisać C ++ (z obiektami i wszystkim), który generuje dokładne wyjście asm, które uzyskałbyś, gdybyś użył C.

Teraz PIC32 z pewnością poradzi sobie z C ++. Mają do 64 kB pamięci RAM i są oparte na rdzeniu MIPS, który jest odpowiednio dorosłym 32-bitowym procesorem. Może poradzić sobie ze wskaźnikami i stosem, a także z komputerem PC. Rzeczywiście istnieją komputery oparte na MIPS (a przynajmniej takie były).

Niestety, wokół C ++ jest tyle nieporozumień. Wydaje się, że nawet bardzo doświadczeni koderzy nie mają pojęcia, jak działa ten język. Zobacz moją odpowiedź na temat tego, dlaczego C ++ jest odpowiedni dla wbudowanych procesorów.

O ile większy jest rozmiar generowanego pliku .hex i czas działania programu, gdy używamy C ++ zamiast C?

Jak powiedziałem, może nie być różnicy. Bjarne Stroustrup dokonał porównania wielu kompilatorów C / C ++ w celu porównania wydajności czasowej i przestrzennej dla wielu operacji. Wyniki były bardzo zróżnicowane. W niektórych przypadkach C ++ pojawiał się wolniej i większy, w niektórych przypadkach wolniejszy i mniejszy lub szybszy i większy, a nawet coraz szybszy i mniejszy! Tak więc odpowiedź na twoje pytanie jest taka, że ​​zależy to w dużej mierze od kompilatora, ale generalnie nie musi w ogóle mieć znaczenia. Aby uzyskać więcej informacji, zobacz Raport techniczny dotyczący wydajności C ++

Czy są jakieś plany na przyszłość lub dalszy rozwój?

Tego nie wiem. Wiem, że kompilator Microchip C32 jest oprogramowaniem typu open source i można pobrać źródło. Wiem też, że ktoś, z kim pracowałem, znalazł instrukcje online i udało się uzyskać kompilator do kompilacji kodu C ++. Ale opuścił firmę, zanim zdążył skonfigurować właściwy łańcuch narzędzi.


AKTUALIZACJA

Microchip ma teraz kompilator C ++ dla swoich wbudowanych mikrokontrolerów PIC32.


Rocketmagnet
źródło
ze strony internetowej IAR: „Wcześniejszy produkt: IAR Embedded Workbench dla dsPIC jest starszym produktem. IAR Systems nie aktualizuje go i nie można kupić dla niego umowy wsparcia i aktualizacji”.
Jason S
Wiem, że produkty IAR są świetne, ale niestety bardzo drogie i wydaje się „stare”. Wiem, że C ++ jest wykonalny na dowolnej platformie, o ile nie korzystasz ze wszystkich funkcji. Dodaje jednak możliwość dodatkowej warstwy abstrakcji z klasami. Nie używam często szablonów, w ogóle nie korzystam z dynamicznych przydziałów pamięci. Czy ktoś zna innego konkurenta dla C ++ na PIC24 / PIC32?
Hans
Tak, przepraszam, to nie było naprawdę świetne znalezisko. Pozwól mi dodać kilka rzeczy do mojej odpowiedzi.
Rocketmagnet
1
Uznałbym C za konkurenta dla C ++ na mikrokontrolerze. Nie mogę wymyślić niczego, co chciałbym zrobić w C ++, czego nie mogę zrobić w C, a jest mniej niewidocznych wywołań funkcji (konstruktorów, destruktorów itp.). Sprawia, że ​​kod jest bardziej deterministyczny i przejrzysty. Jakie funkcje C ++ są obowiązkowe, których nie można zmącić za pomocą C?
AngryEE
1
Można zapytać: „Jakie cechy C są obowiązkowe, których nie można zmącić w ASM?” Odpowiedz: „Nic”. Korzyściami są zwiększone możliwości projektanta w zakresie określania projektu i umożliwienia kompilatorowi sprawdzenia, czy implementacja jest poprawna. Zobacz moją odpowiedź electronics.stackexchange.com/questions/3027/..., aby uzyskać listę rzeczywistych i bezpośrednich korzyści płynących z C ++ w tym zakresie.
Rocketmagnet
5

O ile większy jest rozmiar generowanego pliku .hex i czas działania programu, gdy używamy C ++ zamiast C?

Zależy, jakich funkcji używasz. Jeśli użyjesz podstawowych funkcji obiektowych (klasy + metody), prawdopodobnie będą one miały bardzo niewielki wpływ (zniekształcone nazwy zmiennych / funkcji dłużej, więc tablica symboli prawdopodobnie nieco wzrośnie). Szablony nie powinny również dodawać wiele przy dobrym kompilatorze.

Jeśli oszalejesz i wciągniesz takie rzeczy, jak Standardowa Biblioteka Szablonów, i użyjesz dynamicznej alokacji pamięci i wyjątków, najprawdopodobniej napotkasz rozrost kodu.

Jason S.
źródło
Będąc ostrzeżeniem dla OP, bądź bardzo ostrożny przy alokacji pamięci na małych architekturach pamięci i wbudowanych zawsze działających systemach.
kenny
czy „-1” może skomentować, dlaczego nie zgadza się?
Jason S
Nie jestem -1er, ale szablony są funkcją, z której należy korzystać bardzo ostrożnie, aby uniknąć rozdęcia kodu. Możesz łatwo skończyć z wieloma kopiami algorytmu, gdy wystarczy.
Peter Green
Aby to zrobić, musiałbyś użyć szablonu z kilkoma różnymi typami danych, a jedna kopia NIE BYŁaby wystarczająca, chyba że użyjesz kodu polimorficznego, który ma wspólną klasę bazową. (W takim przypadku istnieje koszt wykonania). Szablony nie powodują magicznego rozdęcia kodu, powodują jedynie rozdęty kod, gdy używa się ich z wieloma typami danych, gdy nie są świadomi konsekwencji.
Jason S
1

Uogólniając nieco twoje pytanie, istnieją procesory ARM zbudowane dla rynku wbudowanego, które zawierają MMU (moduł zarządzania pamięcią). Rozmiar pamięci i alokacja sprawiły, że języki takie jak Java i C ++ nie były dobrze osadzone. Ponieważ wbudowane procesory stają się coraz szybsze i wydajniejsze, a pamięć staje się gęstsza i tańsza, wybór języka dostępny dla inżynierów osadzonych zmienia się dramatycznie. 32-bitowy procesor ARM 600 MHz z MMU i kartą 64G Flash jest doskonałym kandydatem do aplikacji c ++. To, czy pasuje do definicji klasycznego wbudowanego procesora, to inna kwestia.

Spearson
źródło
0

Prawdopodobnie tak ... ale nie powinieneś i tak ... C jest językiem osadzonym i nie ma zalet używania C ++. A raczej zalety C znacznie przewyższają zalety C ++ dla osadzonych. Nie marnuj czasu.

  • jeśli wiesz, jak używać wskaźników funkcji itp. Możesz kodować jak C ++, nie ma z tym problemu.
Ktc
źródło
5
Pozwolę sobie być innego zdania. Możesz korzystać z wielu funkcji C ++ (klasy, szablony, przeciążanie operatora, referencje) przy niewielkich lub zerowych kosztach czasu wykonywania. Tak, możesz robić wszystkie te rzeczy w zwykłym C za pomocą hackerskich konstrukcji, ale jest to uciążliwe dla twojego mózgu i wolałbym używać C ++. (oczywiście wolałbym używać lepszego języka, ale wybrałbym kompilator C ++ w mgnieniu oka nad zwykłym C.)
Jason S
1
Classes = structs (bez wbudowanych metod, ale jeśli chcesz, możesz zapisać wskaźnik funkcji w struct i wywołać to). Szablony = używasz tych ??? Przeciążenie operatora = tak, też tego chciałbym. Referencje = wskaźniki, nie? Przy pomocy C przynajmniej możesz korzystać tylko z „funkcji” C ++, których potrzebujesz, nie martwiąc się o generowanie nadmiernego kodu lub dołączając losową dużą bibliotekę tylko po to, aby uzyskać coś do skompilowania.
AngryEE
1
Zaczynam też się różnić.
Rocketmagnet
3
Tak, szablony są niezwykle wydajnym sposobem generowania niezawodnego i wydajnego kodu. Referencje są bardziej niezawodnym wskaźnikiem. W C ++ płacisz także tylko za używane funkcje. Myślę, że naprawdę musisz lepiej zrozumieć C ++.
Rocketmagnet
3
Nie wiem, co rozumiesz przez „C jest językiem osadzonym”. Jasne, to bardzo popularne. Mówisz, że to najlepszy możliwy język? Na pewno nie.
Rocketmagnet