Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Компиляция gnu c в uVision3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
EKirshin
Здравствуйте!

Использую STR912FW44, пакет разработки KEIL, плата MCBSTR9

У меня такая проблема:

Хочется написать программу для USB. Скомпилировать пример джойстика не удаётся по причине ограничения 16кб линкера (никто, случаем лекарства не подкинет?). Поэтому хочу скомпилировать средствами gnu, зашить во внутреннюю флэш и запустить отладку - всё средствами uVision3. Откомпилиорвать удалось после переписания файла startup (насколько верно, сомневаюсь). Создаётся файл elf. Потом пытаюсь загружать его во флэш из uVision3. Выдаёт ошибку Incorrect line... (что-то типа этого - точно не помню).

Нет ли у кого примера стартап-файла для компиляции с использованием gnu?
И, кстати, в тестовых программках keil'a есть файлик retarget.c. Без него примеры не работают. Зачем он нужен, не поясните? В хелпе написано как-то невразумительно: для перенаправления каких-то потоков...
jorikdima
ой как не спец в этих делах, но предположу следующее:
ELF предназначен не для заливки во флэш, а для отладки. Фо флешь надо бинарник грузить. Как его получить? Есть утилиты специальные вроде, может даже с кейлом идут
Andy Great
Какая версия Кейла, какая ГЦЦ, какой адаптер, какие ключи компиляции?
yaghtn
Цитата(EKirshin @ Oct 2 2006, 20:25) *
Нет ли у кого примера стартап-файла для компиляции с использованием gnu?


Startup лежат в папке самого uVision ( \ARM\GNU\Startup )
При создании нового проекта, стартап для выбранного тулчейна автоматически добавляется.
(не для всех. Например, для philips - добавляет, но для ST - нет)
alogvinov
Цитата(jorikdima @ Oct 2 2006, 21:51) *
ой как не спец в этих делах, но предположу следующее:
ELF предназначен не для заливки во флэш, а для отладки. Фо флешь надо бинарник грузить. Как его получить? Есть утилиты специальные вроде, может даже с кейлом идут


Бинарник из .elf получается следующим образом:
arm-elf-objcopy -O binary file.elf file.bin

Возможно, что префикс утилиты objcopy будет отличаться от arm-elf- .
почемучка
Цитата(jorikdima @ Oct 2 2006, 21:51) *
ой как не спец в этих делах, но предположу следующее:
ELF предназначен не для заливки во флэш, а для отладки. Фо флешь надо бинарник грузить. Как его получить? Есть утилиты специальные вроде, может даже с кейлом идут

Преобразование arm-elf в bin можно сделать в оболочке bash или в linux с помощью команды arm-elf-objcopy:
arm-elf-objcopy -O binary program program.bin
где program - исходный elf program.bin - выходной bin
jorikdima
Вообще у меня это был реторический вопрос smile.gifsmile.gif
Но все равно спасибо.
Костян
Цитата(jorikdima @ Oct 2 2006, 15:51) *
ой как не спец в этих делах, но предположу следующее:
ELF предназначен не для заливки во флэш, а для отладки. Фо флешь надо бинарник грузить.

Все верно , только как дополнение во флэш можно грузить и hex , т.к keil не создает бинарники автоматом (хотя есть на официальном сайте утилита hex2bin -- кажется так называетя).
EKirshin
Цитата(yaghtn @ Oct 3 2006, 13:43) *
Цитата(EKirshin @ Oct 2 2006, 20:25) *

Нет ли у кого примера стартап-файла для компиляции с использованием gnu?


Startup лежат в папке самого uVision ( \ARM\GNU\Startup )
При создании нового проекта, стартап для выбранного тулчейна автоматически добавляется.
(не для всех. Например, для philips - добавляет, но для ST - нет)


У меня uVision3, из комплекта разработки Keil с платой MCBSTR9. Адаптер ULINK. В папке \ARM\GNU\Startup файлов для ST нет. Если у кого-нибудь есть - пришлите, пожалуйста.
И где можно почитать о формате этих файлов. В частности, как размещать секции кода, стэка, ... Синтаксис вообще.
И еще интересует, где можно взять докуметацию на гнушный ассемблер.
yaghtn
Доки на gnu есть в uV. Меню "help/Open Books Window".
На синтаксис ассемблера и файла скрипта линкера(*.ld) можно посмотреть в кейловских файлах примеров для других eval-платок. В uV для ST мало чего есть. Есть пример для stR7, но он не под гну.

В доке http://www.at91.com/thirdparty/j_lynch/jlynch.pdf, всего кроме прочего, подробно расписано что должно быть в startup и *.ld - файлах.



