 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 8:03 pm Naslov sporočila: |
|
|
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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 8:20 pm Naslov sporočila: |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 8:33 pm Naslov sporočila: |
|
|
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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 9:08 pm Naslov sporočila: |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 9:15 pm Naslov sporočila: |
|
|
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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 9:43 pm Naslov sporočila: |
|
|
Aha ja, razumem.
Sedaj mi skoči na tole:
Koda: |
Undef_Handler B Undef_Handler |
|
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 9:53 pm Naslov sporočila: |
|
|
Oh, super...
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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 10:01 pm Naslov sporočila: |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Pon Okt 18, 2010 10:08 pm Naslov sporočila: |
|
|
Č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 |
|
 |
jvolk Član



Pridružen-a: Ned 05 Mar 2006 1:14 Prispevkov: 737 Aktiv.: 3.13 Kraj: okolica Divače
|
Objavljeno: Pon Okt 18, 2010 10:33 pm Naslov sporočila: |
|
|
Ok. |
|
Nazaj na vrh |
|
 |
bray Član


Pridružen-a: Sre 19 Jan 2005 23:53 Prispevkov: 327 Aktiv.: 1.38 Kraj: Vransko
|
Objavljeno: Sre Okt 20, 2010 4:37 pm Naslov sporočila: |
|
|
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 |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.03 Kraj: Novo mesto
|
Objavljeno: Sre Okt 20, 2010 5:02 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|