CategoryProgramowanie

Exceptiony w mikrokontrolerach

Kiedy w programie na PC nastąpi exception, aplikacja zakończy się z błędem. W skrajnym przypadku dostaniemy blue screena i komputer się zresetuje. Wyjątki są obsługiwane przez system operacyjny. W mikrokontrolerach nie mamy dostępu do takich zaawansowanych funkcjonalności. Jednak w dalszym ciągu możemy wykonać dzielenie przez 0 lub odwołać się do null pointera. W tym artykule omówię w jaki sposób obsługiwać exceptiony w mikrokontrolerach. Zacznę od ogólnej procedury, następnie skupię się na detalach specyficznych dla procesorów PIC32 i Cortex-M.

Czytaj dalej

O wskaźnikach i rzutowaniu w C

Zmienne programu są w pamięci reprezentowane jako pewien ciąg bitów. Dla komputera nie ma znaczenia, czy ten ciąg to liczba, string, struktura, czy cokolwiek innego. Pisząc programy definiujemy typy zmiennych i to na te typy rzutowane są wartości bitowe.

Języki wyższego poziomu jak np. C#, czy Python oddzielają tą implementację za pewną warstwą abstrakcji. Twórcy tych języków doszli do wniosku, że program nie powinien polegać na konkretnej reprezentacji bitowej. Możemy oczywiście za pomocą odpowiednich funkcji uzyskać dostęp do takiej bitowej reprezentacji, ale czynność ta celowo została utrudniona.

C jest jednak starszym językiem wyznającym zasadę, że programista wie co robi. Dlatego w C mamy łatwy dostęp do reprezentacji bitowej. Możemy używać wskaźników, czy rzutować typy na inne. Efektem jest większa wydajność wynikowych programów za cenę wolniejszego developmentu. Sprawdzanie błędów w C jest bardzo ubogie i nawet doświadczony programista może łatwo strzelić sobie w stopę.

W tym wpisie pokażę kilka potencjalnie niebezpiecznych fragmentów kodu oraz omówię jak radzi sobie z nimi standard MISRA C oraz jak to rozwiązano w C++.

Czytaj dalej

Konwersja typów przy operacjach arytmetycznych w C

Aby wykonać operację arytmetyczną w  C, kompilator musi dysponować dwoma operandami tego samego typu. Jeżeli programista o to wcześniej nie zadbał, konwersja jest wykonywana niejawnie. Na przykład:

  • Zmienna o mniejszym rozmiarze jest konwertowana do większego np. uint8 na uint32, czy float na double.
  • Zmienna bez znaku jest konwertowana na zmienną ze znakiem.
  • Zmienna int jest konwertowana na float.

Konwersje typów są również wykonywane przy operacjach przypisania. Możemy na przykład do zmiennej uint przypisać liczbę ujemną. Możemy również do niej przypisać wynik operacji arytmetycznej, gdzie czasem wartość jest dodatnia, a czasem ujemna. Takie konwersje są dobrym miejscem do powstawania różnego rodzaju błędów i nieoczywistych, czy wręcz niezdefiniowanych zachowań.

Czytaj dalej

Systemy bezpieczeństwa – sposoby przeciwdziałania błędom

W poprzednim artykule opisałem trochę podstawowych informacji dotyczących systemów bezpieczeństwa. Skupiłem się tam na podstawowych pojęciach i procesach. Dzisiaj mam zamiar omówić kilka aspektów technicznych. Będzie więc o tym jak takie systemy zachowują się w przypadku wykrycia błędu i jak minimalizują efekty ich wystąpienia.

Czytaj dalej

Kiedy od softu zależy ludzkie życie – o systemach bezpieczeństwa

W internecie można spotkać głosy, że programiści nie wykonują odpowiedzialnych zadań i nie ma żadnych regulacji, których muszą przestrzegać. Bo co złego może się stać, jeśli strona nie będzie działać, albo komputer wywali bluescreena. W końcu świat się od tego nie zawali. Być może jest to prawdą w 99% projektów programistycznych. Jednak tam, gdzie na szali jest ludzkie życie, bardzo restrykcyjne regulacje obowiązują już od dawna. Wiem o czym mówię, ponieważ przez ostatnie dwa lata pracowałem przy systemie sterującym ruchem pociągów.

