|
|
  |
Приложение и бутлоадер |
|
|
|
Nov 30 2011, 17:55
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Прошу прощения, если снова баян, но...  С бутом все понятно. Механизм запуска, шифрования, прошивания приложения, передачи ему управления и т.д. - все продумано Никак не пойму, как собирать приложение С обычным стартапом? Но там в начале по-любому будут вектора прерываний (хоть и расположены будут в регионе, отличном от ресета) Зачем они приложению? Ведь можно, если нужно, в самом начале приложения поменять это все на свое Стек - бут инициализирует стеки под себя. Теоретически, в той же инициализации приложения можно их переопределить под себя (а можно ли?) RAM, который использует бут. Ведь после перехода на приложение, оно ему (буту) уже не нужно, и все можно разруливать приложению, где и что хранить? С другой стороны, если приложение использует экспортируемые функции бута, стек этим функциям тоже нужен? Какой? приложения или бута? В общем, копаю поиск уже не один час, но понимания картины в целом нет. Есть только множество вариантов, как сделать бут, и не нашел ни одного, как правильно собрать приложение под бут...
|
|
|
|
|
Nov 30 2011, 19:45
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(aaarrr @ Nov 30 2011, 23:33)  Если используются вектора бута, то добавлять их в стартап приложения смысла нет. Стек переопределять однозначно. Экспортируемым функциям все равно, "чей" он. ну это я примерно так и представлял вопрос вот в чем: startup.s CODE ;/***************************************************************************** ;* startup.s: Startup file for Philips LPC29xx Family Microprocessors ;* ;* Copyright© 2007, NXP Semiconductor ;* All rights reserved. ;* ;* History ;* 2007.09.01 ver 1.00 Prelimnary version, first Release ;* ;*****************************************************************************/
PRESERVE8
; ARM - CP15 c1 Control Register DTCM_enabled EQU 1<<2 ; Data TCM ITCM_enabled EQU 1<<12 ; Instruction TCM WB_enabled EQU 1<<3 ; Write Buffer
;define the stack size SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 0 IRQ_STACK_LEGTH EQU 32 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0
I_BIT EQU 0x80 F_BIT EQU 0x40
USR32Mode EQU 0x10 SVC32Mode EQU 0x13 SYS32Mode EQU 0x1F IRQ32Mode EQU 0x12 FIQ32Mode EQU 0x11 ABT32Mode EQU 0x17 UDF32Mode EQU 0x1B
;The imported labels
IMPORT IRQ_Exception ; IRQ interrupt handler IMPORT FIQ_Exception ; Fast interrupt exceptions handler IMPORT IRQ_VectorTable IMPORT FIQ_VectorTable IMPORT __main ; The entry point to the main function IMPORT VectorRemap IMPORT TargetResetInit ; initialize the target board IMPORT Get_RGU_Status IMPORT Get_RGU_SRC_Status IMPORT SWI_Handler ; SWI handler from swi_handler.s IMPORT Release_Security
;The exported labels EXPORT bottom_of_heap EXPORT StackUsr EXPORT Reset EXPORT __user_initial_stackheap CODE32
AREA Reset,CODE,READONLY ENTRY
;interrupt vectors ResetStart LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr LDR PC, ReservedAddr LDR PC, IRQ_Addr LDR PC, FIQ_Addr
ResetAddr DCD ResetInit UndefinedAddr DCD Undefined_Handler SWI_Addr DCD SWI_Handler PrefetchAddr DCD Prefetch_Handler DataAbortAddr DCD DataAbort_Handler ReservedAddr DCD Reserved_Handler IRQ_Addr DCD IRQ_Exception FIQ_Addr DCD FIQ_Exception
Undefined_Handler B Undefined_Handler
Reserved_Handler B Reserved_Handler
Prefetch_Handler B Prefetch_Handler
DataAbort_Handler B DataAbort_Handler
;SWI_Handler B SWI_Handler
;***************************************************************************** ;* Initialize the stacks * ;* Function : void InitStack(void) * ;* Parameters * ;* input : None * ;* output : None * ;***************************************************************************** InitStack MOV R0, LR ;Build the SVC stack MSR CPSR_c, #SVC32Mode :OR: I_BIT :OR: F_BIT LDR SP, StackSvc ;Build the IRQ stack MSR CPSR_c, #IRQ32Mode :OR: I_BIT :OR: F_BIT LDR SP, StackIrq ;Build the FIQ stack MSR CPSR_c, #FIQ32Mode :OR: I_BIT :OR: F_BIT LDR SP, StackFiq ;Build the DATAABORT stack MSR CPSR_c, #ABT32Mode :OR: I_BIT :OR: F_BIT LDR SP, StackAbt ;Build the UDF stack MSR CPSR_c, #UDF32Mode :OR: I_BIT :OR: F_BIT LDR SP, StackUnd ;Build the SYS stack MSR CPSR_c, #SYS32Mode :OR: I_BIT :OR: F_BIT LDR SP, =StackUsr MSR CPSR_c, #SYS32Mode BX R0
;****************************************************************************** ;* Reset Entry * ;* Function : void ResetInit(void) * ;* Parameters * ;* input : None * ;* output : None * ;****************************************************************************** ResetInit
BL Release_Security ; write 1 to 0xe0001b00 to release security
; Setup Interrupt INT_VECTOR_1 Table Address
;INT_VECTOR_1 EQU 0xFFFFF104 ; INT_VECTOR_1 Address ; LDR R0, =INT_VECTOR_1 ; LDR R1, =IRQ_VectorTable ; STR R1, [R0, #0]
; Set global core configurations ; MRC p15, 0, r4, c1, c0, 0 ; Read CP15 ; ORR r4, r4, #DTCM_enabled ; Enable Data TCM ; At power up, the interrupt vector is mapped to addr. 0 already, ; enabling instruction TCM will wipe out the mirror of the ; vector table. A remap will be performed there after. */ ; ORR r4, r4, #ITCM_enabled ; Enable Instruction TCM ; ORR r4, r4, #WB_enabled ; Enable Write Buffer ; MCR p15, 0, r4, c1, c0, 0 ; Write CP15
BL InitStack ;Initialize the stack ; BL VectorRemap
; below two lines are for RGU test only ;BL Get_RGU_Status ;BL Get_RGU_SRC_Status BL TargetResetInit ;Initialize the target board ;Jump to the entry point of C program
LDR R0, = __main BX R0
; B __main
;****************************************************************************** ;* Initialize the function library stacks and heaps, can't be * ;* deleted * ;* Function : void __user_initial_stackheap(void) * ;* Parameters * ;* input : None * ;* output : None * ;****************************************************************************** __user_initial_stackheap LDR r0, =bottom_of_heap BX lr StackSvc DCD SvcStackSpace; + (SVC_STACK_LEGTH - 1)* 4 StackIrq DCD IrqStackSpace; + (IRQ_STACK_LEGTH - 1)* 4 StackFiq DCD FiqStackSpace; + (FIQ_STACK_LEGTH - 1)* 4 StackAbt DCD AbtStackSpace; + (ABT_STACK_LEGTH - 1)* 4 StackUnd DCD UndStackSpace; + (UND_STACK_LEGTH - 1)* 4 AREA MyStacks, DATA, NOINIT, ALIGN=2 SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for ADMIN Mode IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for IRQ Mode FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for FIQ Mode AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for ABORT Mode UndStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for UNDEF Mode
AREA Heap, DATA, NOINIT bottom_of_heap SPACE 1
AREA Stacks, DATA, NOINIT StackUsr SPACE 1
END
;/***************************************************************************** ;** End Of File ;*****************************************************************************/
мне ведь область Код AREA Reset,CODE,READONLY ENTRY не нужна? InitStack я аналогично сделаю в приложении и просто вызову функцию? Кстати, можно это сделать не на асме, а С? Определив массивы под это дело и как-то сями обойтись.. или только асм с экспортом оттуда и импортом тех же массивов?
|
|
|
|
|
Nov 30 2011, 19:50
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(toweroff @ Nov 30 2011, 23:45)  мне ведь область Код AREA Reset,CODE,READONLY ENTRY не нужна? Нужна, потому что Цитата(toweroff @ Nov 30 2011, 23:45)  Кстати, можно это сделать не на асме, а С? Определив массивы под это дело и как-то сями обойтись.. или только асм с экспортом оттуда и импортом тех же массивов? Не позволит кейл трогать SP в C.
|
|
|
|
|
Nov 30 2011, 20:34
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(aaarrr @ Dec 1 2011, 00:15)  Нет. Точкой входа должен быть библиотечный __main, а не ваш main. ок что дальше? адрес таблицы векторов бута знаю. Могу переопределить, если нужно переопределяю стеки (вроде как нет жесткой привязанности к месту в коде где это нужно делать, но, наверное, до вызова первой функции) все?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|