RTV forum PL | NewsGroups PL

Zalecane środowiska programistyczne dla PIC16F877A: opinie i darmowe opcje

PICowanie

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Zalecane środowiska programistyczne dla PIC16F877A: opinie i darmowe opcje

Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next

Jakub Rakus
Guest

Wed Oct 09, 2013 7:26 pm   



On 08.10.2013 22:42, stchebel@gmail.com wrote:
Quote:
Witam,

Nigdy się w to nie bawiłem, bo potrzeby takowej nie było, aż tu nagle jest potrzeba picowania. Konkretnie PIC16F877A.


Ja walczyłem dokładnie z tym prockiem w starym mplabie i w mplabx.
Spodobał mi się wbudowany w mplabx debuger, a asemblerze wstawki też się
całkiem możliwie robi. Używałem kompilatora od hi-techa, wymagało to
chwili na skonfigurowanie środowiska i poczytanie dokumentacji (hi-tech
i kompilator od mikrocipa nieco odmiennie rozumieją niektóre zapisy np.
dotyczące ustawiania rejestrów konfiguracyjnych procka).

--
Pozdrawiam
Jakub Rakus

Sebastian Biały
Guest

Wed Oct 09, 2013 7:46 pm   



On 2013-10-09 11:52, stchebel@gmail.com wrote:
Quote:
Podejrzewam, że jest kompilator C, ale raczej nie jestem fanem tego potrąbionego języka programowania.

Kompilator C na PICe jest. Prawdziwy dramat że nie ma C++ [*]. Masz
jednak trzecie "wyjścia", np: http://www.rfc1149.net/devel/rforth1.html

Quote:
O popierdolonych znakach funkcji logicznych nawet nie ma co wspominać...

Zmartwie cie: C to *jedyny* naprawdę przenośny język programowania,
szczególnie w embedded. Albo się z nim przeproś albo pisz to samo w
Ada/Lisp i szukaj arch na której ktoś łaskawie napisał kompilator (który
i tak zapewne nie działa) ...

[*] Akademicko patrząc nigdzie nie ma C++, ale na PiCe jakby najbardziej
nie ma.

Marek
Guest

Wed Oct 09, 2013 8:26 pm   



On Wed, 09 Oct 2013 21:46:39 +0200, Sebastian
Biały<heby@poczta.onet.pl> wrote:
Quote:
Kompilator C na PICe jest. Prawdziwy dramat że nie ma C++ [*]. Masz

Matko jedyna, po co c++ na 8bit? Twierdzenie, że nie ma c++ dla pic
na pod jest nie do końca prawdą bo microchip od jakiegoś czasu
udostępnił swoje patche do g++ na pic32, g++ się już można
skomplikować przy kompilacji całego kompilatora c32 i ma już
wymagane liby.

--
Marek

Marek Borowski
Guest

Wed Oct 09, 2013 9:32 pm   



On 10/9/2013 10:26 PM, Marek wrote:
Quote:
On Wed, 09 Oct 2013 21:46:39 +0200, Sebastian Biały<heby@poczta.onet.pl
wrote:
Kompilator C na PICe jest. Prawdziwy dramat że nie ma C++ [*]. Masz

Matko jedyna, po co c++ na 8bit?
Sebastian twierdzi ze takie rzeczy jak RAII, silne typowanie, statyczny

polimorfizm sa niezbedne przy projektach na max kilka tys lini kodu Smile.

Moim zdaniem uzywanie C++ ma sens kiedy robimy cos duzego, gdzie
faktycznie enkapsulacja danych ulatwia ogranianie projektu.

Dodam ze zysk z uzycia C++ skutecznie niweluja problemy ze srodowiskami.
Przenosnosc kodu dramatycznie spada.... bo wiekszosc z nich
po prostu C++ nie wpiera.


Pozdrawiam

Marek

Sebastian Biały
Guest

Thu Oct 10, 2013 5:23 am   



On 2013-10-09 22:26, Marek wrote:
Quote:
Matko jedyna, po co c++ na 8bit?

Zdarłem już klawiaturę wyjasniając w kilku wątkach w ostatnich kilku
latach :)

Quote:
Twierdzenie, że nie ma c++ dla pic na
pod jest nie do końca prawdą bo microchip od jakiegoś czasu udostępnił
swoje patche do g++ na pic32

Czyli nie na pic tylko na mips.

Marek Borowski
Guest

Thu Oct 10, 2013 8:09 am   



On 10/10/2013 7:23 AM, Sebastian Biały wrote:
Quote:
On 2013-10-09 22:26, Marek wrote:
Matko jedyna, po co c++ na 8bit?

