www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

LPC2xxx in funkcija na določeni lokaciji
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 8:03 pm    Naslov sporočila:   Odgovori s citatom

Ok, sedaj sem malo premislil...
1.) V bootloaderju ni treba vrstice IMPORT SWI_Handler, vrstico SWI_Handler B SWI_Handler pa pusti notri.

2.) Tik preden resetiraš uC in skočiš v svojo aplikacijo, v katerem mode-u si? (View->Registers window->Internal->Mode)

3.) SWI_Handler mora biti implementiran v aplikaciji

4.) Katere naslove vpišeš v exception vektorje, kam jih vpišeš in za kateri naslov buildaš aplikacijo?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 8:20 pm    Naslov sporočila:   Odgovori s citatom

Umnik je napisal/a:

1.) V bootloaderju ni treba vrstice IMPORT SWI_Handler, vrstico SWI_Handler B SWI_Handler pa pusti notri.

2.) Tik preden resetiraš uC in skočiš v svojo aplikacijo, v katerem mode-u si? (View->Registers window->Internal->Mode)

3.) SWI_Handler mora biti implementiran v aplikaciji

4.) Katere naslove vpišeš v exception vektorje, kam jih vpišeš in za kateri naslov buildaš aplikacijo?

1. Imam tako.
2. Startup.s začne kot supervisor, nekje vmes preskoči na user. Preden začne izvajati aplikacijo je na user, med aplikacijo je tudi na user. Ko se ustavu na SWI_Handler je pa nazaj na supervisor.
3. Kako?
4. Prvo svoje nisem tikal. Je treba kaj nastavljat? Aplikacijo buildam za IROM1: 0x10000 v velikosti 0x50000 in iram1:0x40000200 v velikosti: 0x7e00.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 8:33 pm    Naslov sporočila:   Odgovori s citatom

jvolk je napisal/a:
1. Imam tako.
2. Startup.s začne kot supervisor, nekje vmes preskoči na user. Preden začne izvajati aplikacijo je na user, med aplikacijo je tudi na user. Ko se ustavu na SWI_Handler je pa nazaj na supervisor.
3. Kako?
4. Prvo svoje nisem tikal. Je treba kaj nastavljat? Aplikacijo buildam za IROM1: 0x10000 v velikosti 0x50000 in iram1:0x40000200 v velikosti: 0x7e00.


K točki 2: Izhod iz bootloaderja pusti na supervisor. Poglej če imaš v startupu bootloaderja odsek spodaj, napisan tako:
Koda:
; Initialise Interrupt System
;  ...


; Setup Stack for each mode

                LDR     R0, =Stack_Top

;  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
;                MOV     SP, R0
;                SUB     R0, R0, #SVC_Stack_Size

;  Enter User Mode and set its Stack Pointer
;                MSR     CPSR_c, #Mode_USR
                IF      :DEF:__MICROLIB

                EXPORT __initial_sp

                ELSE

                MOV     SP, R0
                SUB     SL, SP, #USR_Stack_Size

                ENDIF


; Enter the C code

Zakomentirane so tri dodatne vrstice, tako da se bootloader izvaja v SVC mode-u.

K točki 3: Če je aplikacija z RTX Kernelom, je SWI Handler že implementiran.

