Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC препроцессор, Thumb/ARM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Сергей Борщ
Есть некоторая конструкция, которая должна компилиться по-разному в зависимости от того, компилится файл в ARM или THUMB режиме. Надо написать что-то вроде
Код
#if __CPU_MODE__ == 1  // THUMB mode
    *(--StackPointer) =   0x003F;           // SR value: system mode, FIQ & IRQ enabled, THUMB
#else
    *(--StackPointer) =   0x001F;           // SR value: system mode, FIQ & IRQ enabled, ARM
#endif

Понятно, что символ THUMB_MODE можно определить в командной строке gcc, но может быть существует какой-то стандартный символ, который определяет компилятор при запуске с ключем -mthumb? Или если его определять вручную в командной строке, то возможно существует какое-то общепринятое имя для этого символа? Поиск в гугле пока ничего не дал.
axle
Цитата(Сергей Борщ @ Dec 22 2007, 04:07) *
Понятно, что символ THUMB_MODE можно определить в командной строке gcc, но может быть существует какой-то стандартный символ, который определяет компилятор при запуске с ключем -mthumb? Или если его определять вручную в командной строке, то возможно существует какое-то общепринятое имя для этого символа? Поиск в гугле пока ничего не дал.

Можно использовать __THUMB.
Подробнее здесь:
http://h30097.www3.hp.com/demos/ossc/doc/c...bed/embARM.html
Сергей Борщ
Цитата(axle @ Dec 22 2007, 13:33) *
О! Благодарю! То, что нужно!!!
Сергей Борщ
Цитата(Сергей Борщ @ Dec 22 2007, 14:50) *
То, что нужно!!!
Гладко было на бумаге... Похоже, указанные по ссылке символы определены только в упомянутом там пакете GNUPro. В используемом мной Yagarto таких символов не обнаружилось sad.gif В документации к Yagarto об этом тоже тишина. От безысходности и отсутствия интернета начал читать подряд имевшуюся документацию на WinAVR (в комплекте с Yagarto идет документация в форматах .man и .info, а сами man и info отсутствуют). Обнаружил, что если натравить gcc с ключем -dM на заголовочный файл, то генерится какой-то чудовищный бинарник с расширением .gch, в котором редактором видны предопределенные символоы. Таким образом выяснилось, что для -mcpu=arm7tdmi символы __ARM_ARCH_4T__, __ARMEL__, __arm__ предопределены независимо от режима ARM/THUMB, __thumb__, __THUMBEL__ при компиляции с ключем -mthumb и при ключе -mthumb-interwork определяется символ __THUMB_INTERWORK__
Что интересно - при компиляции с тем же -dM не заголовочного файла, а .cpp или .c генерится совсем другой файл .mach, содержимое которого никак не похоже на описанное в документации
Цитата
generate a list of #define directives for all the macros defined during the execution of the preprocessor, including predefined macros

Вдруг кому-то пригодится для поиска других предопределенных символов.
Harbour
gch это precompiled header и к ключу -dM отношения, похоже, не имеет. ключ -dM генерит .mach файлы, полезно разве что для отладки gcc.
klen
Не надо гнать на мой любимй компиллер! необоснованно!

итак имеем:

КЛЮЧИ ПРЕДЕФАЙНЕСЫ

по умолчанию (без ключей) #define __ARMEL__ 1
-marm #define __ARMEL__ 1
-marm -thumb-interwork #define __ARMEL__ 1 #define __THUMB_INTERWORK__ 1
-mthumb #define __ARMEL__ 1 #define __THUMBEL__ 1
-mthumb -thumb-interwork #define __ARMEL__ 1 #define __THUMBEL__ 1 #define __THUMB_INTERWORK__ 1

Таким образом есть все что Вам нада:

#ifdef __THUMBEL__
// тумб код
#else
// арм код
#endif
axle
Цитата(Сергей Борщ @ Dec 27 2007, 01:32) *
Обнаружил, что если натравить gcc с ключем -dM на заголовочный файл, то генерится какой-то чудовищный бинарник с расширением .gch, в котором редактором видны предопределенные символоы. Таким образом выяснилось, что для -mcpu=arm7tdmi символы __ARM_ARCH_4T__, __ARMEL__, __arm__ предопределены независимо от режима ARM/THUMB, __thumb__, __THUMBEL__ при компиляции с ключем -mthumb и при ключе -mthumb-interwork определяется символ __THUMB_INTERWORK__

В прошлый раз не мог вспомнить как я получал список предопределенных символов. Пришлось положиться на гугл.
Теперь вспомнил: smile.gif
Код
touch empty.c
arm-elf-cpp empty.c -dM | sort

В принципе тоже самое, но список в удобном виде выводится в консоль.
Сергей Борщ
Ой, как-то эта ветка выпала из моего внимания.
Цитата(klen @ Dec 27 2007, 09:37) *
Не надо гнать на мой любимй компиллер! необоснованно!
Ув. klen! Я не гоню на ваш любимый компилятор. Я же еще в первом посте написал, что поиск в гугле ничего не дал. Я пересмотрел документацию к GCC - там нет ни слова об этих предопределенных символах. Я специально только что задал поиск по папкам, где установлен Yagarto: THUMBEL найден в двух файлах - cc1.exe и cc1plus.exe В файлах документации он не упоминается
Я понимаю, что когда вы копаетесь в исходниках gcc, все эти символы для вас как на ладони, но у меня нет возможности вникать еще и в компиляторостроение. Поэтому, собственно и был вопрос.

А за полный и конкретный ответ огромное спасибо!

Цитата(axle @ Dec 27 2007, 10:24) *
Код
touch empty.c
arm-elf-cpp empty.c -dM | sort
В принципе тоже самое, но список в удобном виде выводится в консоль.
Ничего себе то же самое! Это же гораздо удобнее. Похоже, моя ошибка была в том, что я вызывал arm-elf-gcc, а не arm-elf-cpp
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.