Używam płyty LPC 1768 z mbed, (z korpusem M3 cpu) i staram się coś tutaj osiągnąć, głównie aktualizuję aplikację użytkownika z karty SD, piszę dwa programy, najpierw bootloader/nano-kernel, a użytkownik-aplikacja (helloworld zrobi na początek):Bootloader dla Cortex M3
- bootloadera/nano-jądro przy 0x00 tras adresowych, będzie to zrobić kilka kontroli i ostatecznie pobrać plik binarny na SD karta
- Bootloader/nano-kernel skopiuje ten plik binarny pod adres 0x9000 (który może później się zmienić, ale to miejsce nie jest używane przez bootloader/nano-kernel, więc powinno być ok)
- Bootloader przeskakuje do aplikacji użytkownika pod 0x9000 + 4
Karta Sd jest dość łatwa do opanowania, mam problemy z częścią do skoków. Oto kod funkcji skaczącej.
void run(void) {
void (*user_code_entry)(void);
unsigned *p;
SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);
// Load contents of second word of user flash - the reset handler address
// in the applications vector table
p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000
user_code_entry = (void (*)(void))p;
// Jump to user application
user_code_entry();
}
Więc mam skompilowane (używam Keil uvision4) wniosek użytkownik zmienia adres startowy do 0x9000. Jeśli zaprogramuję moją tablicę (za pomocą flashmagictool), a następnie ręcznie przeskoczę (nadal używając flashmagictool) do 0x9004 (0x9000 + 4), aplikacja użytkownika zostanie uruchomiona, więc uważam, że kompilacja działa dobrze, więc aplikacja użytkownika może działać pod 0x9000.
Ale jeśli uruchomię bootloader/nano-kernel, ten nie przeskoczy do aplikacji użytkownika i niestety, ponieważ nie mogę debugować, nie jestem pewien co się dzieje ... Próbowałem też nie użyj części SD copy, więc programuję bootloadera najpierw z samym skokiem do 0x9004. Następnie programuję aplikację użytkownika, która będzie znajdować się pod adresem 0x9000. Jeśli zrestartuję płytę, bootloader działa, ale nie przechodzi do aplikacji użytkownika. Sprawdziłem pamięć i wygląda na to, że oba programy (bootloader + user-app) są poprawne i we właściwym miejscu.
Jestem pewien, że czegoś tu brakuje, czy jest jakiś kod niskiego poziomu, na który powinienem patrzeć? Czytałem tony dokumentów online, a z przykładów, które znalazłem, przeskakują do kodu użytkownika w taki sam sposób jak ja ... Dziękuję bardzo za pomoc.
to powinno działać dość podobny w komputerze też, ale z adresami wirtualnymi, zamiast fizycznego - spróbować i zobaczyć, czy to działa, a następnie przenieś kod do Keil – Ulterior
Cortex M3 nie ma MMU, więc nie ma adresów wirtualnych. –