K točki 4: Pred resetom mora reč izgledati nekako tako:
Koda:
static void start_applikacije (void)
{
    U64 *sp, *dp;
 
    /* Kopiraj exception vektorje v RAM */
    dp = (U64 *)0x40000200; //RAM naslov, kamor se kopirajo exception vektorji
    for (sp = (U64 *)0x10000; sp != (U64 *)0x10040; sp++, dp++) {
        *dp = *sp;
    }

    /* Remap na RAM. */
    MEMMAP = 2; 

    /* Reset */
    ((func)0)();
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 9:08 pm    Naslov sporočila:   Odgovori s citatom

Točko 2 sem rešil. Bootloader pokliče aplikacijo kot supervisor.

točka 4: Kam točno dam tale tvoj kos kode? Če ga dam v start aplikacije, se mi bo potem vedno ciklal (ker ga resetira na koncu?).
Tisti ukaz za reset se mi ne prevede, sem napisal svojega (tako kot v bootloaderju, le da pokliče naslov 0).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 9:15 pm    Naslov sporočila:   Odgovori s citatom

Tale zadnji kos je zadnja funkcija, ki se mora izvršiti v bootloaderju.
Skopira vektorje, nastavi remap na RAM, resetira procesor, potem pa bi se morala zagnati aplikacija.

Aha, tisti func je v bistvu tole:
Koda:
typedef void (*func)(void);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 9:43 pm    Naslov sporočila:   Odgovori s citatom

Aha ja, razumem.

Sedaj mi skoči na tole:
Koda:
Undef_Handler   B       Undef_Handler
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 9:53 pm    Naslov sporočila:   Odgovori s citatom

Oh, super... Rolling Eyes

Se pravi...
Imamo bootloader, buildan z naslova 0x0000, ki smo ga pustili v SVC mode-u. Zadnja stvar, ki se izvede v bootloaderju je tista funkcija ki kopira exception vektorje od naslova 0x10000 do 0x10040 v RAM na naslovu 0x40000200, nastavi remap na RAM in resetira uC.
Tak bootloader flashamo na uC.

Potem imamo našo aplikacijo. Buildana je z naslova 0x10000 naprej, RAM pa uporablja od naslova 0x40000200 naprej. Tako aplikacijo tudi flashamo na uC in pri tem pazimo, da nismo pobrisali flash blokov, v katerih je bootloader.

Potem poženemo aplikacijo z debuggerjem in poženemo.

Prileti v Undefined handler?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 10:01 pm    Naslov sporočila:   Odgovori s citatom

Točno tako kot si napisal. Debugiram v bootloaderju (da mi lepo skoči v .s datoteki na pravo vrstico), ampak tudi če debugiram v aplikaciji mi skoči na isti naslov (0x00000040 - kjer je Undef_Handler).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Pon Okt 18, 2010 10:08 pm    Naslov sporočila:   Odgovori s citatom

Čudno. Če skače na 0x0040 mi pravi, da exception vektorji niso skopirani.
Bom preveril, če nisem česa pozabil. Pot je gotovo prava.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jvolk
Član
Član



Pridružen-a: Ned 05 Mar 2006 1:14
Prispevkov: 737
Aktiv.: 3.13
Kraj: okolica Divače

PrispevekObjavljeno: Pon Okt 18, 2010 10:33 pm    Naslov sporočila:   Odgovori s citatom

Ok.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
bray
Član
Član



Pridružen-a: Sre 19 Jan 2005 23:53
Prispevkov: 327
Aktiv.: 1.38
Kraj: Vransko

PrispevekObjavljeno: Sre Okt 20, 2010 4:37 pm    Naslov sporočila:   Odgovori s citatom

Pred casom sem tudi jaz ze poizkusal narediti bootloader pa sem potem obupal. Gre za bootloader, ki iz SD kartice potegne bin file in ga z IAP zpise na naslov 0x10000. Stvar deluje dokler v aplikaciji ni interruptov. Se mi zdi, da imam isti problem z remapiranjem vektorjev.

Je ze kaj novega?

_________________
I didn't know it was impossible when I did it!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.03
Kraj: Novo mesto

PrispevekObjavljeno: Sre Okt 20, 2010 5:02 pm    Naslov sporočila:   Odgovori s citatom

bray je napisal/a:
Je ze kaj novega?

Vse kar sem v tej temi napisal, drži.

Edini popravek je v tem, kam se kopirajo exception vektorji - na začetek RAMa:
Koda:
static void start_applikacije (void)
{
    U64 *sp, *dp;
 
    /* Kopiraj exception vektorje v RAM */
    dp = (U64 *)0x40000000; //RAM naslov, kamor se kopirajo exception vektorji
    for (sp = (U64 *)0x10000; sp != (U64 *)0x10040; sp++, dp++) {
        *dp = *sp;
    }

    /* Remap na RAM. */
    MEMMAP = 2;

    /* Reset */
    ((func)0)();
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 6 dni


Powered by phpBB © 2001, 2005 phpBB Group