Hej
Oglądam kurs: https://www.youtube.com/watch?v=TEq3-p0GWGI&list=PLPW8O6W-1chwyTzI3BHwBLbGQoPFxPAPM&index=24&t=0s
I chciałbym przystosować program z tego kursu pod mikrokontroler STM32F030F4. Czy możecie mi podpowiedzieć na co powinienem zwrócić szczególną uwag?
Próbowałem dostosować program, jednak po wpisaniu do rejestru R13(SP) wartości sp_blinky1. Program wchodzi do Hard Fault Handler.
Pozdrawiam
StaryAnoda_NEW
Adaptacja programu pod STM32F0
- StaryAnoda_NEW
- User
- Posty: 103
- Rejestracja: środa 04 kwie 2018, 16:48
Re: Adaptacja programu pod STM32F0
Może jakiś problem z wyrównaniem danych?
Nowy blog o tematyce embedded -> https://www.embedownik.pl/
Re: Adaptacja programu pod STM32F0
@StaryAnoda_NEW może zamieść swój program, będzie łatwiej coś pomóc. Do filmiku na YT załączony jest jakiś kod, ale raczej niekompletny.
Re: Adaptacja programu pod STM32F0
Myślę, że nie trzeba jakoś specjalnie modyfikować programu pod Cortex-M0. Oczywiście za wyjątkiem części odpowiedzialnych za inicjację i obsługę peryferiów (funkcje BSP_init, BSP_led*On/Off).
Domyślam się, że kod masz z materiałów do kursu (http://www.state-machine.com/quickstart/lesson22.zip). Jeśli tak to IMHO całkiem naturalnym jest że wywala HardFault. Ty wykonujesz procedurę z 16 minuty filmu, a ten kod dotyczy tego co jest omawiane w 21 minucie i dalszych.
W czym problem? W tym że procek wykonując unstacking przy powrocie z przerwania dostaje nieprawidłowe dane. Stos sfabrykowany dla taska main_blinky1 wygląda tak:
Teraz jeśli do rejestru SP wpiszesz wartość zmiennej sp_blinky1 to procek do ustackingu weźmie wartości opisane jako R11 do R4 a powinien wziąć xPSR do R0. To co jest opatrzone komentarzem R10 zostanie wpisane do rejestru PC i program pójdzie w buraki (albo raczej biorąc R11 za xPSR nie znajdując flagi THUMB). Podmieniając rejestr SP trzeba albo powiększyć (ponieważ stos rośnie "w dół") wartość sp_blinky1 o 0x20 albo skompilować program bez kodu po /* additionally, fake registers R4-R11 */.
Niestety sam nie mogę hipotezy zweryfikować bo, nie wiadomo dlaczego, z poziomu Eclipse nie mam możliwości zmian rejestrów rdzenia a Keila nie mam :-/
Edit:
Wyjaśniła się rzekoma niemożliwość modyfikacji rejestrów rdzenia z poziomu debuggera. No więc jak najbardziej jest to możliwe. W tym przypadku breakpoint nie był ustawiony na ostatniej instrukcji handlera więc w epilogu handlera SysTicka nastąpiło nadpisanie wcześniej zmodyfikowanej wartości. LOL.
Domyślam się, że kod masz z materiałów do kursu (http://www.state-machine.com/quickstart/lesson22.zip). Jeśli tak to IMHO całkiem naturalnym jest że wywala HardFault. Ty wykonujesz procedurę z 16 minuty filmu, a ten kod dotyczy tego co jest omawiane w 21 minucie i dalszych.
W czym problem? W tym że procek wykonując unstacking przy powrocie z przerwania dostaje nieprawidłowe dane. Stos sfabrykowany dla taska main_blinky1 wygląda tak:
Kod: Zaznacz cały
/* fabricate Cortex-M ISR stack frame for blinky1 */
*(--sp_blinky1) = (1U << 24); /* xPSR */
*(--sp_blinky1) = (uint32_t)&main_blinky1; /* PC */
*(--sp_blinky1) = 0x0000000EU; /* LR */
*(--sp_blinky1) = 0x0000000CU; /* R12 */
*(--sp_blinky1) = 0x00000003U; /* R3 */
*(--sp_blinky1) = 0x00000002U; /* R2 */
*(--sp_blinky1) = 0x00000001U; /* R1 */
*(--sp_blinky1) = 0x00000000U; /* R0 */
/* additionally, fake registers R4-R11 */
*(--sp_blinky1) = 0x0000000BU; /* R11 */
*(--sp_blinky1) = 0x0000000AU; /* R10 */
*(--sp_blinky1) = 0x00000009U; /* R9 */
*(--sp_blinky1) = 0x00000008U; /* R8 */
*(--sp_blinky1) = 0x00000007U; /* R7 */
*(--sp_blinky1) = 0x00000006U; /* R6 */
*(--sp_blinky1) = 0x00000005U; /* R5 */
*(--sp_blinky1) = 0x00000004U; /* R4 */
Teraz jeśli do rejestru SP wpiszesz wartość zmiennej sp_blinky1 to procek do ustackingu weźmie wartości opisane jako R11 do R4 a powinien wziąć xPSR do R0. To co jest opatrzone komentarzem R10 zostanie wpisane do rejestru PC i program pójdzie w buraki (albo raczej biorąc R11 za xPSR nie znajdując flagi THUMB). Podmieniając rejestr SP trzeba albo powiększyć (ponieważ stos rośnie "w dół") wartość sp_blinky1 o 0x20 albo skompilować program bez kodu po /* additionally, fake registers R4-R11 */.
Niestety sam nie mogę hipotezy zweryfikować bo, nie wiadomo dlaczego, z poziomu Eclipse nie mam możliwości zmian rejestrów rdzenia a Keila nie mam :-/
Edit:
Wyjaśniła się rzekoma niemożliwość modyfikacji rejestrów rdzenia z poziomu debuggera. No więc jak najbardziej jest to możliwe. W tym przypadku breakpoint nie był ustawiony na ostatniej instrukcji handlera więc w epilogu handlera SysTicka nastąpiło nadpisanie wcześniej zmodyfikowanej wartości. LOL.
Ostatnio zmieniony czwartek 24 paź 2019, 22:12 przez xor, łącznie zmieniany 2 razy.
- StaryAnoda_NEW
- User
- Posty: 103
- Rejestracja: środa 04 kwie 2018, 16:48
Re: Adaptacja programu pod STM32F0
Hej,
Bardzo dziękuję kolego xor za zwrócenie mi uwagi rzeczywiście, uruchamiałem program ze strony, nie pisałem go równocześnie z autorem kursu
Wszystko teraz działa. Mam jeszcze jedno pytanie czy możecie polecić mi jakąś książkę aby poznać co oznaczają to rejestry R0 do R12.
Chodzi mi o to, że nie wiem jak to na prawdę tak niskopoziomowo działa?
W załączniku program dla płytki:
https://hackaday.io/project/21434-leshy-less-expensive-stm32f0-hosting-prototypes
Bardzo dziękuję kolego xor za zwrócenie mi uwagi rzeczywiście, uruchamiałem program ze strony, nie pisałem go równocześnie z autorem kursu
Wszystko teraz działa. Mam jeszcze jedno pytanie czy możecie polecić mi jakąś książkę aby poznać co oznaczają to rejestry R0 do R12.
Chodzi mi o to, że nie wiem jak to na prawdę tak niskopoziomowo działa?
W załączniku program dla płytki:
https://hackaday.io/project/21434-leshy-less-expensive-stm32f0-hosting-prototypes
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Re: Adaptacja programu pod STM32F0
Są książki z serii "definitive guide to arm Mx processors".
Nowy blog o tematyce embedded -> https://www.embedownik.pl/
- ZbeeGin
- User
- Posty: 492
- Rejestracja: sobota 08 lip 2017, 17:16
- Lokalizacja: Śląsko-Zagłębiowska Metropolia
- Kontaktowanie:
Re: Adaptacja programu pod STM32F0
Nie wystarczy Programming Manual... https://www.st.com/content/ccc/resource ... 051352.pdf
Re: Adaptacja programu pod STM32F0
Jest jeden moment gdzie niezbędna może być spora modyfikacja kodu. Mianowicie w lekcji 26. zastosowanie znajduje funkcja CLZ, która dla Cortexów M3 i wyższych jest realizowana jedną instrukcją maszynową. Cortexy M0/0+ nie mają tej instrukcji w repertuarze więc potrzebna jest emulacja programowa. Nie wiem czy keilowy kompilator dostarcza taką funkcję, jeśli nie to trzeba sobie ją znaleźć/napisać samemu. W komentarzach pod filmem są linki do jakichś implementacji. Jakieś algorytmy są też w Hacker's Delight, rozdział Counting Leading 0’s.
Wróć do „ARM STMicroelectronics”
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości