Skocz do zawartości

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


Komentator

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.

Link do komentarza
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ć.

Link do komentarza
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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Link do komentarza
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.

Link do komentarza
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 🙂

Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij 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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.