Skocz do zawartości
Komentator

Kurs STM32 - #3 - Płytka Nucleo, konfiguracja środowiska

Pomocna odpowiedź

Właściwie co robi mikrokontroler jak dojdzie do końca programu? Resetuje się? Wchodzi w ekwiwalent while(1)?

EDIT:

Znalazłem częściową odpowiedź: http://www.avrfreaks.net/forum/what-happens-when-main-function-returns

W gcc wyłączają się przerwania i wchodzi w nieskończoną pętlę.

Tutaj: http://electronics.stackexchange.com/questions/55767/who-receives-the-value-returned-by-main jest więcej:

On a microcontroller, main() is not really expected to ever exit, and the behavior if it does is not defined — so it's up to whoever wrote the C runtime for the microcontroller. I've seen systems that:

Have an implicit loop around main(), so that if it exits, it simply gets called again.

Have a simple "jump-to-self" loop that gets executed if main() ever exits.

Simply execute the rest of code memory that follows the call to main(). This is called "running off into the weeds".

I've never seen one that actually does anything at all with the value returned by main(). If this is something you actually care about, then you should take a look at — and possibly modify — the source code for your system's C runtime library.

Udostępnij ten post


Link to post
Share on other sites

Chumanista, napisałem wszystko dokładnie kilka postów wcześniej. Wszystko jest w pliku startup_stm32f10x_md.S. W przypadku OpenSTM32 w tym pliku jest błąd i mikrokontroler robi skok do ostatniej procedury wywoływanej przez main, a później wchodzi w kod który akurat jest dalej w pamięci. Można zmienić plik w asemblerze i dodać tam np. pętlę nieskończoną.

Ale ogólnie na mikrokontrolerach zakończenie funkcji main to błąd - nie należy tak robić.

Udostępnij ten post


Link to post
Share on other sites

Elvis, Chodziło mi o bardziej ogólną odpowiedź, nie związaną z platformą STM32. Tą odpowiedź otrzymałem w cytacie w moim poście powyżej.

Udostępnij ten post


Link to post
Share on other sites

Wbrew pozorom to co napisałem też jest ogólne - większość kompilatorów dostarcza podobny plik, z kodem w asemblerze - oczywiście zależnym od użytego mikrokontrolera. I właśnie tam jest ustalone co kod robi przed, a co po funkcji main(). Wystarczy sprawdzić gdzie ten plik jest i trochę poczytać o asemblerze wykorzystywanego układu.

Udostępnij ten post


Link to post
Share on other sites

Witam.

Zakupiłem na Botlandzie pakiet przeznaczony do niniejszego kursu, jednak mam problem. Po uruchomieniu programów proponowanych w tej lekcji program w mikrokontrolerze się wyłącza. Wklejam zawartość z konsoli konsoli środowiska:

Open On-Chip Debugger 0.9.0-dev-00415-g2d4ae3f-dirty (2015-06-12-17:54)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v24 API v2 SWIM v11 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 3.230347
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x08000168 msp: 0x20005000
** Programming Started **
auto erase enabled
Info : device id = 0x20036410
Info : flash size = 128kbytes
target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20005000
wrote 3072 bytes from file Debug/uno.elf in 0.421200s (7.123 KiB/s)
** Programming Finished **
** Verify Started **
target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
verified 2160 bytes in 0.202801s (10.401 KiB/s)
** Verified OK **
** Resetting Target **
shutdown command invoked

Uprzejmie proszę o pomoc

Udostępnij ten post


Link to post
Share on other sites

Grievous1990, co to znaczy, że się wyłącza? Jakie są objawy w praktyce? Zaktualizowałeś programator i zainstalowałeś sterowniki, tak jak opisano to w kursie?

Udostępnij ten post


Link to post
Share on other sites

Dzięki bardzo chłopaki, teraz rozumiem o co chodzi i dlaczego tak a nie inaczej. Skoro musi być int a return 0; jest dodawany domyślnie to nie mam więcej pytań i wszystko jest jasne. Poprostu nie wiedziałem o tym obowiązkowym typie funkcji main() jakim jest int. Sądziłem że tak jak w C++ można zmienić na dowolny.

Udostępnij ten post


Link to post
Share on other sites

Wszystko mi działa, problemy miałem przez własne gapiostwo i niezrozumienie tematu. Polecam usunąć moje posty żeby nie zaśmiecały tematu.

Udostępnij ten post


Link to post
Share on other sites

Grievous1990, napisz co konkretnie zrobiłeś źle. Pewnie pomoże to innym osobom, które popełnią taki błąd.

Udostępnij ten post


Link to post
Share on other sites

Właśnie w tym rzecz, że sam nie wiem co źle zrobiłem, najprawdopodobniej źle przekopiowałem kod programu.

Główny problem dotyczył pierwszego programu z części kursu o GPIO- kompilował się i uruchomienie nie wywoływało błędów, ale dioda nie migała. Błąd pojawiał się przy uruchomieniu debuggera. Zasugerowałem się informacją z konsoli "shutdown command invoked" (pojawiająca się po run, a nie debug) i uznałem, że coś mam nie tak ze środowiskiem.

Niestety usunąłem cały tamten projekt, więc nie mam możliwości sprawdzić co spartaczyłem. Tak jak napisałem, moje gapiostwo i ogólnie jestem nowy w tych tematach. Wcześniej programowałem tylko 8051 na laboratoriach na studiach i to w assemblerze bez zaawansowanych środowisk programistycznych.

EDIT: Przestroga dla innych nowych: jak coś nie działa, to na 99% macie błąd w kodzie. Ja zrobiłem błąd przy zwykłym ctrl-c ctrl-v 🙂

Udostępnij ten post


Link to post
Share on other sites

A ja jestem na początku konfiguracji.

Usunąłem katalog utilities i usunąłem wpis: #include "stm32f1xx_nucleo.h" z main.c

Po skompilowaniu kodu wyrzuca mi informację:

Chciałbym poprosić o pomoc.

Udostępnij ten post


Link to post
Share on other sites

nox, Chyba natrafiłem na taki sam problem. Zapisz zmiany w pliku main.c i spróbuj jeszcze raz skompilować

Udostępnij ten post


Link to post
Share on other sites

Faktycznie pomogło - dzięki

Kompilacja przechodzi ale zwraca mi jeszcze jeden warning

Może wiecie jak się tego pozbyć?

Udostępnij ten post


Link to post
Share on other sites

nox, w jakim katalogu masz zapisany projekt?

Udostępnij ten post


Link to post
Share on other sites
nox, w jakim katalogu masz zapisany projekt?

Mój katalog to:

c:\Users\Nox\workspace\proba3

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij, aby zacząć pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...