Цитата
Режимы работы как правило инициализируются в самом загружаемом модуле. То есть типичный скрипт для запуска содержит
строчки где 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 оказывается размещенным по этому адресу)?