uriy 4 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Перетаскиваю старый проект из 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 2 31 января, 2020 Опубликовано 31 января, 2020 (изменено) · Жалоба синтаксис комментариев и директив разный, надо подправить руками, например комментарии: // 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 Изменено 31 января, 2020 пользователем gridinp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Круто! Спасибо! Пошло дело! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 61 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Подозреваю, что процессор работает во вполне определенном режиме, поэтому всякие if THUMB ('[ THUMB'...) можно просто сократить за ненадобностью. INT_Base_Initialize переносится один в один, INT_C_Memory_Initialize проще выбросить и переделать. Ну и попутно скрипт линкера править. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 31 января, 2020 Опубликовано 31 января, 2020 (изменено) · Жалоба Стартап можно и на C написать - не нужно будет с ассемблером мучиться... Посмотрите, как сделано в opencm3. Может там и под ваш камень стартап готовый есть... Изменено 31 января, 2020 пользователем Eddy_Em Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Мне лучше в текущих файлах минимум переделок сделать. Боюсь при переносе на Си я еще больше косяков наделаю. Есть еще ассемблерные файлы. Не понимаю что в следующих строках означают записи |C$$data| и |x$dataseg| и на что это заменить. Как-будто это какие-то переменные. Нигде в проекте по таким именам они больше не встречаются. AREA |C$$data|,DATA |x$dataseg| EXPORT TCT_System_Limit TCT_System_Limit DCD &00000000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Извините, но вы занимаетесь ерундой. Нет смысла переводить этот startup.s. Дело в том, что вы меняете не только компилятор, но и CLib. Она требует другого стартапа. В нём будет инициализация глобальных сущностей. Найдите в сети стартап для вашего процессора, лучше на С, это будет правильней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 61 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Не понимаю что в следующих строках означают записи |C$$data| и |x$dataseg| и на что это заменить. Названия секций. Могут использоваться в скрипте линкера по wildcard (например, *$$data). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба 1 час назад, Eddy_Em сказал: Посмотрите, как сделано в opencm3. Может там и под ваш камень стартап готовый есть ARM926 это даже близко не Cortex, там всё по другому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба 14 минут назад, VladislavS сказал: там всё по другому. Я тоже начал писать подобный комментарий, но в процессе подумал, что там по-другому только вектора прерываний и присваивание начальных значений указателям стека. Эту часть без ассемблера не сделать. Все остальное, собственно сам cstartup, отличаться не должно и может быть написано на Сях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба 12 минут назад, Сергей Борщ сказал: Эту часть без ассемблера не сделать. Есть интринсики. Но вообще это не самоцель. Если понимаешь что делаешь, то всё равно на чём. Самое простое, как мне кажется, будет заглянуть на сайт производителя чипа, скачать какой-нибудь "Привет, мир!" для GCC и вытащить оттуда стартап. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Ну, не знаю.. По крайней мере, для кортексов вообще ничего нет на ассемблере: весь стартап чисто сишный, даже ассемблерных вставок нет. А определение секций происходит в линкере, например: 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 } }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба 5 минут назад, Eddy_Em сказал: Ну, не знаю.. Не лезь сюда с кортексами, раз не знаешь. Там нужно как минимум задать три стека переключаясь между разными режимами. И ещё много чего с FPU, MMU, кэшами и прочей муйнёй. Лучше (даже единственно верно) делать это так как принято в тулчейне. Иначе не взлетит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба 6 hours ago, uriy said: Процессор arm926ej-s. Для этих ARM9 (например, от Atmel) есть (был) linux, который стартовал из U-boot. Может, имеет смысл посмотреть, что и как инициализировалось U-boot'ом. Сам за давностью не помню как стартовал AT91S9260, точно было два загрузчика (маленький для U-boot и собственно U-boot) и точно нужна была какая-то определенная версия gcc, чтобы все влезло в допустимые объемы памяти для загрузчиков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 31 января, 2020 Опубликовано 31 января, 2020 · Жалоба Не надо ничего усложнять. Надо просто взять правильный стартап от своего процессора и тулчейна и всё. С этого обычно начинается любой новый проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться