реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> GCC препроцессор, Thumb/ARM, Как из исходника определить режим компиляции
Сергей Борщ
сообщение Dec 21 2007, 22:07
Сообщение #1


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
axle
сообщение Dec 22 2007, 11:33
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



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

Можно использовать __THUMB.
Подробнее здесь:
http://h30097.www3.hp.com/demos/ossc/doc/c...bed/embARM.html
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2007, 12:50
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(axle @ Dec 22 2007, 13:33) *
О! Благодарю! То, что нужно!!!


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2007, 19:32
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Сергей Борщ @ 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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Harbour
сообщение Dec 27 2007, 06:41
Сообщение #5


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



gch это precompiled header и к ключу -dM отношения, похоже, не имеет. ключ -dM генерит .mach файлы, полезно разве что для отладки gcc.
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 27 2007, 07:37
Сообщение #6


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



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

итак имеем:

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

по умолчанию (без ключей) #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
Go to the top of the page
 
+Quote Post
axle
сообщение Dec 27 2007, 08:24
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



Цитата(Сергей Борщ @ 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

В принципе тоже самое, но список в удобном виде выводится в консоль.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 26 2008, 10:57
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Ой, как-то эта ветка выпала из моего внимания.
Цитата(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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 23:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016