AVR g++ - Wysokopoziomowe odwołanie do pinów

AVR g++ - Wysokopoziomowe odwołanie do pinów
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
2

No ok, ale równie dobrze pakujesz w C funkcje static inline i efekt jest ten sam.

EDIT: btw, w nagłówkach masz przeca makra _BV, PD0, PD1 itd. Ja wiem, że macros are evil. Ale jednak do pisania 0b00001 zmuszony nie byłeś ;)

edytowany 1x, ostatnio: alagner
Pixello
Ale w C nie zapiszę bajerancko PinA4::Set() :) A tak na serio - zamierzam zastosować wzorzec strategia do silnika i podmieniać je w locie - ładniej to się robi w c++ niż w c. Racja z tymi makrami. Ale w ASMie też się da zapisać, tylko czy przyjemniej :P
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
1

Men, ale jak chcesz to przekazywać w formie wskaźników f-kcję (bo tak to zamierzasz podmieniać, nie?) to chyba cała Twoja zabawa w optymalizację to trochę krew w piach może być... Nie daję głowy, i mówię to na czuja (jutro to chętnie zmierzę ;)) ale imho trochę od tyłu się zabierasz za to...

Pixello
Nie zrozumiałeś mnie - to nie jest optymalizacja, tylko uczynienie kodu czytelniejszym - a że chcę to zrobić najmniejszym kosztem to inna sprawa. Ja jestem z obozu "staram się pisać czytelny i logiczny kod, kompilator niech się martwi" ;)
Pixello
Na dodatek i tak te funkcje byłby w pamięci, a ja będę zmieniał tylko jedną część funkcji. Chyba :D I raczej nie jutro, tylko za tydzień - będę skrupulatnie opisywał co robię, ale najpierw generator skończę.
MO
  • Rejestracja:około 10 lat
  • Ostatnio:dzień
  • Lokalizacja:Tam gdzie jest (centy)metro...
1

Może zerknij tutaj to Ci wiele wyjaśni:
https://www.dropbox.com/s/52en505x65dj9fv/TemplateAVR.zip?dl=0


Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
Pixello
Dzięki, ale templaty już mnie nie zadowolą - robię generator, który będzie generował .cpp z opisu sprzętu w XML, mam już kilka osób w teamie - jak ktoś chce dołączyć drzwi otwarte :D
0

Zastanawiam się, jak proste i niewymagające szybkiej reakcji programy piszecie w ten sposób na AVR. Operacje na portach powinny być atomowe, a przynajmniej po pierwszym spojrzeniu na wywołanie operacji powinno być wiadomo co konkretnie się wykona. Rdzeń AVR ma rozkazy bezpośredniego zapisu bitów do I/O i pewnie te gotowe już makra kompilują się właśnie w ten sposób. Już nie raz przejechałem się na tym, że przyszło przerwanie zmieniające stan portu w chwili pomiędzy pobraniem stanu portu a zmianą bitu i zapisem w sekcji wywłaszczonej. Czy sprawdzaliście ile trwa takie wywołanie funkcji static z klasy? Czy to jest jakoś optymalizowane, czy pobierany jest wskaźnik na tablicę wskaźników na metody klasy a z niej dopiero właściwa metoda?

No chyba, że to nie są ATmegi, tylko jakieś inne, sporo szybsze układy z rdzeniem AVR i służą one jedynie do mrugania diodą?

AL
Generalnie nowe gcc radzi sobie z tym dobrze i większość naszych kodów kompiluje się do cbi/sbi; kwestia narzutu jest bardziej po stronie konstrukcji destrukcji obiektów.
Pixello
Nie rozumiem jednego - opisane jest to dokładnie stronę temu - kod zdissasemblerowany, a ludzie dalej herezje sieją.
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:prawie 2 lata
2

W przypadku mojego kodu, który przytoczyłem w poprzednim poście, nie ma żadnych wywołań niczego. Jest tylko jedna instrukcja sbi/cbi, dokładnie tak jakby napisać to ręcznie/użyć makr.

Oczywiście wymaga to użycia kompilatora i technik programowania z ostatniego dziesięciolecia. W embedded wciąż nie jest to dla wszystkich oczywiste z jakiegoś powodu. Również w pracy się z tym spotykam, więc to chyba po prostu normalne.


"(...) otherwise, the behavior is undefined".
edytowany 3x, ostatnio: Endrju
AL
MISRA, bezpieczeństwo itd. 10letnie gcc i te sprawy ;)
Endrju
MISRA to straszna kupa, ale nie przeszkadza w pisaniu szablonów.
AL
o ile pozwala używać C++, od tego trzeba zacząć.
Endrju
Przecież jest MISRA C++.
AL
ale została wprowadzona później. Utrzymanie starego kodu, raz. Niechęć do używania C++, dwa. I jesteś w ciemnej murzyńskiej :P
0

<quote="1218978">O, ja właśnie coś takie napisałem/piszę. Ostatecznie kod wygląda np. tak:

Kopiuj
Avr::Io::Gpio<0>::setDirection(Avr::Io::Direction::OUTPUT);
Avr::Io::Gpio<0>::setValue(true);
Avr::Timer::BusyDelayMs(1.0);
Avr::Io::Gpio<0>::setValue(false);

OK, nawet jeśli ten kod generuje pojedyncze instrukcje, to i tak chyba użyje się tego raz na samym dole, żeby przygotować jakiś HAL? Nie wyobrażam sobie, żeby w kodzie zostawały takie zależne od architektury konstrukcje. I w takim razie, czy warto tak kombinować a później używać i tak jakiegoś wrappera na to?

