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:
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.