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

 
 
> Передача управления из бута в программу, еще раз о старом
toweroff
сообщение Feb 25 2013, 10:57
Сообщение #1


Гуру
******

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



Добрый день

Вот такой вопрос возник. Управление передается через подобный вызов:
Код
void (*Entry_Point)(void);
Entry_Point = (void(*)(void))(USER_CODE);
Entry_Point();

кстати, еще вопрос сразу - для ядра ARM968E-S значение USER_CODE так же будет (REAL_USER_CODE + 1), как и для CM3?

Потом управление передается по адресу, указанному в линкере как ENTRY_POINT
Но вопрос вот какой. При старте процессора, он находится в Supervisor режиме, когда грузит все регистры, а из бута он попадет на точку входа приложения уже в User/System
Или это нормально, или я что-то не понял и проц нужно перед прыжком переводить в Supervisor режим?
Сколько пересмотрел реализаций бутов для ARM7, CM3 - нигде не увидел явной смены режима работы
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SyncLair
сообщение Feb 25 2013, 14:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(toweroff @ Feb 25 2013, 14:57) *
Сколько пересмотрел реализаций бутов для ARM7, CM3 - нигде не увидел явной смены режима работы

Режимы работы как правило инициализируются в самом загружаемом модуле. То есть типичный скрипт для запуска содержит
строчки где CPSR как раз инициализируется.


--------------------
Go to the top of the page
 
+Quote Post
toweroff
сообщение Feb 25 2013, 14:25
Сообщение #3


Гуру
******

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



Цитата
Режимы работы как правило инициализируются в самом загружаемом модуле. То есть типичный скрипт для запуска содержит
строчки где CPSR как раз инициализируется.

ок, согласен. Но бут, как минимум, должен прерывания отключить, если он их использовал
тогда мне непонятен такой момент
На холодном старте проц вычитывает со стартового адреса
Код
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

далее инициализируются стеки (вызывается эта функция):
Код
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


после чего прыгаем на __main

параметр __entry у линкера указывает именно на ResetStart

Так вот. Куда нужно прыгать? На сам ResetStart, или, все-таки, на точку вызова InitStack (точнее, на ResetStart+(4*8), ибо там может быть что-то еще, это у меня сразу стеки инициализируются и вызов InitStack оказывается размещенным по этому адресу)?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- toweroff   Передача управления из бута в программу   Feb 25 2013, 10:57
- - kolobok0   Цитата(toweroff @ Feb 25 2013, 14:57) ......   Feb 25 2013, 13:58
- - esaulenka   Цитата(toweroff @ Feb 25 2013, 14:57) для...   Feb 25 2013, 14:05
|- - toweroff   Цитата(esaulenka @ Feb 25 2013, 18:05) Зн...   Feb 25 2013, 14:10
- - aaarrr   На ResetStart, разумеется: его положение строго фи...   Feb 25 2013, 14:43
|- - toweroff   Цитата(aaarrr @ Feb 25 2013, 18:43) На Re...   Feb 25 2013, 15:07
|- - aaarrr   Цитата(toweroff @ Feb 25 2013, 19:07) Ост...   Feb 25 2013, 15:21
|- - toweroff   Цитата(aaarrr @ Feb 25 2013, 19:21) этот ...   Feb 25 2013, 15:32
- - aaarrr   Вариантов масса: - Использовать п/п загрузчика (в ...   Feb 25 2013, 15:38
- - toweroff   aaarrr, спасибо, пойду разбираться Вот что накопа...   Feb 25 2013, 16:46
- - aaarrr   Выходит, все. Только я бы выделил вектора в отдель...   Feb 25 2013, 16:55
|- - toweroff   Цитата(aaarrr @ Feb 25 2013, 20:55) Выход...   Feb 25 2013, 17:45
|- - aaarrr   Цитата(toweroff @ Feb 25 2013, 21:45) ......   Feb 25 2013, 18:45
- - toweroff   UPD Так, становится понятнее Используются 2 инстр...   Feb 25 2013, 19:26
- - toweroff   aaarrr, посмотрите, пожалуйста, что я понял не так...   Feb 25 2013, 22:15
- - aaarrr   Вариант 2 не годится, т.к. по адресу 0xffff0000 па...   Feb 25 2013, 22:38
- - toweroff   Цитата(aaarrr @ Feb 26 2013, 02:38) Вариа...   Feb 25 2013, 22:58


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

 


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


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