Jump to content

    
uriy

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

Recommended Posts

Перетаскиваю старый проект из 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

Share this post


Link to post
Share on other sites

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

// 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

Edited by gridinp

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Edited by Eddy_Em

Share this post


Link to post
Share on other sites

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

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

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

        EXPORT  TCT_System_Limit
TCT_System_Limit
        DCD     &00000000

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
1 час назад, Eddy_Em сказал:

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

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

Share this post


Link to post
Share on other sites
14 минут назад, VladislavS сказал:

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

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

Share this post


Link to post
Share on other sites
12 минут назад, Сергей Борщ сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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
    }
};

 

Share this post


Link to post
Share on other sites
5 минут назад, Eddy_Em сказал:

Ну, не знаю..

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

Share this post


Link to post
Share on other sites
6 hours ago, uriy said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.