RTV forum PL | NewsGroups PL

Jakie funkcje języka C są kluczowe do rozpoczęcia programowania mikrokontrolerów?

Programowanie uC...

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jakie funkcje języka C są kluczowe do rozpoczęcia programowania mikrokontrolerów?

Goto page 1, 2, 3, 4  Next

Jarek
Guest

Tue Sep 27, 2005 6:31 pm   



Czy ktoś mi może powiedzieć jakie funkcje z języka C są potrzebne do
programowania uC?? Albo jaki stopień zaawansowania jest potrzebny żeby
zacząć się uczyć programować uC... narazie naumiałem się kursu
http://www.elektroda.pl/rtvforum/topic224603-120.html
ale coś mi się wydaje że to o dużo za mało może ktoś ma jakieś linki do
kursów online do C...


Z góry dzięki za pomoc...

Sebastian Bialy
Guest

Tue Sep 27, 2005 6:55 pm   



Jarek wrote:
Quote:
Czy ktoś mi może powiedzieć jakie funkcje z języka C są potrzebne do
programowania uC??

Operacje bitowe. Ogólnie dużo zapisów typu:

#define RED_LED_BIT 3
#define LED_PORT PORTC
#define RED_LED_ON LED_PORT|=1<<RED_LED_BIT
#define RED_LED_OFF LED_PORT&=~(1<<RED_LED_BIT)

....
RED_LED_ON;
....

ewentualnie konstrukacje typu:

a=(long)((((unsigned char *)data)[3])&0x3d);

Jesli zrozumiesz co pisze powyżej to drzwi otwarte do programowania uC ;)

I praktycznie zbędna jest wiedza o stdio, stdlib, na małych
mikrokontrolerach biblioteki zewnątrzne się nie przydają.

Podsumowując: moim zdaniem nacisk na sam język C (bity, wskaźniki, etc)
natomiast można pominąc biblioteki standardowe.

drozdu
Guest

Tue Sep 27, 2005 7:38 pm   



Witam!

Quote:
a=(long)((((unsigned char *)data)[3])&0x3d);
Jesli zrozumiesz co pisze powyżej to drzwi otwarte do programowania uC Wink

To chyba lekka przesada ? Kolega sie albo stara pochwalic na sile wlasna
wiedza
albo poprostu poczatkujacych odstraszyc. Pisze duzo w C ale wogole nie widze
o co
ci tutaj chodzi. Moze wyjasnisz tak dla zaspokojenia ciekawosci ?

Quote:
I praktycznie zbędna jest wiedza o stdio, stdlib, na małych
mikrokontrolerach biblioteki zewnątrzne się nie przydają.

Wystarczy przyjzec sie avrlibc na przyklad. Biblioteki zewnetrzne ? A moze
jeszcze laczone dynamicznie ? Piszesz ze sie biblioteki nie przydaja a w
przykladzie
wyzej uzywasz "long a", to sie w mikrokontrolerach przydaje ? Chyba
32 bitowych... (chociaz...)

8051
www.8052.com
AVR
www.avrfreaks.net
rozne (forum moze sie czasem przydac)
www.keil.com

uC dla poczatkujacych
http://www.google.pl/search?hl=pl&q=pocz%C4%85tki+mikrokontrolery&spell=1
kursy programowania
http://www.google.pl/search?hl=pl&q=kurs+jezyka+C&lr=

btw: mikrokontrolery to banal, ja az sie dziwilem ze to takie proste... za
to elektronika
analogowa dla mnie to... musisz napisac jakie uC cie interesuja

pozdr.
LB

Miłosz K.
Guest

Tue Sep 27, 2005 7:52 pm   



Quote:
Jarek wrote:
Czy ktoś mi może powiedzieć jakie funkcje z języka C są potrzebne do
programowania uC??


Quote:
a=(long)((((unsigned char *)data)[3])&0x3d);

Tą linijkę ( wyrwaną z kontekstu jakiegoś niezbyt czytelnie napisanego
programu ) to lepiej pozostaw sobie na moment jak już opanujesz
podstawowe elementy składni : bloki programu, intrukcje warunkowe,
iteracje itd.
Programowanie uC wbrew pozorom nie polega tylko na żąglowaniu bitami,
rzutowaniu typów, itp niskopoziomowymi operacjami. Owszem, że wydusić
ze sprzętu jakieś działanie, to jest niezbędne. Ale każdy bardziej
złożony program zawiera dużą część niezależną od sprzetu, która jest
zapisem jakiegoś algorytmu, który ten program realizuje.
I ten algorytm może identycznie wyglądać w C na Avr'a, 8051,PIC'a i na
PC'cie.

