18 marca 2017

Projekt bez bibliotek

W poprzednich częściach omówiliśmy jak utworzyć projekt oparty o StdPeriph, a następnie usunąć z niego niechcianą bibliotekę. Teraz utworzymy projekt bez biblioteki i dodamy do niego niezbędne pliki, aby uzyskać działający program.

Zaczynamy jak zwykle od utworzenia projektu w OpenSTM32, tym razem jednak wybierzemy opcję "No firmware" w oknie konfiguracji projektu.


W tak przygotowanym projekcie znajdziemy raptem kilka plików:

  • startup/startup_stm32.s - plik startowy w asemblerze
  • startup/sysmem.c - funkcja pomocnicza dla wywołania malloc
  • LinkerScript.ld - skrypt linkera

Poza tym na dysku znajdziemy oczywiście sam projekt dla Eclipse. Niestety próba kompilacji zakończy się niepowodzeniem. Nie powinniśmy być zaskoczeni, w końcu nasz program nie zawiera funkcji main.


Wykorzystamy nasz plik src/main.c z poprzednio przetestowanego przykładu. Po prostu kopiujemy potrzebny nam plik do nowego projektu - później dodamy kolejne brakujące.
Teraz próba kompilacji zakończy się komunikatem o braku pliku nagłówkowego stm32f10x.h

../src/main.c:1:23: fatal error: stm32f10x.h: No such file or directory
 #include "stm32f10x.h"

Plik ten zawiera definicje charakterystyczne dla naszego mikrokontrolera. Moglibyśmy napisać go sami, ale znacznie łatwiej wykorzystać gotowe rozwiązanie.
W poprzednim projekcie plik stm32f10x.h znajdziemy w folderze CMSIS/device. Możemy utworzyć taki folder w nowym projekcie i dodać go do ścieżki kompilatora, albo po prostu skopiować go do katalogu inc. Ja wykorzystam drugą opcję.
Dalej postępujemy podobnie, czyli próbujemy kompilować projekt i dodajemy brakujące pliki:

  • CMSIS/core/core_cm3.h
  • CMSIS/core/core_cmInstr.h
  • CMSIS/core/core_cmFunc.h

Teraz zobaczymy nieco inny komunikat o błędzie:

/Users/pbugalski/Documents/workspace_stm32/stm32_04/inc/stm32f10x.h:102:3: error: #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
  #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"

Jak widać musimy zdefiniować do jakiej rodziny układów należy nasz procesor. Odpowiednią informację znajdziemy w dokumentacji STM32F103 - nasz układ to klasa średnia czyli medium density.
Musimy więc dodać definicję stałej STM32F10X_MD. W tym celu z menu Project wybieramy Properties, a następnie odnajdujemy opcję "MCU GCC Compiler"->Preprocessor. W oknie ze zdefinowanymi symbolami (Defined symbols) widzimy obecnie zdefiniowane stałe - dodajemy nową wartość STM32F10X_MD.



Teraz mamy ostatni błąd do poprawienia:
/Users/pbugalski/Documents/workspace_stm32/stm32_04/inc/stm32f10x.h:489:30: fatal error: system_stm32f10x.h: No such file or directory
 #include "system_stm32f10x.h"

Ponieważ nie mamy i nie chcemy mieć pliku system_stm32f10x.h, usuwamy linijkę powodującą błąd.
Kompilujemy program i możemy cieszyć się sukcesem:


Oczywiście sprawdzamy czy program działa - wszystko działa jak poprzednio, a my możemy zobaczyć, że do migania diodą wystarczyło raptem 7 plików zamiast całej dużej biblioteki.
W rzeczywistości mamy w projekcie 8 plików, ale startup/sysmem.c jest potrzebne tylko jeśli chcielibyśmy wykorzystywać dynamiczną alokację pamięci funkcją malloc. Skoro tego nie używamy, rownież plik sysmem.c możemy usunąć.

Nasz projekt nadal nie jest w pełni minimalistyczny, ale na potrzeby poznawania mikrokontrolera STM32103 powinien nam wystarczyć. Do tego co jeszcze można z projektu wyrzucić jeszcze wrócimy.
Teraz czas poznać nasz procesor oraz zrozumieć magiczne liczby które wprowadziliśmy w programie przykładowym.

2 komentarze:

  1. Udało mi się tego dokonać, przeskok jest znaczący. Projekt z biblioteki STD zmalał z 14 MB do 1,5 MB już ze skompilowanym kodem elf i bin. Mam tylko problem bo w main.c muszę podawać nieco dłuższą ścieżkę w include,
    #include "../inc/stm32f10x.h" bo inaczej nie widzi tego pliku.

    OdpowiedzUsuń
  2. Dzięki za powyższy przykład:) Właśnie tego szukałem:) Szkoda że nie rozwijasz dalej tego bloga...

    Pozdrawiam

    OdpowiedzUsuń