Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32F4-Discovery - jak skompilować kod webserwera? (ograniczenie kodu)

karolczyzycki 28 Sie 2013 00:02 4854 32
  • #1 28 Sie 2013 00:02
    karolczyzycki
    Poziom 20  

    Dzień dobry,
    Posiadam STM32F4-Discovery (STM32F407VG) oraz DP83848, na stronie producenta znalazłem przykładowe programy demo, projekty które są stworzone pod Keila. Podczas próby kompilacji wyskakuje błąd ograniczenia.
    W jaki sposób mogę skompilować te kody żeby się "pobawić" tymi programami i po testować?

    1. Zbudować projekt pod CooCox?
    2. Użyć Keila z zewnętrznym kompilatorem?

    Obu opcji próbowałem ale za każdym razem utknę w jakimś momencie, żadna próba się jeszcze nie udała.

    Udało się tylko odpalić jeden projekt pod CooCox'a, wszystko mam zgodnie z opisem ale działa okropnie wolno i tylko przez LAN z komputerem, router go nie "widzi" nawet, dlatego chciałem spróbować innych kodów żeby sprawdzić gdzie leży problem.

    0 29
  • #2 28 Sie 2013 09:21
    BlueDraco
    Specjalista - Mikrokontrolery

    Niedawno znajomy próbował jakiś demonstracyjny webserver z sieci i całość zajęła 19 KiB, więc darmowy Keil nie miał z tym problemu.

    Zasadniczo bez kłopotu powinno się dać przenieść projekt pod CooCox lub lubianego tutaj Eclipse DIY Freddiego z nieskonfigurowanym domyślnie stosem. Wygeneruj nowy projekt w nowym środowisku, a następnie usuń wygenerowany main i dodaj do projektu wszystkie pliki starego projektu oprócz pliku startowego (w Keil -. stsrtupx.s).

    0
  • #3 28 Sie 2013 09:28
    Freddie Chopin
    Specjalista - Mikrokontrolery

    BlueDraco napisał:
    lubianego tutaj Eclipse DIY Freddiego z nieskonfigurowanym domyślnie stosem

    Są tam jeszcze inne nieskonfigurowane rzeczy, np. ethernet i USB...

    Pomijam już to, że mieszasz dwie różne sprawy (konfiguracja toolchaina i przykładowe projekty).

    No ale żeby było konstruktywnie, to ja chętnie poczytam opis konfiguracji środowiska wg Ciebie oraz chętnie pobiorę przykładowe projekty Twojego autorstwa (możesz oczywiście oprzeć się na moich).

    4\/3!!

    0
  • #4 28 Sie 2013 10:08
    BlueDraco
    Specjalista - Mikrokontrolery

    Nie dam się sprowokować... ;) No, może trochę...

    Napiszę tylko, że spośród kilkudziesięciu projektów, które robiłem na Cortexy, tylko w jednym miałem potrzebę ręcznej zmiany domyślnej konfiguracji stosu, więc Twoja zabawa w kotka i myszkę, choć masz do niej dobrą podbudowę teoretyczną, w praktyce skutkuje głównie dydaktycznym utrudnianiem życia programiście.

    W przyzwoitych środowiskach (ale np. nie w Keilu), stos jest domyślnie umieszczony na końcu głównego bloku pamięci i może zająć cały obszar tego bloku nie zajęty przez inne dane, bez potrzeby jawnego określania jego rozmiaru.

    Do wielu projektów bez RTOS takie rozwiązanie jest dobre i wygodne dla programisty.

    0
  • #5 28 Sie 2013 10:26
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Jawne określenie rozmiaru stosu (stosów) zajmuje jakieś 3 sekundy, a dzięki temu zyskujesz świadomość jego rozmiaru i tego że kiedyś może się skończyć. Rozwiązanie typu "stos na końcu zajmuje sobie tyle miejsca ile jest" to taka wycieczka w ciemnościach. Przecież program skompiluje się bezproblemowo nawet jeśli nie będzie ani pół wolnego bajtu na stos w pamięci RAM (bo przecież stos nie jest umieszczony nigdzie przez skrypt linkera), a więc zamiast od razu dostać ostrzeżenie kompilatora, że zadeklarowane rozmiary są nie do pogodzenia z programem, musisz się o tym przekonać gdy występują dziwne problemy. Jak wiadomo dziwne problemy mają to do siebie, że czasem występują od razu, czasem dopiero po jakimś czasie (np. bardzo długim), czasem w bardzo specyficznych sytuacjach... Dodając do tego dynamiczną alokację pamięci wraz z "sprawdzeniem" czy sterta już nie wjechała na stos to już w ogóle robi się wycieczka w ciemnościach po bagnistym terenie... Stąd naprawdę preferuję podejście, w którym rozmiar stosu jest określony z góry. Na pewno nie jest to żadne panaceum, ale jest choć trochę bezpieczniejsze (i bardziej uświadamiające) niż opcja opisywana przez Ciebie.

    Jedyne z czym mogę się zgodzić to brak korzyści z użycia wielu stosów w programach bez RTOSa - przynajmniej obecnie wydaje mi się, że takie coś nie ma specjalnego sensu.

    Używając jednego stosu dodatkowo można przejść do prawdziwie bezpiecznej alternatywy, umieszczając stos na początku pamięci RAM, następie .data i .bss, a dopiero na końcu stertę - w takim układzie przepełnienie stosu i/lub sterty zaowocuje dostępem do nieistniejącego obszaru, a co za tym idzie wyjątkiem sprzętowym. I dopiero to jest zabezpieczenie...

    Reasumując - ja wolę świadome podejście, Ty zaś "kompilator sobie to gdzieś umieści i działa". Tylko trzeba by dopowiedzieć "... do czasu".

    4\/3!!

    0
  • #6 28 Sie 2013 11:11
    BlueDraco
    Specjalista - Mikrokontrolery

    Ok, zgadzam się ze wszystkim, co piszesz, tylko zrób tak, żeby przy tworzeniu projektu zwierzę wyświetlało na czerwono komunikat "Pamiętaj o skonfigurowaniu stosu!". bo problem nie w tym, że trzeba ten stos ustawić, a w tym, że człowiek o tym nie wie, a nawet jak wie - to łatwo może zapomnieć w ferworze walki, czego najlepszym dowodem jest liczba delikwentów, którzy w Twoje sidła wpadają.

    0
  • #7 28 Sie 2013 11:13
    karolczyzycki
    Poziom 20  

    BlueDraco, odnośnie:

    Cytat:
    Wygeneruj nowy projekt w nowym środowisku, a następnie usuń wygenerowany main i dodaj do projektu wszystkie pliki starego projektu oprócz pliku startowego (w Keil -. stsrtupx.s).

    Czyli jeśli pobieram projekt zrobiony w Keilu (ze stronki producenta), to wystarczy to pododawać do CooCox'a i skompilować? Czy to aż takie łatwe?

    0
  • Pomocny post
    #8 28 Sie 2013 11:47
    BlueDraco
    Specjalista - Mikrokontrolery

    Jeśli cały projekt to tylko płaski zbiór plików w C, to jest to "aż tak łatwe". Trochę mniej łatwe robi się przy drzewie folderów, a jeszcze mniej łatwe w przypadku użycia bibliotek, ale nie jest to jakieś szczególnie trudne.

    0
  • #9 28 Sie 2013 11:56
    karolczyzycki
    Poziom 20  

    Chcę spróbować któregoś z rozwiązań:

    1. Przełożyć projekt do CooCox'a
    Projekt ma kilka folderów:
    STM32F4-Discovery - jak skompilować kod webserwera? (ograniczenie kodu)
    Czy to powinienem dodać tak po prostu przez "add group" i "add file"?

    2. Odpalić demo w Keilu.
    Czy to nie dziwne że demo ze strony jest tak duże? Ten serwer to tylko strona HTTP a pokazuje:

    Cytat:
    [.\STM324xG_EVAL\STM324xG_EVAL.axf: error: L6050U: The code size of this image (37432 bytes) exceeds the maximum allowed for this version of the linker.

    0
  • Pomocny post
    #10 28 Sie 2013 12:43
    BlueDraco
    Specjalista - Mikrokontrolery

    Najpierw zobacz, gdzie są pliki źródłowe. Foldery EWARM, MDK-ARM itd. to są foldery, w których trzymane są nie pliki źródłowe, a pliki projektów, specyficzne dla poszczególnych środowisk.

    Prawdopodobnie musisz wrzucić tylko pliki z src i inc.

    0
  • #11 28 Sie 2013 13:34
    karolczyzycki
    Poziom 20  

    .c oraz .h są w "scr" oraz "inc"
    Czy to wszystkie pliki?

    0
  • #12 28 Sie 2013 14:46
    BlueDraco
    Specjalista - Mikrokontrolery

    Rozumiem, że oczekujesz, że powiem Ci, co zawiera Twój dysk, bo Ty sam nie jesteś w stanie tego stwierdzić. To chyba przesada.

    Może to wszystko, a może w zupełnie innych folderach są jeszcze jakieś pliki, np. stos TCP/IP. Możesz to podejrzeć w Keilu.

    0
  • #13 28 Sie 2013 14:49
    karolczyzycki
    Poziom 20  

    Problem w tym że nie wiem czego dokładnie szukać.
    Wiem ze na pewno pliki które mam w kodzie .h muszę znaleźć, ale co jeszcze?
    Chciałbym ogólnie poznać zasadę, czy konkretne pliki muszą być w folderach, czy luzem a tylko kwestia dodania?

    0
  • #14 28 Sie 2013 15:09
    BlueDraco
    Specjalista - Mikrokontrolery

    Od biedy wszystko może być w jednym folderze.

    Jeśli czegoś zabraknie, kompilator lub konsolidator będzie krzyczał. Zamiast gdybać zabierz się do roboty.

    0
  • #15 28 Sie 2013 15:13
    karolczyzycki
    Poziom 20  

    Cytat:
    Zamiast gdybać zabierz się do roboty.

    Nie rozumiem celu dla którego tak piszesz.
    Napisałem że nie wiem czego dokładnie szukać. Skąd powinienem wiedzieć czy plik jest potrzebny czy nie? Z tego że jest zdefiniowany w kodzie?

    0
  • Pomocny post
    #16 28 Sie 2013 15:17
    BlueDraco
    Specjalista - Mikrokontrolery

    Plik z funkcją main() na pewno jest potrzebny. Jeśli czegoś zabraknie - będziesz miał komunikaty o błędach - szukaj brakujących plików i je dokładaj. Proste?

    0
  • #17 10 Wrz 2013 11:34
    karolczyzycki
    Poziom 20  

    Po długiej walce jestem zmuszony kolejny raz prosić o pomoc.
    Próbuję z Keil'em skompilować projekt z książki "SMT32 w Sieci ETHERNET".
    W Keil'u tworzę nowy projekt pod STM32F107.
    Wg autora książki potrzebne pliki to:
    STM32F4-Discovery - jak skompilować kod webserwera? (ograniczenie kodu)
    Więc dodałem ścieżki o raz pliki:
    STM32F4-Discovery - jak skompilować kod webserwera? (ograniczenie kodu)
    STM32F4-Discovery - jak skompilować kod webserwera? (ograniczenie kodu)

    Podczas kompilacji mam błąd:

    Code:
    Rebuild target 'Target 1'
    
    assembling startup_stm32f10x_cl.s...
    compiling ex_led.c...
    compiling board_led.c...
    .\examples\include\butterfly\board_def.h(12): error:  #35: #error directive: USE_STDPERIPH_DRIVER not defined
    compiling util_delay.c...
    ".\test.axf" - 1 Errors, 0 Warning(s).
    Target not created


    I wskazuje on na plik: board_def.h

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Wskaźnik jest na trzeciej linijce od góry.
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Wygląda na to że nie mam czegoś zdefiniowanego. Albo nie dołączyłem jakiegoś pliku w którym to jest.

    0
  • Pomocny post
    #19 10 Wrz 2013 11:59
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ta definicja musi być zdefiniowana na poziomie środowiska/kompilatora - w opcjach projektu. Zresztą dwie następne które są sprawdzane powinny być również tak zdefiniowane. Drzewo plików nic do tego nie ma.

    4\/3!!

    0
  • Pomocny post
    #20 10 Wrz 2013 12:02
    piotrva
    Moderator Mikrokontrolery

    Moim zdaniem ma to znaczenie dla kompilacji całego programu, bo powinno się tez dołączyć do projektu pliki z bibliotekami STDPERIPH, a nie wiemy, czy Autor to zrobił.
    Niemniej jednak ten konkretny błąd, jak słusznie zauważasz, nie jest przez to spowodowany.

    0
  • #21 10 Wrz 2013 12:13
    karolczyzycki
    Poziom 20  

    Drzewko poniżej:
    STM32F4-Discovery - jak skompilować kod webserwera? (ograniczenie kodu)
    Czy te opcje to powinny być zmienione w "Option of Target"? Tam są zakładki.

    0
  • #23 10 Wrz 2013 12:34
    karolczyzycki
    Poziom 20  

    Zrobione:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Część poszło OK, ale nadal jest coś:
    Code:
    .\examples\include\butterfly\board_def.h(23): error:  #35: #error directive: BUTTERFLY uses 25 MHz external quarz.

    Błąd pokazuje w tym miejscu:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #24 10 Wrz 2013 12:48
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Czy opis błędu i kod który pokazałeś nie są wystarczającą wskazówką co z tym zrobić?

    4\/3!!

    0
  • #25 10 Wrz 2013 15:01
    karolczyzycki
    Poziom 20  

    Gotowe, dzięki za pomoc. Idę dalej.

    Brakowało: "HSE_VALUE=25000000" w Target -> Define

    Dodano po 1 [godziny] 53 [minuty]:

    Przy kompilacji innego pliku mam kolejny komunikat o którym w google ani słowa.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #26 10 Wrz 2013 22:04
    McMonster
    Poziom 32  

    karolczyzycki napisał:
    Gotowe, dzięki za pomoc. Idę dalej.

    Brakowało: "HSE_VALUE=25000000" w Target -> Define

    F4Discovery ma kwarc 8 MHz, kod jest dla płytki Butterfly, która ma 25 MHz, takie są wnioski na pierwszy rzut oka na ten kod. Zdefiniowanie tej wartości w projekcie jest bez sensu. Przykłady należałoby najpierw przeanalizować i dostosować do posiadanej płytki, a nie na oślep omijać problemy.

    0
  • #27 10 Wrz 2013 22:11
    karolczyzycki
    Poziom 20  

    Zgadza się ja mam Discovery 8MHz.
    Ale jak wynika z treści postów, ja mam problem ze stworzeniem projektu, kompilacją, a nie wgraniem. Więc na tym etapie to jaką mam płytę nie ma znaczenia (nie podłączam jej).
    Ja najpierw próbuję to wszystko skompilować na STM32F107 tak jak autor książki, pod jakąkolwiek płytkę. Jeśli stworzenie projektu w Keil pod Butterfly się uda. Wtedy będę myślał jak to przenieść na moją płytkę.

    0
  • #28 10 Wrz 2013 22:31
    McMonster
    Poziom 32  

    karolczyzycki napisał:
    Zgadza się ja mam Discovery 8MHz.
    Ale jak wynika z treści postów, ja mam problem ze stworzeniem projektu, kompilacją, a nie wgraniem. Więc na tym etapie to jaką mam płytę nie ma znaczenia (nie podłączam jej).
    Ja najpierw próbuję to wszystko skompilować na STM32F107 tak jak autor książki, pod jakąkolwiek płytkę. Jeśli stworzenie projektu w Keil pod Butterfly się uda. Wtedy będę myślał jak to przenieść na moją płytkę.

    Oczywiście można dążyć do skompilowania za wszelką cenę bezsensownego kodu, ale potem będziesz musiał wykonać taką samą pracę, by dostosować to do Discovery. Albo i większą, bo będziesz musiał pamiętać o takich kwiatkach, jak te losowe definicje w ustawieniach projektu.

    Najpierw zrozum, z czym masz do czynienia, bo się tylko bezsensownie namachasz i zniechęcisz.

    0
  • #29 10 Wrz 2013 22:33
    karolczyzycki
    Poziom 20  

    Cytat:
    bezsensownego kodu

    Dlaczego tak uważasz?
    To są przykłady z książki, pod '107, więc wszystko jest w nich napisane dobrze, tak żeby się kompilowało, a ja po prostu próbuje zrozumieć jak się tworzy projekt w Keilu z gotowego przykładu.

    0
  • #30 10 Wrz 2013 22:42
    McMonster
    Poziom 32  

    karolczyzycki napisał:
    Cytat:
    bezsensownego kodu

    Dlaczego tak uważasz?
    To są przykłady z książki, pod '107, więc wszystko jest w nich napisane dobrze, tak żeby się kompilowało, a ja po prostu próbuje zrozumieć jak się tworzy projekt w Keilu z gotowego przykładu.

    Tak, dla płytki Butterfly z innym mikrokontrolerem. Sprawdziłeś, czy wszystkie piny i definicje wymaganych peryferiów są takie same i tam, gdzie być powinny? Czy ich obsługa jest taka sama? Już sama definicja zegara wymuszona w kodzie powinna dać do myślenia.

    Nie wspominam już o tym, że wszystkie pliki nagłówkowe bezmyślnie załączyłeś z STM32F10x.

    0