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

.
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
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
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

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)?

Quote:
Ten przykład był tu kilka razy. Nie czytasz wątków

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)?
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
--
-- .
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.
Goto page Previous 1, 2, 3, 4, 5, 6, 7 Next