Czytaj dalej

Jak optymalizować działanie programu?

Ostatnio w pracy miałem za zadanie dokonać optymalizacji pewnego fragmentu kodu. Postanowiłem, że to dobra okazja, aby zebrać trochę porad dotyczących optymalizacji i się nimi podzielić. Część porad odnosi się konkretnie do C, ale większość można uogólnić na każdy język. Entuzjaści wyciskania procesorów do granic możliwości mogą jednak poczuć się zawiedzeni, ponieważ nie będę się skupiał na trickach urywających pojedyncze takty. Bliżej mi do podejścia przedstawionego w dwóch zasadach optymalizacji:

  1. Nie rób tego.
  2. (Tylko dla ekspertów) Jeszcze tego nie rób.

Czytaj dalej

Testy RAM – algorytmy

Ten artykuł jest kontynuacją tematu testów pamięci RAM rozpoczętego w poprzednim wpisie – link. Poprzednio przybliżyłem trochę ogólnych informacji dotyczących RAMu i jego testowania. Dzisiaj zajmę się omówieniem konkretnych algorytmów. Nie udostępniam swojej implementacji opisanych tutaj testów, podaję za to linki do bibliotek producentów mikrokontrolerów, którzy takie testy zaimplementowali i opisali w notach katalogowych.

Czytaj dalej

Testy RAM – wprowadzenie

Pamięć RAM, jak każdy inny element systemu mikroprocesorowego może się zepsuć. Skutki złego działania RAM mogą być bardzo niebezpieczne. Szczególnie kiedy system wykonuje jakieś odpowiedzialne zadanie. Dlatego testy RAM są wymagane do zapewnienia odpowiedniego SIL (Safety Integrity Level – Poziom Nienaruszalności Bezpieczeństwa) przez różne normy:

  • IEC 60730 – Safety standard for household appliances.
  • IEC 61508 – Functional Safety of Electrical/Electronic/Programmable Electronic Safety-related Systems
  • IEC 61513 – Instrumentation & Control for Systems Important to Safety in Nuclear Power Plants
  • EN 50129 – Railway applications. Communication, signalling and processing systems. Safety related electronic systems for signalling
  • IEC 60601 – Medical electrical equipment – Part 1-2: General requirements for basic safety and essential performance

W ostatnim czasie w pracy spędziłem sporo czasu na pisaniu testów poprawności działania mikrokontrolera, w tym testów pamięci RAM. Postanowiłem więc podzielić się zgromadzoną wiedzą.

Czytaj dalej

Integracja funkcji printf z UARTem

Aby ruszyć dalej z pracami nad micromousem, potrzebuję funkcji logujących dane z działania programu na konsolę w czasie rzeczywistym. Są mi one potrzebne do kalibracji czujników ścian i doboru nastaw dla regulatorów silników. Idealnym rozwiązaniem było by wykorzystanie standardowej funkcji printf. Na mikrokontrolerze jednak nie jest to takie proste, ponieważ trzeba dopisać warstwę obsługi drivera USARTa. Poza tym należy rozwiązać pewne problemy implementacyjne. To wszystko opiszę w tym artykule. Poza tym kod data loggera oraz drivera USART jest dostępny na moim GitHubie.

Czytaj dalej

Modyfikator const w C

Po omówieniu modyfikatora volatile w poprzednim wpisie, dzisiaj zajmę się drugim podobnym modyfikatorem – const. Modyfikator const jest często przedstawiany jako sposób deklarowania stałych liczbowych. W artykule wytłumaczę, dlaczego do definiowania pojedynczych stałych liczbowych lepiej nadają się inne mechanizmy oraz jak używać const w deklaracjach funkcji, aby uzyskać lepszą kontrolę typów.

Czytaj dalej

© 2018 ucgosu.pl

Theme by Anders NorénUp ↑