• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie mikrokontrolerów w języku C++

Object Storage Arubacloud
+5 głosów
12,597 wizyt
pytanie zadane 8 kwietnia 2015 w C i C++ przez marek2012r Początkujący (260 p.)
Witam.Chciałbym się nauczyć programowania mikrokontrolerów w języku C++. Czy programowanie mikrokontrolerów i programowanie na konsoli lub aplikacji okienkowych bardzo się różni od programowania uC. Z góry dziękuję za odpowiedź. Pozdrawiam.

9 odpowiedzi

+2 głosów
odpowiedź 8 kwietnia 2015 przez MrWeb Stary wyjadacz (10,200 p.)
wybrane 8 kwietnia 2015 przez marek2012r
 
Najlepsza

Cześć, może nie mam dużego doświadczenia w programowaniu uC ale trochę w tym siedziałem.

Chciałbym się nauczyć programowania mikrokontrolerów w języku C++. 

C++ i uC się nie łączą... Wszelkie mikroprocesory programuje się w języku C wraz ze zbiorem bibliotek dla danego urządzenia np C i ToolKit AVR do mikrokontrolerów AVR, lub biblioteki dla PIC'ów.

Co prawda istnieje kompilator C++ dla AVR ale nie obsługuje on 90% zalet C++ czyli, nie wspiera w pełni obiektówki, nie ma szablonów itd itd, i kod wynikowy jest dużo większy a to ma znaczenie szczególnie w mikrokontrolerach gdzie liczy się każdy bajt (pamięć takiego procesorka to np 8kB).

Wyjątkiem jest Arduino które działa w oparciu o mikrokontrolery AVR i wspiera obiektowy C++ ale nigdy nic nie robiłem w arduino więc nie wiem jak to jest dokładnie.

 

Czy programowanie mikrokontrolerów i programowanie na konsoli lub aplikacji okienkowych bardzo się różni od programowania uC

Programowanie uC prawie zawsze sprowadza się do grzebania w dokumentacji mikroprocesora by odnaleść nazwę i konfigurację odpowiedniego rejestru i jego zmianę. Czyli trochę mało ma to wspólnego z aplikacjami okienkowymi.

Np. Program dla AVR który co 1s będzie zmieniał stan diody podłączonej na pin 1 portu D może wyglądać np. tak:

#include <avr/io.h>
#include <util/delay.h>

int main(void)

{
   DDRD |= (1 << 0); //pin 1 portu D - jako WYjście
   PORTD &= ~(1 << 0); //pin 1 portu D - stan niski

   while(1)
   {
      PORTD ^= (1 << 0); //pin 1 portu D - operacja XOR
      _delay_ms(1000); //czekaj 1sec
   }
   return 0;
}

Jak widać, całość programu opiera się na przestawianiu rejestrów, ustawiłem DDRX, PORTX itd. Programowanie uC to 30% używania funkcji, 70% ustawiania rejestrów procesora i operowaniu na wnętrznościach (np timer 8bitowy) wink

Można oczywiście pisać pod Arduino gdzie to wszystko było by dużo ładniejsze i przyjemniejsze dla kodera ale jak już mówiłem, nie mam doświadczenia w tej platformie.

 

Jeśli chcesz wiedzieć coś więcej na ten temat, polecam:

http://mirekk36.blogspot.com/ - blog o programowaniu na AVR

https://www.youtube.com/user/mirekk36 - wersja wideo informacji z bloga

http://forum.atnel.pl/portal.php - możesz się ich spytać, napewno odpowiedzą ;)

komentarz 8 kwietnia 2015 przez marek2012r Początkujący (260 p.)
Aha. Ja myślałem że to jakoś trzeba sięgnąć w głąb języka C a to praktycznie tylko wystarczy znać operacje bitowe instrukcje warunkowe i tyle. Dzięki kolego za bardzo dokładną odpowiedź ;)
komentarz 8 kwietnia 2015 przez marek2012r Początkujący (260 p.)
A w tym kodzie można zamiast przesunięć typu (1 << 0) wpisywać postać szesnastkową z tymi 0xFF itp ?
1
komentarz 8 kwietnia 2015 przez januchoxd Nowicjusz (160 p.)
edycja 8 kwietnia 2015 przez januchoxd
oczywiście, że tak, ale daj 5 minut na zrozumienie metody wykorzystującej operatory bitowe !!! bardzo ułatwiają, przyspieszają pracę i czynią kod bardziej przejrzysty np

