реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Приложение и бутлоадер
toweroff
сообщение Nov 30 2011, 17:55
Сообщение #1


Гуру
******

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



Прошу прощения, если снова баян, но... sm.gif

С бутом все понятно. Механизм запуска, шифрования, прошивания приложения, передачи ему управления и т.д. - все продумано

Никак не пойму, как собирать приложение

С обычным стартапом? Но там в начале по-любому будут вектора прерываний (хоть и расположены будут в регионе, отличном от ресета)
Зачем они приложению? Ведь можно, если нужно, в самом начале приложения поменять это все на свое

Стек - бут инициализирует стеки под себя. Теоретически, в той же инициализации приложения можно их переопределить под себя (а можно ли?)

RAM, который использует бут. Ведь после перехода на приложение, оно ему (буту) уже не нужно, и все можно разруливать приложению, где и что хранить?
С другой стороны, если приложение использует экспортируемые функции бута, стек этим функциям тоже нужен? Какой? приложения или бута?

В общем, копаю поиск уже не один час, но понимания картины в целом нет. Есть только множество вариантов, как сделать бут, и не нашел ни одного, как правильно собрать приложение под бут...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2011, 19:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Если используются вектора бута, то добавлять их в стартап приложения смысла нет.
Стек переопределять однозначно. Экспортируемым функциям все равно, "чей" он.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 30 2011, 19:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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 я аналогично сделаю в приложении и просто вызову функцию?

Кстати, можно это сделать не на асме, а С?
Определив массивы под это дело и как-то сями обойтись.. или только асм с экспортом оттуда и импортом тех же массивов?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2011, 19:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 30 2011, 20:03
Сообщение #5


Гуру
******

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



так я ж в любом случае определяю ENTRY_POINT как main() приложения?

или нет?

вот этот начальный механизм интересен. Как оно должно правильно быть в приложении, в какой последовательности, после передачи бутом управления посредством call_application_entry() или что-то типа такого
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2011, 20:15
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(toweroff @ Dec 1 2011, 00:03) *
или нет?

Нет. Точкой входа должен быть библиотечный __main, а не ваш main.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 30 2011, 20:34
Сообщение #7


Гуру
******

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



Цитата(aaarrr @ Dec 1 2011, 00:15) *
Нет. Точкой входа должен быть библиотечный __main, а не ваш main.

ок
что дальше?
адрес таблицы векторов бута знаю. Могу переопределить, если нужно
переопределяю стеки (вроде как нет жесткой привязанности к месту в коде где это нужно делать, но, наверное, до вызова первой функции)
все?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2011, 20:40
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Все. То есть минимальный набор в стартапе приложения включает в себя инициализацию стеков и передачу управления на __main.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 30 2011, 20:46
Сообщение #9


Гуру
******

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



Цитата(aaarrr @ Dec 1 2011, 00:40) *
Все. То есть минимальный набор в стартапе приложения включает в себя инициализацию стеков и передачу управления на __main.

вот, что и требовалось sm.gif
спасибо, буду пробовать
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016