Кстати, если хотите использовать в кейле gnu только по причине ограничения 16к, то быть может, легче будет побороть это ограничение и пользовать RealView тулчейн?
Andy Great
Прям сейчас глянул: в симулятор загружается ELF, скомпилированный GNUARM 4.1.0, без всяких хексов. Должен грузиться и через УЛинк. Какие версии продуктов, повторно спрашиваю?
VAI
с другой стороны, человек еще спрашивал о лекарстве, это здесь
http://caxapa.ru/arm.html?id=64525
EKirshin
Цитата(Andy Great @ Oct 4 2006, 11:38) *
Прям сейчас глянул: в симулятор загружается ELF, скомпилированный GNUARM 4.1.0, без всяких хексов. Должен грузиться и через УЛинк. Какие версии продуктов, повторно спрашиваю?


uVision 3.31
BinUtils V2.14
GCC V3.3.1
uClibc V0.9.20
Cygwin DLL V1.3.22

Compiler control string:
-c -mcpu=arm7tdmi -gdwarf-2 -MD -Wall -O -mapcs-frame -mthumb-interwork -IC:\Keil\ARM\INC\ST\91x\ -o *.o

Assembler control string:
-m arm7tdmi -gdwarf2 -mthumb-interwork --MD *.d -IC:\Keil\ARM\INC\ST\91x\ -o *.o

Почему “arm7tdmi”, если у меня АРМ9? И где можно это изменить, если необходимо?

Linker control string:
-mthumb-interwork -Wl -o USB_HID.elf
*.o -nostartfiles -lm
Andy Great
А ошибка какая? Попробуйте скомпилировать для ARM7 тестовые примеры и загрузить их в симулятор. Не уверен, гляну дома, может быть в той версии ГЦЦ нет поддержки ARM9?
yaghtn
Поддержка arm9 компилятором не нужна. Из даташита: "The ARM966E-S core is binary compatible with 32-bit ARM7 code and 16-bit Thumb code".
Так что arm7tdmi - нормально.

Я бы сначала попробовал откомпилить и отладить в RAM простенький проект, состоящий из стартапа и бесконечного цикла в main().

PS Я недопонял, что имеется в виду под словами "загрузить во флеш"?
Пункт меню "Flash/Download" или пункт "Debug/Start-Stop Debug session"?
Andy Great
Цитата
Откомпилиорвать удалось после переписания файла startup (насколько верно, сомневаюсь). Создаётся файл elf. Потом пытаюсь загружать его во флэш из uVision3. Выдаёт ошибку Incorrect line... (что-то типа этого - точно не помню).

Ха, щас глянул - эта ошибка пофиксена в 3.02. Качайте обновления.
klen
Цитата(Andy Great @ Oct 4 2006, 17:00) *
А ошибка какая? Попробуйте скомпилировать для ARM7 тестовые примеры и загрузить их в симулятор. Не уверен, гляну дома, может быть в той версии ГЦЦ нет поддержки ARM9?


Ну как это не поддержывает. Не нада грязи smile.gif Вот что с третей версии вроде поддерживается.
Код
ARM_CORE("arm2",   arm2,    2,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm250", arm250,    2,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm3",   arm3,    2,    FL_CO_PROC | FL_MODE26, slowmul)