Quote:

Jesli zrozumiesz co pisze powyżej to drzwi otwarte do programowania uC ;)

Drzwi to otwiera nauczenie się solidnych podstaw niezaleznych od platformy.
I praktycznie zbędna jest wiedza o stdio, stdlib, na małych
mikrokontrolerach biblioteki zewnątrzne się nie przydają.


Czyżby ? I wszytkie operacje na stringach, pamięci itp realizujesz
na piechotę własnymi funkcjami...
Biblioteki standartowe są m.in. po to żeby zapewnić jaka taką
przenośność kodu. Pewnie, że często jest to okupione wiekszą objętością
kodu i pisze się własne uproszczone wersje funkcji ( sam tak robię ).
Ale pisanie że biblioteki się nie przydają na uC, to raczej nie jest
dobra wskazówka dla początkujących.


--
Miłosz
-------------------------------------------
AVR: ISP,JTAG,moduły prototypowe (USB/CAN)
http://www.miklobit.com
-------------------------------------------

neuron
Guest

Tue Sep 27, 2005 7:58 pm   



Użytkownik "Jarek" napisał w wiadomości

Quote:
Czy ktoś mi może powiedzieć jakie funkcje z języka C są potrzebne do
programowania uC?? Albo jaki stopień zaawansowania jest potrzebny żeby
zacząć się uczyć programować uC... narazie naumiałem się kursu
http://www.elektroda.pl/rtvforum/topic224603-120.html
ale coś mi się wydaje że to o dużo za mało może ktoś ma jakieś linki do
kursów online do C...


Z góry dzięki za pomoc...

Na pewno nie zaszkodzi jesli kolega zacznie bawic sie z programowaniem dla

pcta - jbuilder , visual itp.
Poza samym jezykiem c przyswoi sobie kolega techniki (obiekty,klasy,metody
i inne podobne bzdety) ktore
na dzien dzisiejszy nie maja wiekszego zastosowania ale juz niedlugo
............
Sadzac po tempie rozwoju procesorow mozan sie spodziewac w najblizszych
latach ataku wszelakiej masci systemow operacyjnych
gdzie zacierac sie beda roznice pomiedzy aplikacjami dzialajacymi w
srodowisku windows czy linux a w srodowisku mikrokontrolerow.
Duza moc mikrokontrolerow w polaczeniu z duza iloscia ramu i romu, a takze
rynkowa tendencja do wykorzystywania z jednej strony
wyswietlaczy graficznych a z drugiej strony protokolow internetowych
spowoduje stopniowe tworzenie tzw maszyn wirtualnych -
czyli bedzie mozna napisac program dzialajacy na pccie, palmtopie lub
atmelku z wyswietlaczem lcd.
Już dzisiaj mozliwe jest zaimplementowanie windowsa ce na odpowiednio silnym
procku - np armie

pozdrawiam wojtek
www.neuron.com.pl

J.F.
Guest

Tue Sep 27, 2005 8:02 pm   



On Tue, 27 Sep 2005 22:38:01 +0200, drozdu wrote:
Quote:
a=(long)((((unsigned char *)data)[3])&0x3d);
Jesli zrozumiesz co pisze powyżej to drzwi otwarte do programowania uC ;)

To chyba lekka przesada ? Kolega sie albo stara pochwalic na sile wlasna
wiedza albo poprostu poczatkujacych odstraszyc. Pisze duzo w C ale wogole
nie widze o co ci tutaj chodzi.

Jesli nie wiesz to nie piszesz w C :-)

Przy czym ten przyklad nawet nie jest trudny Smile
Po tudny to trzeba zajrzec do Bieleckiego.

J.

Sebastian Bialy
Guest

Tue Sep 27, 2005 8:03 pm   



drozdu wrote:
Quote:
a=(long)((((unsigned char *)data)[3])&0x3d);
Jesli zrozumiesz co pisze powyżej to drzwi otwarte do programowania uC ;)


