piątek, 22 stycznia 2021

Compiler Explorer - Testowanie kodu STM32

W tym poście chciałem opisać sposób wykorzystywania Compiler Explorer do przetestowania kodu na STM32, AVR lub inny dostępny kompilator.
 [Źródło: https://twitter.com/compileexplore]

Na samym początku należy stworzyć plik z kodem źródłowym oraz otworzyć odpowiedni kompilator.


Listy przydatnych flag dla kompilatora można znaleźć na następujących stronach:


Kompilacja programu następuje w czasie rzeczywistym, dzięki temu ewentualne zmiany są od razu dostępne do podglądnięcia. Dodatkowo udostępniony jest kod assemblera dzięki któremu można łatwo sprawdzić w jakich krokach nasze urządzenie wykona operację.

Dzięki takiemu rozwiązaniu można sprawdzić w jaki sposób będzie się zachowywał przygotowany kod programu. Czy będzie wykorzystywał dane parametry sprzętowe bądź jak będzie działał kod skompilowany dla różnych kompilatorów. Dodatkowo można przeglądnąć dane wygenerowane dla różnych wartości optymalizacji kodu. Dodatkowym atutem jest podgląd danych assemblera. 

Poniżej krótki przykład z wykorzystaniem wartości float oraz sprzętowej obsługi liczb zmiennoprzecinkowych FPU. 

Kod został wygenerowany z wykorzystaniem następujących flag:

  1.  -O0 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -Wdouble-promotion -Wall -Wextra

Opis zastosowanych flag:

-O0 - większość możliwości optymalizacji została wyłączona.
-mcpu=cortex-m4 - wybór układu 
-mfpu=fpv4-sp-d16 - użycie sprzętowego wsparcia dla FPU. W wersji fpv4.
-Wdouble-promotion - generowanie ostrzeżeń o promocji typów z float na double.
-Wall - generacja podstawowych zestawów ostrzeżeń.
-Wextra - generowanie dodatkowych danych dla ostrzeń, nie uwzględnionych w wcześniejszym punkcie.

Testowy kod wygląda następująco:

  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main(void)
  6. {
  7.     float a = 3.0;
  8.  
  9.     for(uint8_t i = 0; i<20; i++)
  10.     {
  11.         a += 1.35f;
  12.         printf("%.2f\r\n", a);
  13.     }
  14.  
  15.     printf("Test\r\n");
  16.  
  17.     return 0;
  18. }

Przy zastosowaniu powyższych flag dla ostrzeżeń nastąpi wygenerowanie informacji o zmianie typu z float na double dla funkcji printf. W tym przypadku nie da się go inaczej pozbyć niż przez rzutowanie na tym double. Ponieważ funckja printf nie wspiera zmiennych typu float.

Link do przykładu - https://godbolt.org/z/Ybs49E

Aby przetestować kod dla AVR należy zmienić zestaw flag kompilacji oraz zmienić kompilator na AVR.