pisząc (1<<PB1) od razu wiesz że gmerałeś przy PB1 na uC ;)
Przykład:
Bez operatorów:

#include <avr/io.h>
#include <util/delay.h>

int main (void)    {
        DDRB = 0x20;
        
        while (1)
        {
            PORTB = 0x00;
            _delay_ms (1000);
            PORTB = 0x20;
            _delay_ms (1000);
        }
    }

Z operatorami:

#include <avr/io.h>
#include <avr/delay.h>

int main(void){
    DDRB |= (1<<PB5);
    PORTB |= (1<<PB5);

    while(1){
        PORTB ^= (1<<PB5);  //zmień stan na PB5
        _delay(1000);
    }

}

oba programy migają diodą podłączoną do pinu uC - PB5 - takie oznaczenie znajdziesz w nocie katalogowej mikrokontrolera

Dodam jeszcze dla jasności skąd te PB5, DDRB itp się biorą - dodana bilioteka <avr/io.h> będąca elementem biblioteki avr-libgc kompilatora AVR-GCC.

Więc kiedy tylko określimy w projekcie jaki uC programujemy, biblioteka od razu wie że np PB3 to odpowiednik nóżki na mikrokontrolerze PB3.

DDRx - rejestr kierunku (pinów/portu)

PORTx - rejestr wyjściowy

PINx - rejestr wejściowy

x- konkretny port A,B,C...itd
komentarz 8 kwietnia 2015 przez MrWeb Stary wyjadacz (10,200 p.)

@up, dokładnie tak :)

 

 

Aha. Ja myślałem że to jakoś trzeba sięgnąć w głąb języka C a to praktycznie tylko wystarczy znać operacje bitowe instrukcje warunkowe i tyle. Dzięki kolego za bardzo dokładną odpowiedź ;)

Noo... może nie do końca.... Nie ma jakichś mega wymyślnych ficzerów z języka C bo zazwyczaj po prostu brakuje miejsca w pamięci flash, ale operacje bitowe, maski bitowe, przesunięcia bitowe itd to wszystko trzeba mieć w jednym palcu żeby płynnie działać na uC.

Dochodzi do tego czynnik zewnętrzny, tzn układ który budujesz zapewne będzie złożony na stykówce która się zużywa - po pewnym czasie styki będą luźne i coś po prostu nie będzie stykać wink Gdy przekroczysz indeks tablicy w C/C++ komputer natychmiast zatrzyma program i Ci powie gdzie, co i jak się zepsuło a w przypadku programowania "niskopodłogowego" nie masz praktycznie żadnych informacji zwrotnych poza własną wiedzą, doświadczeniem i ewentualnie diodą-debbugerem ;) 

+2 głosów
odpowiedź 8 kwietnia 2015 przez HaKIM Szeryf (87,590 p.)
Co do nauki to proste. YouTube:

https://www.youtube.com/results?search_query=programowanie+mikrokontroler%C3%B3w+c%2B%2B

W języku c++ nie widziałem, a co do googla to:

http://www.elektroda.pl/rtvforum/topic1591475.html - Jest tam napisane że tak, c++ się nadaje. Poczytaj. : p
+1 głos
odpowiedź 8 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)
Lepiej naucz się C. To jest język pod mikrokontrolery. Przejście z C++ na C to nic strasznego.
komentarz 8 kwietnia 2015 przez marek2012r Początkujący (260 p.)
Znaczy język C już opanowałem ale wydaje mi się że język C++ jest dla mnie prostszy i wygodniejszy do pisania na komputerze.
komentarz 8 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)
Będziesz miał większą wygodę w C, bo jest lepiej udokumentowany do mikrokontrolerów. Spokojnie, przyzwyczaisz się do C. Moim pierwszym językiem był C++, a na spoj'u często rozwiązuję zadania właśnie w C.
+1 głos
odpowiedź 8 kwietnia 2015 przez jeremus Maniak (59,720 p.)

Najlepszy blog na ten temat :

http://mirekk36.blogspot.com/

oraz forum :

http://forum.atnel.pl/portal.php

+1 głos
odpowiedź 8 kwietnia 2015 przez AndreAS Początkujący (400 p.)
Ja też uważam , że lepiej mikrokontrolery programować w C , a najlepszy wybór to  www.atnel.pl .
+1 głos
odpowiedź 8 kwietnia 2015 przez januchoxd Nowicjusz (160 p.)
edycja 8 kwietnia 2015 przez januchoxd