To chyba lekka przesada ? Kolega sie albo stara pochwalic na sile wlasna
wiedza
albo poprostu poczatkujacych odstraszyc. Pisze duzo w C ale wogole nie widze
o co
ci tutaj chodzi. Moze wyjasnisz tak dla zaspokojenia ciekawosci ?

Oczywiście:

Masz zmienną long a;

chcesz sprawdzić czy ustawiony jest bit nr 19.

Typowe podejście:

#define BIT 19

if(a&(1<<BIT)) { ... }

podejście generuje 4 instrukcje porównania (arv-gcc).

Optymalizacja polega na: zamianie a na wskaźnik, zamianie wskaźnika na
wskaźnik na chary, pobraniu chara na pozycji która zawiera bit, i
wyandowaniu go. Efekt długiej linijki to 1 instrukcja porównania w asm w
avr-gcc (sprawdzone doświadczalnie).

if(
((unsigned char)(&(a)))[BIT/8])&(1<<(BIT-(8*(BIT/Cool));
) { ...}

Pisze z głowy i może być z błędem ale mniej więcej o to chodzi.
Powtarzam - typowy programista w C byłby zdziwiony taką składnią, ale
dla mnie dale to pare cykli mniej. Jedyna rzecz nieprzenośna:
little-endian, big-endian, ale łatwo napisac wariant odwrotny.

Dalej będe się upierał, że pisanie w uC wymaga znajomości takich
sztuczek. Szczegónie kiedy mowa o przerwaniach.

Napisałem w dodatku z usmieszkiem "Wink" żeby była jasna sprawa ze
_troche_ żartuje.

Quote:
wyzej uzywasz "long a", to sie w mikrokontrolerach przydaje ? Chyba
32 bitowych... (chociaz...)

W 8-bitowym AVR popełniam własnie palikację, gdzie long long jest za mały Sad

Sebastian Bialy
Guest

Tue Sep 27, 2005 8:11 pm   



Miłosz K. wrote:
Quote:
I praktycznie zbędna jest wiedza o stdio, stdlib, na małych
mikrokontrolerach biblioteki zewnątrzne się nie przydają.

Czyżby ? I wszytkie operacje na stringach, pamięci itp realizujesz
na piechotę własnymi funkcjami...

Jakie operacje ? Masz na myśli printf ? Za bardzo uniwersalne i zajmuje
mase pamięci. A może strlen ? Taką drobnicę można napisać w 2 minuty. To
może malloc ? O akurat malloc używam, choć na wypasionych atmega dużą
ilością pamięci. W zasadzie nie znam przydatnych operacji poza strcmp,
strcpy, memset etc. Ale każda z nich jest na tyle trywialna że można
napisać własną lepszą czesto. Ja w moich programach uC na palcach jednej
reki policze #include <stdio.h> które zastosowałem. I kod jest mimo to
przenośny i to nawet dośc sprawnie pomiędzy róznymi architekturami. Bo
niestety stdio nie ma przenośnej funkcji on_timer czy czegoś w tym
rodzaju ... która akurat jest bardziej przydatna od wypasionego printfa.

Quote:
Biblioteki standartowe są m.in. po to żeby zapewnić jaka taką
przenośność kodu. Pewnie, że często jest to okupione wiekszą objętością
kodu i pisze się własne uproszczone wersje funkcji ( sam tak robię ).
Ale pisanie że biblioteki się nie przydają na uC, to raczej nie jest
dobra wskazówka dla początkujących.

Problem w tym, że dostając do reki 90S2313 nie działa printf("Hello
world"); bo nie ma na czym wyświetlić. Trzeba najpierw porządnie
podłubać z UARTem, a wtedy czesto się okazuje, że własne procedury sa o
wiele wydajniejsze niż wbudowane w bibliotekę (co nie przeszkadza im
mieć np. takiej samej skladni i obsługi - żeby zapewnić przenośnośc).

Nie jestem wrogiem bibliotek standardowych w ogóle, ale na uC naprawde
żadko mialem okazje uznać je za przydatne do czegokolwiek.

Wojtek Kaniewski
Guest

Tue Sep 27, 2005 8:29 pm   



Sebastian Bialy napisał(a):
Quote:
Operacje bitowe. Ogólnie dużo zapisów typu:

#define RED_LED_BIT 3
#define LED_PORT PORTC
#define RED_LED_ON LED_PORT|=1<<RED_LED_BIT
#define RED_LED_OFF LED_PORT&=~(1<<RED_LED_BIT)

...
RED_LED_ON;
...

nie ucz ludzi złych nawyków. nauczy się takiego korzystania z makr i
zacznie robić koszmarki w stylu:

#define MUL(x,y) x*y
int foo = MUL(1+2,3+4);

albo co gorsza:

#define FOO x=1;y=2
if (bar) FOO;

parametry makr wypadałoby ubierać w nawiasy. do tego jeśli makro jest
wyrażeniem, wrzucić je całe w nawias, a jeśli instrukcją to ubrać w do
.... while(0).

w.

Sebastian Bialy
Guest

Tue Sep 27, 2005 8:47 pm   



Wojtek Kaniewski wrote:
Quote:
#define RED_LED_BIT 3
#define LED_PORT PORTC
#define RED_LED_ON LED_PORT|=1<<RED_LED_BIT
#define RED_LED_OFF LED_PORT&=~(1<<RED_LED_BIT)

nie ucz ludzi złych nawyków. nauczy się takiego korzystania z makr i
zacznie robić koszmarki w stylu:

#define MUL(x,y) x*y
int foo = MUL(1+2,3+4);

albo co gorsza:

#define FOO x=1;y=2
if (bar) FOO;

parametry makr wypadałoby ubierać w nawiasy. do tego jeśli makro jest
wyrażeniem, wrzucić je całe w nawias, a jeśli instrukcją to ubrać w do
... while(0).

Heh, a gdzie ja użyłem parametrycznych makr Smile ?

Zdajesz sobie sprawę, że napisanie procedury zapalającej diodę generuje
narzut w postaci paru bajtów kodu ? Przy pisaniu na dużego peceta przez
myśl by mi nie przeszlo robić takich numerów. Przy pisaniu na uC potrafi
uratować dupsko.

Miłosz K.
Guest

Tue Sep 27, 2005 8:48 pm   



Sebastian Bialy napisał(a):

Quote:


Problem w tym, że dostając do reki 90S2313 nie działa printf("Hello
world"); bo nie ma na czym wyświetlić. Trzeba najpierw porządnie
podłubać z UARTem, a wtedy czesto się okazuje, że własne procedury sa o
wiele wydajniejsze niż wbudowane w bibliotekę (co nie przeszkadza im
mieć np. takiej samej skladni i obsługi - żeby zapewnić przenośnośc).

Przykłady, które podałeś sugerują, że większość twoich programów nie
przekracza wilkością pamięci 90S2313. Przy takiej pamięci to faktycznie
czasem trzeba zaciemnić kod żeby wydusić te parę bajtów oszczędności.
Tylko jak ktoś na początku swojej drogi zadaje pytanie od czego
powienien zacząć, to po takich radach dojdzie do (fałszywego) wniosku,
że to są właściwe wzorce do naśladowania.

A potem np. niektórzy ludzie nauczeni pisac w takim stylu
biorą udział w projekcie ,gdzie powstają dziesiątki tysięcy lini kodu,
a mnie szlag trafia, jak muszę czytać takie źródła w których roi sie od
"magic numbers", komentarzy jak na lekarstwo, a pojedyncze funkcje maja
po kilkaset lini.

Ale ponieważ odeszliśmy od zasadniczego tematu , to ja polecam
do nauki siegnąć po praźródło czyli Kerninghan&Ritchie.
Pozycja w sam raz sie nadaje do uC, bo wszystkie przykłady są do
obsłużenia przy pomocy bibliotek standardowych.


--
Miłosz

-------------------------------------------
AVR: ISP,JTAG,moduły prototypowe (USB/CAN)
http://www.miklobit.com
-------------------------------------------

Wojtek Kaniewski
Guest

Tue Sep 27, 2005 8:50 pm   



Sebastian Bialy napisał(a):
Quote:
Heh, a gdzie ja użyłem parametrycznych makr Smile ?

#define A 1+2
#define B 3+4
#define C A*B

taki przykład jest lepszy?

Quote:
Zdajesz sobie sprawę, że napisanie procedury zapalającej diodę generuje
narzut w postaci paru bajtów kodu ? Przy pisaniu na dużego peceta przez
myśl by mi nie przeszlo robić takich numerów. Przy pisaniu na uC potrafi
uratować dupsko.

zdaję sobie sprawę. nigdzie nie pisałem o funkcjach, ani nie zanegowałem
sens korzystania z makr. po prostu jeśli chcesz kogoś uczyć, to ucz od
razu tak, żeby sobie w przyszłości nie odstrzelił stopy.

w.

Sebastian Bialy
Guest

Tue Sep 27, 2005 8:57 pm   



Miłosz K. wrote:
Quote:
Przykłady, które podałeś sugerują, że większość twoich programów nie
przekracza wilkością pamięci 90S2313. Przy takiej pamięci to faktycznie
czasem trzeba zaciemnić kod żeby wydusić te parę bajtów oszczędności.

Sugerujesz, że mając np. ARM mogę założyć nieskończony czas wykonywania
procedury timera ? Sztuczki sztuczkami, ale programując sprzęt nie ma
mowy czasami o byciu grzecznym programistą. Cykl jest cykl i go nie
przeskoczysz. Swoją droga ostatnio miałem do czynienia wlasnie z
podejściem "przenośnym" i skończyło się to za zgrzytaniu zębami na
jakośc kodu wygenerowanego przez avr-gcc. Musiałem napisać osobne
procedury dla każdego procesora z #ifdef. Nie wszystko można zrobić
przenośnie.

Quote:
Tylko jak ktoś na początku swojej drogi zadaje pytanie od czego
powienien zacząć, to po takich radach dojdzie do (fałszywego) wniosku,
że to są właściwe wzorce do naśladowania.

Oczywiście, że nie mamy oboje racji. Ani UART_BUFFER=c; ani
fprintf(uart,"dupa"); nie są idelne, zależy od zastosowań. Ale zakładam
(o ja maluczki) że raczej człowiek ucząc się programować zacznie od
migania diodą a nie od napisania FFT na ATTiny.

Quote:
A potem np. niektórzy ludzie nauczeni pisac w takim stylu
biorą udział w projekcie ,gdzie powstają dziesiątki tysięcy lini kodu,
a mnie szlag trafia, jak muszę czytać takie źródła w których roi sie od
"magic numbers", komentarzy jak na lekarstwo, a pojedyncze funkcje maja
po kilkaset lini.

Świetnie, bo mnie też szlag trafia. Tylko że to chyba nie ma związku z
tym wątkiem ?

Quote:
Ale ponieważ odeszliśmy od zasadniczego tematu , to ja polecam
do nauki siegnąć po praźródło czyli Kerninghan&Ritchie.
Pozycja w sam raz sie nadaje do uC, bo wszystkie przykłady są do
obsłużenia przy pomocy bibliotek standardowych.

W tej ksiązce trafisz na przykład migania diodą na 90S2313 albo może na
jakąs skromną procedurę inicjacji timera0 z użyciem biblioteki
standardowej ?

Obawiam się że sporo przykładów musisz odrzucić w przedbiegach - nie ma
monitora (stdout/stdin). Jedyne wyjście to UART żeby choć troche z tych
przykładów uruchomić, ale najpierw trzeba wiedzieć JAK go uruchomić.

Sebastian Bialy
Guest

Tue Sep 27, 2005 9:04 pm   



Wojtek Kaniewski wrote:
Quote:
Heh, a gdzie ja użyłem parametrycznych makr Smile ?
#define A 1+2
#define B 3+4
#define C A*B

taki przykład jest lepszy?

Może i lepszy, tylko akurat w podanym przeze mnie przypadku raczej
takiej wpadki nie bedzie (bo po co liczyn numer pinu ?).

point
Guest

Tue Sep 27, 2005 9:11 pm   



Sebastian Bialy wrote:

Quote:
ewentualnie konstrukacje typu:

a=(long)((((unsigned char *)data)[3])&0x3d);

Masakra to już lepiej stosować coś ala MISRA C i wlutować szybszy
kwarc;) Bo optymalizacje na etapie klepania kodu są bez sensu przy
dobrym kompilatorze.

--
point

Goto page 1, 2, 3, 4  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Jakie funkcje języka C są kluczowe do rozpoczęcia programowania mikrokontrolerów?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map