Всем доброго дня.
Пытаюсь сделать порт для Cortex R4F (чип RM46L852). Компилятор gcc 5.4.1.
Использую схему с программным прерыванием. Но возникает проблема в реализации функции os_start
По примеру порта ARM7
сделал ассемблерный файл со следующий содержимым (подсматривал в других ОСРВ)
Код
.set SYS_MODE, 0x1f
.set SVC_MODE, 0x13
.set IRQ_MODE, 0x12
.set STUB, 0x00
.global context_restore
context_restore: // os_start() passes New_SP in R0
CPS #SYS_MODE
LDR R1, [R0]
LDR SP, [R1]
/* Restore the floating point context, if any. */
POPNE {R0}
VPOPNE {D0-D15}
VMSRNE FPSCR, R0
/* Restore all system mode registers other than the SP (which is already
being used). */
POP {R0-R12, R14}
/* Return to the task code, loading CPSR on the way. */
RFEIA sp!
в отладчике штатно дохожу до строки
Код
LDR R1, [R0]
и при ее выполнении процессор улетает в dabort handler. Это означает что инструкция обратилась к данным с которыми проблема.
Подскажите пожалуйста в какую сторону начать поиски. у меня подозрение что я что то неверно делаю с заготовкой стека.
Код
void TBaseProcess::init_stack_frame( stack_item_t * Stack
, void (*exec)()
#if scmRTOS_DEBUG_ENABLE == 1
, stack_item_t * StackBegin
#endif
)
{
*Stack = ( stack_item_t ) NULL;
Stack--;
*Stack = ( stack_item_t ) NULL;
Stack--;
*Stack = ( stack_item_t ) NULL;
Stack--;
*Stack = ( stack_item_t ) 0x1f;;
if((uintptr_t)exec & (0x01UL)) {
*Stack = *Stack | 0x20;
}
Stack--;
*Stack = reinterpret_cast<stack_item_t>(exec);;
Stack--;
*Stack = ( stack_item_t ) 0; /* R14 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R12 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R11 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R10 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R9 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R8 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R7 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R6 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R5 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R4 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R3 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R2 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R1 */
Stack--;
*Stack = ( stack_item_t ) 0; /* R0 */
Stack--;
*Stack = ( uint32_t ) 0;
Stack--;
*Stack = ( stack_item_t ) 0;
}
Это точно не MPU, я его отключал.
ADD:
в этот момент в R0 содержится значение 0xea006068 , память по этому адресу просмотреть нельзя.
Прошу сильно не пинать. Процессор для меня новый.
Сообщение отредактировал Legath - Jan 19 2017, 16:32