Zdarłem już klawiaturę wyjasniając w kilku wątkach w ostatnich kilku
latach :)

Ale to co napisalem odpowiadajac przedpiscy mozna uznac za summary ?


Pozdrawiam

Marek

Sylwester Łazar
Guest

Thu Oct 10, 2013 9:08 am   



Quote:
Matko jedyna, po co c++ na 8bit?

Zdarłem już klawiaturę wyjasniając w kilku wątkach w ostatnich kilku
latach Smile
A możesz podać jakiś konkretny, krótki (kilkanaście linijek kodu) przykład

na jakikolwiek
mikrokontroler MICROCHIP (może być C32)
który pokazałby różnicę w jakości programu napisanego w C++
i C--.
Pytam, bo zawsze są przeciwnicy i zwolennicy, ale nigdy nie ma przykładu.

--
-- .
pozdrawiam
Sylwester Łazar
http://www.alpro.pl Systemy elektroniczne.
http://www.rimu.pl -oprogramowanie do edycji schematów
i projektowania PCB.

Sebastian Biały
Guest

Thu Oct 10, 2013 3:19 pm   



On 2013-10-10 10:09, Marek Borowski wrote:
Quote:
Zdarłem już klawiaturę wyjasniając w kilku wątkach w ostatnich kilku
latach Smile
Ale to co napisalem odpowiadajac przedpiscy mozna uznac za summary ?

Mniej więcej w wersji lite.

Sebastian Biały
Guest

Thu Oct 10, 2013 3:26 pm   



On 2013-10-10 11:08, Sylwester Łazar wrote:
Quote:
A możesz podać jakiś konkretny, krótki (kilkanaście linijek kodu) przykład
na jakikolwiek
mikrokontroler MICROCHIP (może być C32)

Na Microchipa nie. Na *dowolny* podam do znudzenia ten sam co zawsze:

struct CriticalSection{ CriticalSection() { cli(); } ~CriticalSection()
{ sei(); } };

void foo()
{
CriticalSection cs;
...
return UART_D;
...
return UART_D;
...
}

w C:

void foo()
{
cli();
...
char temp = UART_D;
sei();
return temp;
...
return UART_D; // <-- oops!
...
}

Quote:
Pytam, bo zawsze są przeciwnicy i zwolennicy, ale nigdy nie ma przykładu.

Ten przykład był tu kilka razy. Nie czytasz wątków Smile C++ nie sprawia że
jest szybciej, ale "lepiej" przy czym w jedym zdaniu tego lepiej nie da
się sensownie opisać. I nie, nie chodzi o klasy, żeby była jasność.

Zbych
Guest

Thu Oct 10, 2013 4:13 pm   



W dniu 10.10.2013 17:26, Sebastian Biały pisze:
Quote:
On 2013-10-10 11:08, Sylwester Łazar wrote:
A możesz podać jakiś konkretny, krótki (kilkanaście linijek kodu)
przykład
na jakikolwiek
mikrokontroler MICROCHIP (może być C32)

Na Microchipa nie. Na *dowolny* podam do znudzenia ten sam co zawsze:

struct CriticalSection{ CriticalSection() { cli(); } ~CriticalSection()
{ sei(); } };

void foo()
{
CriticalSection cs;
...
return UART_D;
...
return UART_D;
...
}

w C:

void foo()
{
cli();
...
char temp = UART_D;
sei();
return temp;
...
return UART_D; // <-- oops!
...
}

Słaby przykład, w gcc można zrobić destruktor w C.

Sebastian Biały
Guest

Thu Oct 10, 2013 4:18 pm   



On 2013-10-10 18:13, Zbych wrote:
Quote:
Słaby przykład, w gcc można zrobić destruktor w C.

I wtedy mamy jaki język?

JDX
Guest

Thu Oct 10, 2013 4:23 pm   



On 2013-10-10 17:26, Sebastian Biały wrote:
[...]
Quote:
Na Microchipa nie. Na *dowolny* podam do znudzenia ten sam co zawsze:
Dowolny? To cli() i sei() to są standardowe funkcje C++ (i C)? Very Happy


Quote:
Ten przykład był tu kilka razy. Nie czytasz wątków Smile C++ nie sprawia że
jest szybciej, ale "lepiej" przy czym w jedym zdaniu tego lepiej nie da
się sensownie opisać. I nie, nie chodzi o klasy, żeby była jasność.
C++ jest bardziej eleganckie, ale w tym konkretnym przypadku, tj. tak

