Перейти к содержанию
    

Помогите перетащить проект из ADS в gcc

Перетаскиваю старый проект из ARM Development Studio 1.2  под gcc. Процессор arm926ej-s.

Перенос С файлов идет вполне безболезненно,  нужно только поменять определения структур и ассемблерные вставки.

Уперся в startup файл. Не знаю как за него взяться, с чего начать. Файл приложил. Может у вас есть примеры под этот процессор?

Сейчас при компиляции этого файла появляются такие ошибки:

Assembler messages:
Error: bad instruction `gbll THUMB'
Error: bad instruction `gbll ARM'
Error: junk at end of line, first unrecognized character is `['
Error: bad instruction `thumb SETL{TRUE}'
Error: bad instruction `arm SETL{FALSE}'
Error: bad instruction `if assembling with TASM go into 32 bit mode as the Armulator will'
Error: bad instruction `start up the program in ARM state.'
Error: bad instruction `code32'
Error: junk at end of line, first unrecognized character is `|'

startup.s

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

синтаксис комментариев и директив разный, надо подправить руками, например комментарии:

// If assembled with TASM the variable {CONFIG} will be set to 16
// II assembled with ARMASM the variable {CONFIG} will be set to 32
// Set the variable THUMB to TRUE or false depending on whether the
// file is being assembled with TASM or ARMASM.

О, нашёл: Migrating from armasm to the armclang Integrated Assembler

Изменено пользователем gridinp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подозреваю, что процессор работает во вполне определенном режиме, поэтому всякие if THUMB ('[ THUMB'...) можно просто сократить за ненадобностью.

INT_Base_Initialize переносится один в один, INT_C_Memory_Initialize проще выбросить и переделать. Ну и попутно скрипт линкера править.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стартап можно и на C написать - не нужно будет с ассемблером мучиться...

Посмотрите, как сделано в opencm3. Может там и под ваш камень стартап готовый есть...

Изменено пользователем Eddy_Em

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне лучше в текущих файлах минимум переделок сделать. Боюсь при переносе на Си я еще больше косяков наделаю.

Есть еще ассемблерные файлы. Не понимаю что в следующих строках означают записи |C$$data| и |x$dataseg| и на что это заменить. Как-будто это какие-то переменные. Нигде в проекте по таким именам они больше не встречаются.
 

        AREA |C$$data|,DATA
|x$dataseg|

        EXPORT  TCT_System_Limit
TCT_System_Limit
        DCD     &00000000

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, но вы занимаетесь ерундой. Нет смысла переводить этот startup.s. Дело в том, что вы меняете не только компилятор, но и CLib. Она требует другого стартапа. В нём будет инициализация глобальных сущностей. Найдите в сети стартап для вашего процессора, лучше на С, это будет правильней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понимаю что в следующих строках означают записи |C$$data| и |x$dataseg| и на что это заменить.

Названия секций. Могут использоваться в скрипте линкера по wildcard (например, *$$data).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Eddy_Em сказал:

Посмотрите, как сделано в opencm3. Может там и под ваш камень стартап готовый есть

ARM926 это даже близко не Cortex, там всё по другому.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 минут назад, VladislavS сказал:

там всё по другому.

Я тоже начал писать подобный комментарий, но в процессе подумал, что там по-другому только вектора прерываний и присваивание начальных значений указателям стека. Эту часть без ассемблера не сделать. Все остальное, собственно сам cstartup, отличаться не должно и может быть написано на Сях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, Сергей Борщ сказал:

Эту часть без ассемблера не сделать.

Есть интринсики. Но вообще это не самоцель. Если понимаешь что делаешь, то всё равно на чём.

Самое простое, как мне кажется, будет заглянуть на сайт производителя чипа, скачать какой-нибудь "Привет, мир!" для GCC и вытащить оттуда стартап. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, не знаю.. По крайней мере, для кортексов вообще ничего нет на ассемблере: весь стартап чисто сишный, даже ассемблерных вставок нет.

А определение секций происходит в линкере, например:

PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram));

Вектора прерываний:

typedef struct {
    unsigned int *initial_sp_value; /**< Initial stack pointer value. */
    vector_table_entry_t reset;
    vector_table_entry_t nmi;
    vector_table_entry_t hard_fault;
    vector_table_entry_t memory_manage_fault; /* not in CM0 */
    vector_table_entry_t bus_fault;           /* not in CM0 */
    vector_table_entry_t usage_fault;         /* not in CM0 */
    vector_table_entry_t reserved_x001c[4];
    vector_table_entry_t sv_call;
    vector_table_entry_t debug_monitor;       /* not in CM0 */
    vector_table_entry_t reserved_x0034;
    vector_table_entry_t pend_sv;
    vector_table_entry_t systick;
    vector_table_entry_t irq[NVIC_IRQ_COUNT];
} vector_table_t;

extern unsigned _stack;
    
vector_table_t vector_table __attribute__ ((section(".vector_table"))) = {
    .initial_sp_value = &_stack,
    .reset = reset_handler,
    .nmi = nmi_handler,
    .hard_fault = hard_fault_handler,   
    .sv_call = sv_call_handler,
    .pend_sv = pend_sv_handler,
    .systick = sys_tick_handler,
    .irq = {
        IRQ_HANDLERS
    }
};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Eddy_Em сказал:

Ну, не знаю..

Не лезь сюда с кортексами, раз не знаешь. Там нужно как минимум задать три стека переключаясь между разными режимами. И ещё много чего с FPU, MMU, кэшами и прочей муйнёй. Лучше (даже единственно верно) делать это так как принято в тулчейне. Иначе не взлетит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, uriy said:

Процессор arm926ej-s.

Для этих ARM9 (например, от Atmel) есть (был) linux, который стартовал из U-boot. Может, имеет смысл посмотреть, что и как инициализировалось U-boot'ом. Сам за давностью не помню как стартовал AT91S9260, точно было два загрузчика (маленький для U-boot  и собственно U-boot) и точно нужна была какая-то определенная версия gcc, чтобы все влезло в допустимые объемы памяти для загрузчиков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не надо ничего усложнять. Надо просто взять правильный стартап от своего процессора и тулчейна и всё. С этого обычно начинается любой новый проект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...