Warto by było jeszcze dodać o jakie mikrokontrolery chodzi : AVR, PIC, ARM, 

Programowałem do tej pory tylko AVR-y więc tylko do tego mogę się odnieść:

1 Co do różnic - o ile w pisaniu oprogramowania na PC operatory bitowe nie są zbyt często stosowane, tak dla uC są codziennością ( przesunięcia bitowe, bitowy iloczyn logiczny, bitowa suma logiczna, bitowa różnica symetryczna, bitowa negacja) - i nie mylić z operatorami logicznymi ! 

To jedna z pierwszych rzeczy jaka przychodzi mi na myśl. Oczywiście dochodzi korzystanie z bibliotek stricte dla uC takich jak np  <avr/io.h> czy <avr/delay.h>. Przed skompilowaniem pliku z kodem ustawia się wykorzystywany programator, mikrokontroler i częstotliwość na jaką jest ustawiony - takie informacje są zapisywane w pliku makefile, tutaj sporo osób zamieszcza informację o częstotliwości uC w pliku kodu - co nie jest raczej dobrą ani wygodną praktyką ;)

Ogólnie jest parę małych różnic, ale jak umiesz C/C++ to od strony kodu nie powinieneś mieć problemu ;) 

2  Co do wyboru C czy C++ tutaj zgodzę się że zdecydowanie więcej jest źródeł do nauki wykorzystujących C i dlatego polecam zacząć naukę programowania MCU od właśnie C, odrzucając podejście obiektowe.

 ALE !!! co do różnic w szybkości kodu wynikowego jak i ilości zajmowanej pamieci przez program między C a C++ jest to bardzo mała różnica, która przy starannym wykorzystaniu kodu jest nawet na korzyść C++. Nie mówię, że C++ jest lepszy ale jak bardziej Ci odpowiada nie widzę problemu by programować uC w tym języku. 

Jakość programu zależy wyłącznie od umiejętności danego programisty a nie wybranego języka ;)

O a tutaj jest super artykuł o C++ dla uC, oczywiście już wiele razy wymienianego bloga mirek36

http://mirekk36.blogspot.com/2014/06/c-dla-avr-tutorial-w-odcinkach.html

komentarz 8 kwietnia 2015 przez marek2012r Początkujący (260 p.)
Dzięki kolego za tak szczegółową odpowiedź ;)
komentarz 8 kwietnia 2015 przez januchoxd Nowicjusz (160 p.)
nie ma sprawy, jestem amatorem, ale jeżeli masz jeszcze jakieś pytania - wal śmiało, programowanie uC to bardzo przyjemna sprawa ;)
+1 głos
odpowiedź 17 sierpnia 2016 przez Macek Kolo Mądrala (5,480 p.)
Co do C vs C++ dla mikroklocków polecam obejrzeć https://www.youtube.com/watch?v=PDSvjwJ2M80 Używając C++ z głową można zrobić lepszy(szybszy/lżejszy) kod
0 głosów
odpowiedź 8 kwietnia 2015 przez szmq Pasjonat (22,770 p.)
edycja 8 kwietnia 2015 przez szmq
Co daje programowanie mikrokontrolerów w C++?? Słyszałem, że nic. Zresztą zobaczysz, że C nie jest czymś złym i jest bardzo podobny.
0 głosów
odpowiedź 8 kwietnia 2015 przez marek2012r Początkujący (260 p.)
A jeszcze się spytam przy okazji czy w C można pisać programy okienkowe czy tylko można je pisać w C++?
komentarz 8 kwietnia 2015 przez szmq Pasjonat (22,770 p.)
Kod C skompiluje się pod kompilatorem C++ :D A jeżeli chodzi o biblioti graficzne możesz korzystać z Allegro, Sdl, WinApi(które jest napisane w C i umożliwa pisanie aplikacji okienkowych)

Podobne pytania

0 głosów
0 odpowiedzi 735 wizyt
pytanie zadane 19 grudnia 2015 w C i C++ przez Waszek Gaduła (4,130 p.)
0 głosów
0 odpowiedzi 195 wizyt
pytanie zadane 12 stycznia 2020 w Mikrokontrolery przez Marak123 Stary wyjadacz (11,190 p.)
0 głosów
4 odpowiedzi 1,795 wizyt

92,556 zapytań

141,404 odpowiedzi

319,563 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...