zaimplementowanej sekcji krytycznej IMO *nie jest* lepsze. IMO lepsza
jest "ręczna" kontrola nad CS ponieważ tak w ogólności to chcemy jak
najszybciej odblokować przerwania a nie czekać do momentu wyjścia z
funkcji gdy zawołany zostanie destruktor. No i IMO tak zaimplementowana
CS może prowadzić do jeszcze większych i trudniejszych do wykrycia
ooops-ów jeśli ktoś będzie tworzycł CS na początku jakiejś dużej funkcji.

A tak poza tym to niezbyt rozumiem zwracanie jakiejś wartości z funkcji
typu void. No i przydało by sie też jakieś info na temat tego co to jest
UART_D - domyślam się, że jest to jakiś rejestr zmieniany
(asynchronicznie) przez moduł UART-ów.

Sebastian Biały
Guest

Thu Oct 10, 2013 4:43 pm   



On 2013-10-10 18:23, JDX wrote:
Quote:
Na Microchipa nie. Na *dowolny* podam do znudzenia ten sam co zawsze:
Dowolny? To cli() i sei() to są standardowe funkcje C++ (i C)? Very Happy

Odróżniasz idiom RAII od kodu natywnego, prawda?

Quote:
tak
zaimplementowanej sekcji krytycznej IMO *nie jest* lepsze.

Zdefiniuj najlepsze.

Quote:
IMO lepsza
jest "ręczna" kontrola nad CS ponieważ tak w ogólności to chcemy jak
najszybciej odblokować przerwania

To nie jest prawda. Czasem chcemy mieć pewność że UART_D zostanie
odczytany jeszcze w sekcji krytycznej. Efektem czego jest workaround z
temp w C. Nie ma rozwiązań załatwiających wszystkie przypadki. To jest
rozwiązujące pewna sporą grupę czestych sytuacji w przerwaniach.

Quote:
a nie czekać do momentu wyjścia z
funkcji gdy zawołany zostanie destruktor.

Destruktor nie "czeka" tylko wołany jest natychmiast po return.
Dokładnie tak jak chcę.

Quote:
No i IMO tak zaimplementowana
CS może prowadzić do jeszcze większych i trudniejszych do wykrycia
ooops-ów jeśli ktoś będzie tworzycł CS na początku jakiejś dużej funkcji.

Taki idiom daje znacznie wieksze gwarancje w dobrze zrobionym kodzie. W
kodzie napisanym byle jak czyli z wielkimi funkcjami - nic nie daje
gwarancji poza modlitwą. Subiektywnie patrząc: RAII genaruje mniej
błedów niż jego ręczna emulacja i miałem w życiu na to milion przykładów.

Quote:
A tak poza tym to niezbyt rozumiem zwracanie jakiejś wartości z funkcji
typu void.

Pomyłka.

Quote:
No i przydało by sie też jakieś info na temat tego co to jest
UART_D - domyślam się, że jest to jakiś rejestr zmieniany
(asynchronicznie) przez moduł UART-ów.

To jest coś chronione przez sekcję krytyczna. Nie ma znaczenia co to
jest. Probolemem wielu programistów embedded jest wlasnie to że *musza*
wiedzieć co to jest, choć wiedza taka zazwyczaj kończy się pisaniem
nieprzenośnego kodu.

Sylwester Łazar
Guest

Thu Oct 10, 2013 6:00 pm   



Quote:
struct CriticalSection{ CriticalSection() { cli(); } ~CriticalSection()
{ sei(); } };

void foo()
{
CriticalSection cs;
...
return UART_D;
...
return UART_D;
...
}

w C:

void foo()
{
cli();
...
char temp = UART_D;
sei();
return temp;
...
return UART_D; // <-- oops!
...
}

Proszę mnie poprawić jeśli się mylę,
jednak spróbuję zrozumieć.
1) tak jak kolega JDX zauważył, dla foo powinien być typ char, gdyż RETURN
ma zwrócić wartość z RS-a.
2) I teraz w C (drugi przykład) jest problem, gdyż po przepisaniu do
zmiennej temp,
zostały ponownie włączone przerwania przez sei() (SEt Interrupt jak sądzę)
Wtedy temp zwróci wartość odczytaną z UART_D i jest "cool",
ale zwracając UART_D może być "klopsik", bo w międzyczasie mogło przyjść
inne przerwanie od RS'a i zmienić wartość rejestru UART_D (UART Data jak
sądzę)
3) W C++ jest na tyle wygodnie, że wystarczy wpisać (czy jak to się fachowo
nazywa w obiektowym języku programowania) na początu, że
to jest: CriticalSection cs;
I teraz wiadomo, że jak foo się skończy, to przerwania same się odblokują.