PS. Do tej pory znalazłem tylko kilka zastosowań C++ w embedded i dotyczyły głównie polimorfizmu gdy musiałem wykonywać podobne operacje na wielu rodzajach podłączonych czujników z różnymi interfejsami.

Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:prawie 2 lata
3

Przecież to jest konkretnie obsługa sprzętu dostępnego w mikrokontrolerze z rodziny megaAVR, to chyba oczywiste, że jest zależna od sprzętu. Nie pisałem jakiegoś uniwersalnego embedded-czegoś bo do niczego mi to nie było potrzebne. Gdyby było, to tak, to była by najniższa warstwa.

Oczywiście, że warto tak pisać. Kod z makrami i funkcjami rodem z C wygląda okropnie - jest krytycznie nieczytelny.

W pracy tak samo używamy C++ w dużych i małych projektach (i ma to kilka warstw, tak jak mówisz). Już od dawna tak pisze się embedded.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju
Pixello
  • Rejestracja:około 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Podkarpacie
  • Postów:448
0

Do Łukasza: PortA::SetBits(PA3||PA5); też jest atomowe - w embeed jest popularna "Magic syntax" czy co? Jak ktoś nie używa PORTA |= 0xfa; to nie jest PRO? Ja jestem hobbystą, więc dlatego nie rozumiem takiego punktu widzenia, szczególnie po przeczytaniu "Clear Code".

W przypadku braku mocy na coś większego polecam DMA w xmedzie - łyka wszystko.

edytowany 1x, ostatnio: Pixello
Endrju
Ja też tego nie rozumiem a pracuje w embedded. Już się tak nie pisze raczej, przynajmniej u mnie. Czysty i czytelny kod jest bardziej ceniony.
Pixello
@Endrju może to takie przyzwyczajenie - mój nauczyciel od 30 lat tłumaczy asma 8051 w notatniku. Nawet nie notepad++, tylko notatnik... A my pracujemy na jakimś IDE w dosie :D 2016 rok ;P
AL
Ludzie po prostu wiele rzeczy robią bo im się wydaje, albo dlatego, że kompilator 15 lat temu czegoś nie był w stanie zoptymalizować. Dołóż do tego sporą grupę MISRA'owców, gdzie optymalizacja o ile pamiętam z definicji jest O0 (czyli optymalizujesz sam) a standardy pisania antyczne. Wbrew pozorom literatury do embedded nie ma tak dużo, a jak już jest często opiera się np. na beznadziejnej bibliotece SPL od ST (to akurat ARM). Dołóż do tego często fakt, że często programista to jednocześnie (i bywa, że głównie) elektronik-konstruktor.
Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
1
Endrju napisał(a)

Oczywiście, że warto tak pisać. Kod z makrami i funkcjami rodem z C wygląda okropnie - jest krytycznie nieczytelny.

Myślę, że kod może wyglądać źle nie zależnie od używanego języka i C++ nie gwarantuje, że kod będzie wyglądał dobrze. W drugą stronę programy napisane w języku C mogą być bardzo dobrze i czytelnie napisane. Najgorzej jest, kiedy ktoś, kto zna C++ zaczyna pisać program w C, w stylu C++, i odwrotnie.

Czy naprawdę uważacie, że to:

Kopiuj
 AVR::IO::Port_A0.clear();

jest lepsze, od tego:

Kopiuj
 gpio_clr_bit(PORTA, 0);

Kto będzie teraz bardziej pro?

Należy się zastanowić też ile czasu potrzebujecie na przygotowanie obsługi peryferiów w stylu C++, jeśli ktoś wcześniej takiej obsługi nie implementował? A co w przypadku przerwań? Ciekaw jestem propozycji obsługi USART w AVR z wykorzystaniem przerwań, napisanej w języku C++.

Nie twierdzę, że C++ w embedded nie można używać, ale proponuję obiektywne spojrzeć na wady i zalety. W C++ można opakować każdy peryferial, stworzyć kilka warstw aplikacji, itd, aż pojawia się pytanie, na ile zbliża nas do różnego rodzaju rtos'ów.

MO
Co do USART'a w C++ i na przerwaniach, zapraszam na http://microgeek.eu. Zapytaj użytkownika Antystatyczny oraz Federerer. Bo ja już nie będę tracił czasu na niepotrzebną polemikę co jest "profi a co nie" i czy się da..
Pixello
  • Rejestracja:około 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Podkarpacie
  • Postów:448
0

Namespace nie słyszał? W c# microsoft nie potrzebnie układał wszystko w System.Text; System.Threading; Bo wszystko można zapisywać _system.task_get(HFDSDF &a, int *P, char f);
Dla kogoś KTO NIE MIAŁ STYCZNOŚCI Z TYM KODEM 1. będzie bardziej przyjazne. A Rtos na 16 mhz da się, ale trochę słabo. Nawet jakiegoś std nie ma na AVR, właśnie takie coś chciałem zrobić - zbiór fajnych metod ukrywających zawiłości mikroprocka. A czy gpio_set_bit(PORTA,0) jest lepsze od SBI 0x15,0? Zamiast STD::Cin piszesz scanf()? W asmie najlepiej pisz.

Teraz taki teścik: Co robi ten kod

public X c_of_fact(int a)
{
for(int k;k=<a,k++)
Console.WriteLine(X_Fact.G(a-1));
}

edytowany 5x, ostatnio: Pixello

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.