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

GCC препроцессор, Thumb/ARM

Есть некоторая конструкция, которая должна компилиться по-разному в зависимости от того, компилится файл в 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? Или если его определять вручную в командной строке, то возможно существует какое-то общепринятое имя для этого символа? Поиск в гугле пока ничего не дал.

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


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

Понятно, что символ THUMB_MODE можно определить в командной строке gcc, но может быть существует какой-то стандартный символ, который определяет компилятор при запуске с ключем -mthumb? Или если его определять вручную в командной строке, то возможно существует какое-то общепринятое имя для этого символа? Поиск в гугле пока ничего не дал.

Можно использовать __THUMB.

Подробнее здесь:

http://h30097.www3.hp.com/demos/ossc/doc/c...bed/embARM.html

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


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

О! Благодарю! То, что нужно!!!

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


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

То, что нужно!!!
Гладко было на бумаге... Похоже, указанные по ссылке символы определены только в упомянутом там пакете GNUPro. В используемом мной Yagarto таких символов не обнаружилось :( В документации к 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

Вдруг кому-то пригодится для поиска других предопределенных символов.

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


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

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

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


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

Не надо гнать на мой любимй компиллер! необоснованно!

 

итак имеем:

 

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

 

по умолчанию (без ключей) #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

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


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

Обнаружил, что если натравить gcc с ключем -dM на заголовочный файл, то генерится какой-то чудовищный бинарник с расширением .gch, в котором редактором видны предопределенные символоы. Таким образом выяснилось, что для -mcpu=arm7tdmi символы __ARM_ARCH_4T__, __ARMEL__, __arm__ предопределены независимо от режима ARM/THUMB, __thumb__, __THUMBEL__ при компиляции с ключем -mthumb и при ключе -mthumb-interwork определяется символ __THUMB_INTERWORK__

В прошлый раз не мог вспомнить как я получал список предопределенных символов. Пришлось положиться на гугл.

Теперь вспомнил: :)

touch empty.c
arm-elf-cpp empty.c -dM | sort

В принципе тоже самое, но список в удобном виде выводится в консоль.

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


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

Ой, как-то эта ветка выпала из моего внимания.

Не надо гнать на мой любимй компиллер! необоснованно!
Ув. klen! Я не гоню на ваш любимый компилятор. Я же еще в первом посте написал, что поиск в гугле ничего не дал. Я пересмотрел документацию к GCC - там нет ни слова об этих предопределенных символах. Я специально только что задал поиск по папкам, где установлен Yagarto: THUMBEL найден в двух файлах - cc1.exe и cc1plus.exe В файлах документации он не упоминается

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

 

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

 

touch empty.c
arm-elf-cpp empty.c -dM | sort

В принципе тоже самое, но список в удобном виде выводится в консоль.

Ничего себе то же самое! Это же гораздо удобнее. Похоже, моя ошибка была в том, что я вызывал arm-elf-gcc, а не arm-elf-cpp

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


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

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

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

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

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

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

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

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

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

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