Czyli chodzi o to, że nie trzeba pamiętać gdzie włączyć sei(), a gdzie
wyłączyć cli() (CLear Interrupt jak sądzę)
tylko zapisać, że w foo() nie przejmujemy się przerwaniami, tylko robimy
swoje?

Przepraszam, jeśli coś pokiełbasiłem, ale mam wrażenie, że dyskutują sami
fachowcy,
a reszta przygląda się i podziwia Smile
--
-- .
pozdrawiam
Sylwester Łazar
http://www.alpro.pl Systemy elektroniczne.
http://www.rimu.pl -oprogramowanie do edycji schematów
i projektowania PCB.

JDX
Guest

Thu Oct 10, 2013 6:07 pm   



On 2013-10-10 18:43, Sebastian Biały wrote:
Quote:
On 2013-10-10 18:23, JDX wrote:
Na Microchipa nie. Na *dowolny* podam do znudzenia ten sam co zawsze:
Dowolny? To cli() i sei() to są standardowe funkcje C++ (i C)? :-D

Odróżniasz idiom RAII od kodu natywnego, prawda?
Ale o co chodzi? Co ma RAII do kodu natywnego? W każdym razie chodziło

mi jedynie o to, że cli() i sei() to nie są funkcje standardowe C czy
też C++.

Quote:
tak
zaimplementowanej sekcji krytycznej IMO *nie jest* lepsze.

Zdefiniuj najlepsze.

IMO lepsza
jest "ręczna" kontrola nad CS ponieważ tak w ogólności to chcemy jak
najszybciej odblokować przerwania

To nie jest prawda. Czasem chcemy mieć pewność że UART_D zostanie
odczytany jeszcze w sekcji krytycznej. Efektem czego jest workaround z
temp w C. Nie ma rozwiązań załatwiających wszystkie przypadki. To jest
rozwiązujące pewna sporą grupę czestych sytuacji w przerwaniach.
No to przecież sam pokazałeś że w C obudowujemy czytanie w cli()/sei().

A jeśli z jakiegoś powodu w tej samej funkcji potrzebujemy przeczytać
zasób jeszcze raz, no to jeszcze raz obudujemy operację czytania. Zdaję
sobie sprawę, że kod się komplikuje i tym samym jest bardziej podatny na
błędy, ale w sam raz IMO w tak, nomen omen, krytycznych przypadkach jak
CS lepiej jest sterować ręcznie a nie zdawać się na automatykę.

Quote:
a nie czekać do momentu wyjścia z
funkcji gdy zawołany zostanie destruktor.

Destruktor nie "czeka" tylko wołany jest natychmiast po return.
Dokładnie tak jak chcę.
Zakładając, że pomiędzy odczytaniem z chronionego zasoby a returnem nie

ma znaczącego (w sensie czasu wykonania) kodu.

Quote:
No i IMO tak zaimplementowana
CS może prowadzić do jeszcze większych i trudniejszych do wykrycia
ooops-ów jeśli ktoś będzie tworzycł CS na początku jakiejś dużej funkcji.

Taki idiom daje znacznie wieksze gwarancje w dobrze zrobionym kodzie. W
kodzie napisanym byle jak czyli z wielkimi funkcjami - nic nie daje
gwarancji poza modlitwą. Subiektywnie patrząc: RAII genaruje mniej
błedów niż jego ręczna emulacja i miałem w życiu na to milion przykładów.
W każdym razie ja w podanym przykładzie jakoś nie widzę wyższości C++

nad C. Zyskujesz większą odporność na błędy ale płacisz za to mniej
precyzyjną kontrolą nad CS. Nie twierdzę, że C++ jest gorsze od C w
zastosowaniach embedded. Twierdzę jedynie, że przykład jest słaby.

Quote:
No i przydało by sie też jakieś info na temat tego co to jest
UART_D - domyślam się, że jest to jakiś rejestr zmieniany
(asynchronicznie) przez moduł UART-ów.

To jest coś chronione przez sekcję krytyczna. Nie ma znaczenia co to
jest. Probolemem wielu programistów embedded jest wlasnie to że *musza*
wiedzieć co to jest, choć wiedza taka zazwyczaj kończy się pisaniem
nieprzenośnego kodu.
No nie wiem, mi w sam raz wystarczyłaby informacja, że to jest coś co ma

być chronione za pomocą CS. Tak, abym nie musiał snuć domysłów. Smile

Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Zalecane środowiska programistyczne dla PIC16F877A: opinie i darmowe opcje

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map