Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Kategoria: Akumulatorki / Baterie / Ładowarki

[LPC17xx][GCC]Bootloader skok do programu

piti___ 12 Maj 2011 12:29
  • #1 12 Maj 2011 12:29
    piti___
    Poziom 23  

    Witam,

    Mam problem ze skokiem do aplikacji głównej.

    Aplikację kompiluję w eclipse, sourcery gcc lite. Podczas kompilacji aplikacji głównej zmieniam w skrypcie linkera linię:

    IROM (rx) : ORIGIN = 0x00000000, LENGTH = 512k
    na
    IROM (rx) : ORIGIN = 0x00008000, LENGTH = 480k

    Po skompilowaniu widzę że hex ma adresy przesunięte o offset 8000h czyli dobrze.

    Skompilowanego bina bootloader i bina z aplikacji łącze razem swoim programikiem. Aplikacja trafia oczywiście pod offset 8000h. Przerabiam całość na hexa (offsety się zgadzają) i wrzucam do procesora.

    Bootloader zatrzymuje się w miejscu:

    Code:

    void boot_jump( uint32_t address ){

       print_buf("123",0,96,1,OR,0);
       fb_refresh_screen();

    /// TUTAJ -------------------------------------------------------
      asm("ldr SP, [r0]\n");
      asm("ldr PC, [r0, #4]\n");//   ;Load new program counter address
    /// albo TUTAJ -------------------------------------------------------

      print_buf("1234",0,96,1,OR,0);
      fb_refresh_screen();
    }

    void execute_user_code(void)
    {
       print_buf("1",0,96,1,OR,0);
       fb_refresh_screen();

       __disable_irq();
       SCB->VTOR = 0x00008000 & 0x3FFFFF80;   // 1FFFFF...

       print_buf("12",0,96,1,OR,0);
       fb_refresh_screen();

       boot_jump(0x00008000);
    }


    Nie mam jtaga. Jakieś rady?

    Pozdrawiam

  • Pomocny post
    #2 13 Maj 2011 08:02
    DosinskY
    Poziom 18  

    Podpowiedź: Wywołaj program właściwy wykorzystując wskaźnik na funkcję (wskazuj wskaźnikiem adres kodu właściwego) zamiast modyfikować PC. Zwróć uwagę na to co jest umieszczone w pierwszych 4 bajtach programu właściwego. Pamiętaj o przeładowaniu wskaźnika stosu.

  • #3 13 Maj 2011 08:44
    piti___
    Poziom 23  

    Wczoraj jeszcze zadziałało:

    Code:

    typedef void (*APP_MAIN)(void);
    static APP_MAIN app_main;

    app_main = (APP_MAIN) (*((u32 *) (0x8000 + 4)));
    app_main();


    Nie do końca aplikacja działała ale widać że się wykonywała. Pewnie jeszcze ten stos.

    Dzisiaj niestety coś zmieniłem i już nic nie działa :)

  • #4 13 Maj 2011 11:22
    hotdog
    Poziom 26  

    Witam. W zasadzie nie wiem czy jak kolwiek Tobie tym pomogę, ale w przykładzie od LPC dotyczącym manualnego wywoływania IAP z działającego programu (czyli w zasadzie w drugą stronę) jest dosyć spory komentarz, więc może się przydać.

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #5 17 Maj 2011 11:33
    piti___
    Poziom 23  

    Wróciłem do tematu bootloadera. Aktualnie aplikacja główna zatrzymuje mi się na kasowaniu segmentu bss

    Code:

        LED1G_SET;
        //
        // Zero fill the bss segment.
        //
        for(pulDest = &_sbss; pulDest < &_ebss; )
        {
            *(pulDest++) = 0;
        }
        LED1R_SET;


    Sprawdzałem _sbss i _ebss w pliku *.map, obie zmienne są umieszczone w pamięci RAM. Jakieś pomysły ?

    Skok do aplikacji wykonuje tak:
    Code:

       SCB->VTOR = 0x00008000 & 0x3FFFFF80;   // 1FFFFF...
       asm("mov R0, 0x00008000");
       asm("ldr SP, [R0]");
       asm("ldr PC, [R0, #4]");


    Program zatrzymuje się na instrukcji:
    *(pulDest++) = 0;

    wyświetliłem sobie adresy pulDest, &_ebss oba są w obszarze RAMu.

  Szukaj w 4mln produktów
Przeglądaj produkty