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

 
 
> Порт Cortex-R4, Попытка реализации
Legath
сообщение Jan 19 2017, 15:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 30-12-10
Из: Рязань
Пользователь №: 61 958



Всем доброго дня.
Пытаюсь сделать порт для 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Legath
сообщение Jan 20 2017, 16:55
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 30-12-10
Из: Рязань
Пользователь №: 61 958



Добавил в линковку
Код
  /* The program code and other data goes into RAM */
  .text :
  {

        __ctors_start = .;
        KEEP(SORT(*)(.init_array))  /* eabi uses .init_array for static constructor lists */
        __ctors_end = .;

        __dtors_start = .;
        __dtors_end = .;

    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >FLASH



и перед вызовом main в аналоге reset handler
Код
        extern uint32 __ctors_start, __ctors_end;
    void(* const *ctor)();
    for( ctor = __ctors_start; ctor < __ctors_end; )
            (*ctor++)();


Все равно очень далеко указывает R0 указывает. Видимо я еще что то не учел.

Сообщение отредактировал Legath - Jan 20 2017, 16:56
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 22 2017, 08:08
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (Legath @ Jan 20 2017, 23:55) *
и перед вызовом main в аналоге reset handler
CODE
        extern uint32 __ctors_start, __ctors_end;
    void(* const *ctor)();
    for( ctor = __ctors_start; ctor < __ctors_end; )
            (*ctor++)();


Все равно очень далеко указывает R0 указывает. Видимо я еще что то не учел.

В gcc'шной библиотеке есть специальная функция для прогона ctor loop: ___libc_init_array.

Вообще, стартап к кортексов может быть очень простым.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Legath
сообщение Jan 22 2017, 22:29
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 30-12-10
Из: Рязань
Пользователь №: 61 958



Цитата(dxp @ Jan 22 2017, 11:08) *
В gcc'шной библиотеке есть специальная функция для прогона ctor loop: ___libc_init_array.

Вообще, стартап к кортексов может быть очень простым.


Да там это все safety проверки. На данном этапе проекта если их все закомментировать ничего не изменится. Попробую ___libc_init_array ибо ни один из бряков в конструкторах не сработал снова.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 23 2017, 05:20
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (Legath @ Jan 23 2017, 05:29) *
Да там это все safety проверки.


Не помню там таких проверок. Код функции:
CODE

/*
* Copyright © 2004 CodeSourcery, LLC
*
* Permission to use, copy, modify, and distribute this file
* for any purpose is hereby granted without fee, provided that
* the above copyright notice and this notice appears in all
* copies.
*
* This file is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

/* Handle ELF .{pre_init,init,fini}_array sections. */
#include <sys/types.h>

#ifdef HAVE_INITFINI_ARRAY

/* These magic symbols are provided by the linker. */
extern void (*__preinit_array_start []) (void) __attribute__((weak));
extern void (*__preinit_array_end []) (void) __attribute__((weak));
extern void (*__init_array_start []) (void) __attribute__((weak));
extern void (*__init_array_end []) (void) __attribute__((weak));

extern void _init (void);

/* Iterate over all the init routines. */
void
__libc_init_array (void)
{
size_t count;
size_t i;

count = __preinit_array_end - __preinit_array_start;
for (i = 0; i < count; i++)
__preinit_array_start[i] ();

_init ();

count = __init_array_end - __init_array_start;
for (i = 0; i < count; i++)
__init_array_start[i] ();
}
#endif


QUOTE (Legath @ Jan 23 2017, 05:29) *
На данном этапе проекта если их все закомментировать ничего не изменится. Попробую ___libc_init_array ибо ни один из бряков в конструкторах не сработал снова.

А если отладчиком это место по шагам пройти и посмотреть, вызываются ли конструкторы? И если нет, то почему. Если в линкерном скрипте символы (секций) указаны правильно, то не работать, вроде, нечему.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Legath   Порт Cortex-R4   Jan 19 2017, 15:22
- - Сергей Борщ   QUOTE (Legath @ Jan 19 2017, 17:22) Пытаю...   Jan 20 2017, 06:18
|- - Legath   Цитата(Сергей Борщ @ Jan 20 2017, 09:18) ...   Jan 20 2017, 08:49
|- - Сергей Борщ   QUOTE (Legath @ Jan 20 2017, 10:49) corte...   Jan 20 2017, 09:21
- - Legath   Цитата(Сергей Борщ @ Jan 20 2017, 12:21) ...   Jan 20 2017, 11:30
|- - Сергей Борщ   QUOTE (Legath @ Jan 20 2017, 13:30) Подоз...   Jan 20 2017, 11:45
|- - Сергей Борщ   QUOTE (Legath @ Jan 20 2017, 13:30) тесто...   Jan 20 2017, 18:24
|- - Legath   Цитата(Сергей Борщ @ Jan 20 2017, 21:24) ...   Jan 20 2017, 20:55
|- - Сергей Борщ   QUOTE (Legath @ Jan 20 2017, 22:55) -O0 ,...   Jan 20 2017, 21:37
|- - AHTOXA   Цитата(Legath @ Jan 20 2017, 21:55) и пер...   Jan 20 2017, 18:56
|- - AHTOXA   Цитата(Legath @ Jan 23 2017, 03:29) Да та...   Jan 23 2017, 06:15
- - Сергей Борщ   да, точно. У меня-то они объявлены как CODEextern ...   Jan 20 2017, 20:42
- - Legath   Файлы ccs7 архивировал. код инициализации я вставл...   Jan 20 2017, 21:44
- - Legath   Все оказалось намного проще. порт arm7 полность по...   Mar 16 2017, 17:17


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 03:56
Рейтинг@Mail.ru


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