Witam.
Parę pytań, przemyśleń, proszę o wypowiedzenie się. Temat dotyczy programowania embedded C głownie mikrokontrolerów raczej większych 32 bitowych.
1. Stosowanie wielu zmiennych globalnych jest bee
Czy w świecie embedded bez dynamicznej alokacji pamięci da się inaczej? Zakładając, że mamy jakieś stałe duże struktury globalne (zawierające mnóstwo zmiennych globalnych) w pamięci i pobieramy wskaźnik do nich.
A co z takim:
2. Duża struktura danych zagnieżdżonych wielokrotnie – pobieranie adresu do struktury w celu pobrania lub zapisania wartości.
3. Stosowanie zmiennych volatile
Najprościej można powiedzieć: kiedy jakaś zmienna jest wykorzystywana w przerwaniu oraz programie głównym użyj volatile (oczywiście są też inne zastosowania).
Czy powyższy kod według Was jest wystarczająco bezpieczny? Co w przypadku zapisywania odebranego bufora typu volatile do kolejki. Stosując memcpy otrzymujemy ostrzeżenie o zmianie typu volatile uint8_t * na uint8_t * - wielu programistów uważa łączenie volatile z non volatile za nieprzewidywalne, co wtedy - lepiej samemu zrobić funkcję ładującą do kolejki bez konwersji volatile z na non volatile?
4. Synchronizacja przerwania z programem głównym
Wielu programistów uważa takie podejście za dobrą praktykę
- w przerwaniu ustawia się jakieś dane
- w programie głównym blokuje się to przerwanie na czas przekopiowania tej wartości do zmiennej pomocniczej, która następnie będzie wykorzystywana.
Co daje takie podejście? Czy mądrym jej blokować przerwania co prawda na krótki czas? Czy po odblokowaniu przerwanie które hipotetycznie pojawiło by się w czasie wyłączenia byłoby obsłużone?
5. Zastosowanie dodatkowej blagi busy do synchronizacji
Przykład: program główny operuje na zmiennej, zaczął część operacji i nastąpiło przerwanie które zmieniło wartość, dalej program będzie operował już na innej zmiennej nie wiedząc o tym. Robiąc flagę busy przerwanie nie mogłoby nadpisać, ale co nową informacją? Wiem że są kolejki, ale tutaj chodzi o proste zmienne typu flagi, małe bufory, pojedyncze wartości.
6. Ładowanie odebranego bufora w przerwaniu
Podprogram przerwania powinien być mały i szybki, czy takie podejście można przyjąć? Co w takim przypadku: program główny zaczął wyciągać z kolejki dane przyszło przerwanie i wpisało kolejny element do kolejki i zmieniło indeksy kolejkowe - zależnie od implementacji kolejki head i tail itd.
Oczywiście zakładamy bardzo częste przychodzenie danych i rygory czasowe.
Czy kolejka do której ładujemy w przerwaniu powinna być volatile?
7. Blokowanie pamięci
Po co stosować taki twór? Co to daje w przypadku mikrokontrolerów ARM Cortex M0,1,4...
8. Kopiowanie buforów po 32 bitach w celu przyśpieszenia na uC 32 bitowym
Czy dobrą praktyką jest dodawanie w strukturze danych aby osiągnąć wypełnienie do 32 bitów aby przyśpieszyć kopiowanie, jak to zaimplemetować, czy memcpy tak działa? Czy kopiuje po bajtach?
Jestem świadomy że popełniłem wiele uproszczeń przykładów i wiele uproszczeń. Proszę Was o wypowiedzenie się w tym temacie i z góry dziękuję.
Parę pytań, przemyśleń, proszę o wypowiedzenie się. Temat dotyczy programowania embedded C głownie mikrokontrolerów raczej większych 32 bitowych.
1. Stosowanie wielu zmiennych globalnych jest bee
Czy w świecie embedded bez dynamicznej alokacji pamięci da się inaczej? Zakładając, że mamy jakieś stałe duże struktury globalne (zawierające mnóstwo zmiennych globalnych) w pamięci i pobieramy wskaźnik do nich.
A co z takim:
Code: c
2. Duża struktura danych zagnieżdżonych wielokrotnie – pobieranie adresu do struktury w celu pobrania lub zapisania wartości.
Code: c
3. Stosowanie zmiennych volatile
Najprościej można powiedzieć: kiedy jakaś zmienna jest wykorzystywana w przerwaniu oraz programie głównym użyj volatile (oczywiście są też inne zastosowania).
Code: c
Czy powyższy kod według Was jest wystarczająco bezpieczny? Co w przypadku zapisywania odebranego bufora typu volatile do kolejki. Stosując memcpy otrzymujemy ostrzeżenie o zmianie typu volatile uint8_t * na uint8_t * - wielu programistów uważa łączenie volatile z non volatile za nieprzewidywalne, co wtedy - lepiej samemu zrobić funkcję ładującą do kolejki bez konwersji volatile z na non volatile?
4. Synchronizacja przerwania z programem głównym
Wielu programistów uważa takie podejście za dobrą praktykę
- w przerwaniu ustawia się jakieś dane
- w programie głównym blokuje się to przerwanie na czas przekopiowania tej wartości do zmiennej pomocniczej, która następnie będzie wykorzystywana.
Co daje takie podejście? Czy mądrym jej blokować przerwania co prawda na krótki czas? Czy po odblokowaniu przerwanie które hipotetycznie pojawiło by się w czasie wyłączenia byłoby obsłużone?
5. Zastosowanie dodatkowej blagi busy do synchronizacji
Przykład: program główny operuje na zmiennej, zaczął część operacji i nastąpiło przerwanie które zmieniło wartość, dalej program będzie operował już na innej zmiennej nie wiedząc o tym. Robiąc flagę busy przerwanie nie mogłoby nadpisać, ale co nową informacją? Wiem że są kolejki, ale tutaj chodzi o proste zmienne typu flagi, małe bufory, pojedyncze wartości.
6. Ładowanie odebranego bufora w przerwaniu
Podprogram przerwania powinien być mały i szybki, czy takie podejście można przyjąć? Co w takim przypadku: program główny zaczął wyciągać z kolejki dane przyszło przerwanie i wpisało kolejny element do kolejki i zmieniło indeksy kolejkowe - zależnie od implementacji kolejki head i tail itd.
Oczywiście zakładamy bardzo częste przychodzenie danych i rygory czasowe.
Czy kolejka do której ładujemy w przerwaniu powinna być volatile?
7. Blokowanie pamięci
Code: c
Po co stosować taki twór? Co to daje w przypadku mikrokontrolerów ARM Cortex M0,1,4...
8. Kopiowanie buforów po 32 bitach w celu przyśpieszenia na uC 32 bitowym
Czy dobrą praktyką jest dodawanie w strukturze danych aby osiągnąć wypełnienie do 32 bitów aby przyśpieszyć kopiowanie, jak to zaimplemetować, czy memcpy tak działa? Czy kopiuje po bajtach?
Jestem świadomy że popełniłem wiele uproszczeń przykładów i wiele uproszczeń. Proszę Was o wypowiedzenie się w tym temacie i z góry dziękuję.