Jump to content

    
Sign in to follow this  
Сергей Борщ

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

Recommended Posts

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites
То, что нужно!!!
Гладко было на бумаге... Похоже, указанные по ссылке символы определены только в упомянутом там пакете 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

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

Share this post


Link to post
Share on other sites

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

 

итак имеем:

 

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

 

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

Share this post


Link to post
Share on other sites
Обнаружил, что если натравить 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

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

Share this post


Link to post
Share on other sites

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

Не надо гнать на мой любимй компиллер! необоснованно!
Ув. 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

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.

Sign in to follow this