/* V3 Architecture Processors */
ARM_CORE("arm6",          arm6,        3,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm60",         arm60,    3,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm600",        arm600,    3,    FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm610",        arm610,    3,                 FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm620",        arm620,    3,    FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm7",          arm7,        3,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm7d",         arm7d,    3,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm7di",        arm7di,    3,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm70",         arm70,    3,    FL_CO_PROC | FL_MODE26, slowmul)
ARM_CORE("arm700",        arm700,    3,    FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm700i",       arm700i,    3,    FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm710",        arm710,    3,                 FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm720",        arm720,    3,                 FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm710c",       arm710c,    3,                 FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm7100",       arm7100,    3,                 FL_MODE26 | FL_WBUF, slowmul)
ARM_CORE("arm7500",       arm7500,    3,                 FL_MODE26 | FL_WBUF, slowmul)
/* Doesn't have an external co-proc, but does have embedded fpa.  */
ARM_CORE("arm7500fe",     arm7500fe,    3,    FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)

/* V3M Architecture Processors */
/* arm7m doesn't exist on its own, but only with D, ("and", and I), but
   those don't alter the code, so arm7m is sometimes used.  */
ARM_CORE("arm7m",         arm7m,    3M,    FL_CO_PROC | FL_MODE26, fastmul)
ARM_CORE("arm7dm",        arm7dm,    3M,    FL_CO_PROC | FL_MODE26, fastmul)
ARM_CORE("arm7dmi",       arm7dmi,    3M,    FL_CO_PROC | FL_MODE26, fastmul)

/* V4 Architecture Processors */
ARM_CORE("arm8",          arm8,        4,                 FL_MODE26 | FL_LDSCHED, fastmul)
ARM_CORE("arm810",        arm810,    4,                 FL_MODE26 | FL_LDSCHED, fastmul)
ARM_CORE("strongarm",     strongarm,    4,                 FL_MODE26 | FL_LDSCHED | FL_STRONG, fastmul)
ARM_CORE("strongarm110",  strongarm110,    4,                 FL_MODE26 | FL_LDSCHED | FL_STRONG, fastmul)
ARM_CORE("strongarm1100", strongarm1100, 4,                 FL_MODE26 | FL_LDSCHED | FL_STRONG, fastmul)
ARM_CORE("strongarm1110", strongarm1110, 4,                 FL_MODE26 | FL_LDSCHED | FL_STRONG, fastmul)

/* V4T Architecture Processors */
ARM_CORE("arm7tdmi",      arm7tdmi,    4T,    FL_CO_PROC          , fastmul)
ARM_CORE("arm7tdmi-s",    arm7tdmis,    4T,    FL_CO_PROC          , fastmul)
ARM_CORE("arm710t",       arm710t,    4T,                 FL_WBUF, fastmul)
ARM_CORE("arm720t",       arm720t,    4T,                 FL_WBUF, fastmul)
ARM_CORE("arm740t",       arm740t,    4T,                 FL_WBUF, fastmul)
ARM_CORE("arm9",          arm9,        4T,                             FL_LDSCHED, fastmul)
ARM_CORE("arm9tdmi",      arm9tdmi,    4T,                             FL_LDSCHED, fastmul)
ARM_CORE("arm920",        arm920,    4T,                             FL_LDSCHED, fastmul)
ARM_CORE("arm920t",       arm920t,    4T,                             FL_LDSCHED, fastmul)
ARM_CORE("arm922t",       arm922t,    4T,                             FL_LDSCHED, fastmul)
ARM_CORE("arm940t",       arm940t,    4T,                             FL_LDSCHED, fastmul)
ARM_CORE("ep9312",        ep9312,    4T,                             FL_LDSCHED |             FL_CIRRUS, fastmul)

/* V5T Architecture Processors */
ARM_CORE("arm10tdmi",     arm10tdmi,    5T,                             FL_LDSCHED, fastmul)
ARM_CORE("arm1020t",      arm1020t,    5T,                             FL_LDSCHED, fastmul)

/* V5TE Architecture Processors */
ARM_CORE("arm9e",         arm9e,    5TE,                             FL_LDSCHED, 9e)
ARM_CORE("arm946e-s",     arm946es,    5TE,                             FL_LDSCHED, 9e)
ARM_CORE("arm966e-s",     arm966es,    5TE,                             FL_LDSCHED, 9e)
ARM_CORE("arm968e-s",     arm968es,    5TE,                             FL_LDSCHED, 9e)
ARM_CORE("arm10e",        arm10e,    5TE,                 FL_LDSCHED, fastmul)
ARM_CORE("arm1020e",      arm1020e,    5TE,                 FL_LDSCHED, fastmul)
ARM_CORE("arm1022e",      arm1022e,    5TE,                 FL_LDSCHED, fastmul)
ARM_CORE("xscale",        xscale,    5TE,                             FL_LDSCHED | FL_STRONG | FL_XSCALE, xscale)
ARM_CORE("iwmmxt",        iwmmxt,    5TE,                             FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT, xscale)

/* V5TEJ Architecture Processors */
ARM_CORE("arm926ej-s",    arm926ejs,    5TEJ,                             FL_LDSCHED, 9e)
ARM_CORE("arm1026ej-s",   arm1026ejs,    5TEJ,                             FL_LDSCHED, 9e)

/* V6 Architecture Processors */
ARM_CORE("arm1136j-s",    arm1136js,    6J,                             FL_LDSCHED, 9e)
ARM_CORE("arm1136jf-s",   arm1136jfs,    6J,                             FL_LDSCHED | FL_VFPV2, 9e)
ARM_CORE("arm1176jz-s",      arm1176jzs,    6ZK,                 FL_LDSCHED, 9e)
ARM_CORE("arm1176jzf-s",  arm1176jzfs,    6ZK,                 FL_LDSCHED | FL_VFPV2, 9e)
ARM_CORE("mpcorenovfp",      mpcorenovfp,    6K,                 FL_LDSCHED, 9e)
ARM_CORE("mpcore",      mpcore,    6K,                 FL_LDSCHED | FL_VFPV2, 9e)
Andy Great
Я имел в виду версию 3.31, поставляемую Кейлом. Зная любовь некоторых товарищей к оптимизации (ГЦЦ для х86, АРМ, АВР и т.д., урезанные в части целевых платформ) я предположил такую возможность.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.