Testowanie jednostkowe języka asemblera AVR

11

Jak testujesz swój kod asemblera?

Pracuję nad szeregowym kontrolerem serwomechanizmu jako częścią projektu robota hexapod, a kod doszedł do punktu, w którym staje się skomplikowany;) W każdym razie przyzwyczaiłem się do używania testów jednostkowych w mojej codziennej pracy jako programista serwerów C ++ i więc próbowałem zastosować te same rodzaje testów do mojego kodu zestawu AVR. Opracowałem sposób, który działa dla mnie OK (patrz tutaj ), ale jestem zainteresowany, czy brakuje mi standardowych narzędzi lub technik.

Zaktualizowano: Dla tych z was, którzy są zainteresowani, pełne źródło do serwosterowania i testy jednostkowe są teraz dostępne tutaj .

Len Holgate
źródło

Odpowiedzi:

3

Opisałbym to również jako eleganckie, ale chciałbym dodać problem, jeśli wybaczysz moje włamanie.

Wiem, że istnieją bardzo drogie pakiety oprogramowania do pracy w takich sytuacjach, ale w firmie, w której pracuję, nie możemy sobie pozwolić na koszty, chyba że jesteśmy pewni, że zrobi to, czego potrzebujemy.

Test Driven Development (TDD) to jeden z lepszych systemów, o których słyszałem w trakcie tworzenia, i podobają mi się, ale problemy, które zabierają mi czas, są zwykle spowodowane złożonymi przerwaniami i zdarzeniami sprzętowymi, które wielu nazwałoby usterkami. Wydaje się, że drobnostką jest problem co 2 godziny, gdy gwiazdy się wyrównają, ale jeśli twój telefon zamarznie raz w tygodniu, przekląłbyś nazwisko inżyniera. W naszym przypadku musimy wędrować w stronę paszy, gdy rzeczy naprawdę się psują, czego, jak możecie sobie wyobrazić, lubię unikać.

Widziałem bardzo inteligentne rozwiązania do sprawdzania funkcjonalności podsystemów, które przy prawidłowym wdrożeniu prawdopodobnie zaoszczędziłyby mi 3 godziny z 50 godzin pracy w tygodniu, ale gdyby istniał inteligentny sposób na znalezienie usterki, zaoszczędziłbym tygodni pracy szukając „błędu”, który zdarza się czasami w terenie pod dużym obciążeniem.

Ten post prawdopodobnie nie pomaga w dużej mierze, ale uważam, że wprowadzenie wszystkiego na światło ułatwia wszystko. Gdyby istniała metoda TDD służąca do znajdowania usterki, mogłabym otrzymać 10 tysięcy przydzielonych na to. -Maks

Kortuk
źródło
1
Tak naprawdę nie myślałem o testowaniu interakcji między kodem przerwań a kodem bez przerwania. To dobra uwaga. Planowałem przetestować kod przerwania timera generowania PWM poza sytuacją przerywania w podobny sposób, jak testuję mój kod seryjny linii głównej. Wydaje mi się, że nawet gdy mam już wszystko, wciąż brakuje mi interakcji. Przypuszczam, że mógłbym wywoływać przerwania w ramach testów (jest to łatwe z przerwaniem timera, ale cały kod przerwania można ustawić tak, aby działał na przerwaniu timera w wiązce testowej). Nie jest to jednak trywialne.
Len Holgate,
1
Mogę cię źle zrozumieć, ale staram się uważać na interakcje z kodem bez przerywania i przerywania. Prawdopodobnie powinienem być bardziej rozluźniony w używaniu operacji atomowych, ale nigdy nie wykazano, aby powodował szkody na poziomie, w którym mam nasz optymalizator. Problemy pojawiają się, gdy jedno przerwanie opóźnia drugie, powszechnym, z którym pomagam uczniom, byłoby generowanie PWM oparte na przerwie. Jeśli potrzebujesz wyjątkowo precyzyjnej prędkości, na przykład używając modułu Porównaj w swoim chipie, a kolejne przerwanie jest zajęte spędzaniem czasu na czymś innym i opóźnia cię o 50uS, co może zakończyć się światem.
Kortuk
1
W niektórych przypadkach możesz mieć priorytet, lub możesz nawet sam wyłączyć przerwanie i ponownie włączyć globalne przerwania wewnętrznie, zależnie od platformy, ale najłatwiejszą ścieżką dla mojego własnego rozwoju jest ograniczenie czasu w przerwie do rzeczy absolutnie niezbędnych i wykonanie normalnego kodu reszta pracy.
Kortuk
1
Mój obecny projekt jest wyjaśniony na moim blogu, podobnie jak proponowany nowy projekt. Obecnie mam 64 kanały PWM wygenerowane przez przerwanie timera i żadnych innych przerwań; serial odbywa się przez odpytywanie. Oznacza to, że PWM jest solidny, ale serial może mieć problemy. Mój nowy projekt używałby przerwań dla UART, a także licznika czasu dla generowania PWM oraz ostrożnego ponownego włączania i blokowania przerwań, aby zapewnić bezproblemowe PWM i bezproblemowe przetwarzanie UART ...
Len Holgate,
2
Użyłem PWM jako przykładu, system, na którym miałem ten problem, ma 3 interfejsy SPI z 1 połączeniem SPI posiadającym 3 układy, których używamy. Istnieją 4 różne przerwania portów informujące o zmianie stanu zewnętrznych układów i kilka innych rzeczy. Problem pogarsza się wraz ze wzrostem liczby interfejsów.
Kortuk
2

Ciekawy. Po świętach planowałem zrobić Asembler z Pics, kiedy będę miał trochę więcej czasu, przyjrzę się Twojemu systemowi.

Jednym ze sposobów, w jaki mogłem zobaczyć, byłoby napisanie jakiegoś szkieletu w innym języku, aby stworzyć i zburzyć fałszywe obiekty itp., Ale problem z interfejsem byłby problemem.

Jeśli stanie się to zbyt uciążliwe, przeważy to korzyści z testów jednostkowych i sprawi, że będziesz mniej chętny do korzystania z niego.

Amos
źródło
Uruchomienie go w symulatorze było moją początkową przeszkodą, dopóki nie wymyśliłem, jak rozdzielić kod na osobne pliki i po prostu „wykpić” niektóre etykiety, do których przeskoczyłbym w prawdziwym kodzie. Opublikuję całą rzecz, kiedy skończę. Dopasowanie testów jednostkowych do kodu zajmuje trochę czasu, ale było warto.
Len Holgate,
Teraz, kiedy miałem okazję dokładnie przejrzeć twoją metodologię, uważam, że jest dość elegancka. Może po Bożym Narodzeniu spojrzę na avrs, ponieważ wydaje się, że jest o wiele więcej rzeczy opartych na społeczności dla nich niż na zdjęciach. Wszelkie pomysły, jak przyzwoite Linux IDE dla programowania AVR Assembler.
Amos,
1
Istnieje łańcuch narzędzi GNU, którego można używać zamiast AVR Studio (który jest bezpłatnym zestawem narzędzi Atmela). Prawdopodobnie można to uruchomić w systemie Linux, ale nie musiałem.
Len Holgate,
Właśnie znalazłem ten link do artykułu w Linux Journal na temat programowania
Len Holgate
Moim głównym problemem związanym z tym artykułem jest to, że pochodzi on z 2005 r., Więc może być nieaktualny.
Amos,