Wpis zawiera kroki postępowania przy stworzeniu projektu ze scenariuszami testów jednostkowych dla firmware’u zapisanego w C++11.
Toolchain: uVision MDK-ARM Essential Version: V5.29.0.0, Compiler/Linker Version: V6.13.1
Target: STM32F429ZITx
Projekt do pobrania z: https://github.com/PiotrPoterala/PP_Library/tree/main/pp_unit_tests
CppUtest
CppUtest to framework oparty na modelu xUnit przeznaczony do przeprowadzania testów jednostkowych w projektach embedded. Napisany w C++ z powodzeniem może być również wykorzystany przy testowaniu kodu w C.
Główne założenia framework’a:
- Prosty w użyciu,
- Portowalny na wiele platform,
- Stworzony do TDD.
Opis: http://cpputest.github.io
Kompilacja biblioteki CppUtest
- Pobierz projekt: https://github.com/cpputest/cpputest,
- Stwórz nowy, pusty projekt w Keil’u,
- W oknie Options for target:
- W zakładce Device wybierz mikrokontroler, pod który będzie pisane oprogramowanie (w moim przypadku będzie to STM32F429ZITx),
- W zakładce Target->ARM Compiler wybierz: Use default compiler version 6,
- W zakładce Output zaznacz Create Library,
- W zakładce C/C++(AC6):
- W okienku Define dodaj „STM32F429xx, CPPUTEST_STD_CPP_LIB_DISABLED”,
- W okienku Language C++ wybierz c++11,
- W Include Path dodaj ścieżkę do katalogu include znajdującym się w drzewie projektu CppUtest,
- Do drzewa projektu dodaj:
- wszystkie pliki *.cpp znajdujące się w katalogu src/CppUTest
- plik src/Platforms/Iar/UtestPlatform.cpp,
- Zbuduj całość, a tym samym wygeneruj plik CppUTest.lib
Projekt ze scenariuszami testów
- Stwórz nowy, pusty projekt w Keil’u,
- W oknie Options for target:
- W zakładce Device wybierz mikrokontroler, pod który będzie pisane oprogramowanie (a więc ten sam co poprzednio: STM32F429ZITx),
- W zakładce Target->ARM Compiler wybierz: Use default compiler version 6,
- W zakładce Output zaznacz Create Executable,
- W zakładce C/C++(AC6):
- W okienku Define dodaj „STM32F429xx”,
- W okienku Language C++ wybierz c++11,
- W Include Path dodaj ścieżkę do katalogu include znajdującym się w drzewie projektu CppUtest,
- W zakładce Debug:
- Zaznacz Use Simulator
- W okienku Initialization File wybierz wcześniej stworzony plik map.ini zawierający informację o uprawnieniach dla poszczególnych obszarów pamięci (w tym przypadku przypisałem opcje READ/WRITE dla wszystkich adresów powyżej adresu 0x40000000 – od tego adresu zaczynają się rejestry peryferiów),
map.ini
MAP 0x40000000, 0xFFFFFFFF READ WRITE
- W oknie Menage Run-Time Enviroment zaznacz Device::Startup, CMSIS::CORE oraz Compiler::I/O::STDOUT->ITM (redefiniuje funkcję fputc() ze standardowej biblioteki stdio.h tak aby podczas debugowania printf() przekazywał ciągi znaków do View->serial Windows-> debug (printf) viewer),
- Skonfiguruj startup_stm32f429xx.s. Plik służy do ustawienia:
- rozmiaru stosu używanego przez wyjątki i procedury obsługi przerwań (ISR),
- rozmiaru sterty używanej przez funkcje alokacji pamięci (ponieważ w projekcie wykorzystywany jest dynamiczny przydział pamięci do tworzenie egzemplarzy obiektów, należy zwiększyć rozmiar sterty do co najmniej 4kB) .
startup_stm32f429xx.s
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00004096
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
- Do drzewa projektu dodaj
- wszystkie pliki *.cpp, które mają zostać przetestowane,
- stworzony w poprzednim punkcie plik CppUTest.lib,
- Stwórz plik AllTests.cpp zawierający funkcję main(),
AllTests.cpp
#include "CppUTest/CommandLineTestRunner.h"
int main(int ac, char** av)
{
const char * av_override[] = { "exe", "-v" }; //turn on verbose mode
return CommandLineTestRunner::RunAllTests(2, av_override);
}
- Stwórz scenariusz testowy,
pstring_test.cpp
#include "CppUTest/TestHarness.h"
#include "pstring.h"
TEST_GROUP(PStringTestGroup)
{
void setup() {}
void teardown() {}
};
TEST(PStringTestGroup, findDataAfterAcronimTest)
{
PString str("X10.123 Y20.458");
STRCMP_EQUAL("10.123", str.findDataAfterAcronim('X').c_str());
STRCMP_EQUAL("20.458", str.findDataAfterAcronim('Y').c_str());
}
- Zbuduj całość, wejdź w tryb debugowania i… Run