avr32-gccのAVR32関連マクロ
以前、AT32UC3B0256における定義済みマクロを紹介した。これらは-marhオプションや-mpartオプションにより定義が変わったり、定義されなくなったりする。
今回はgccのソースからAVR32関係のマクロ名を探してみた。当然だがこれらはコンパイル・オプションに従いavr32-gccが定義するマクロであり、ここで紹介したマクロを勝手に定義してもMCUが変身したり、ハードウェア機能が追加されるはずもない。ユーザは勝手に定義すべきでない。
ソースはAtmelのサイトからダウンロードできる。「AVR32 GNU Toolchain 2.2.1 - Linux Source Code」を利用したが、参照するだけなのでこれを利用する(Windows用は見あたらない)。
なお、それらしい記述を抜き出して整形しただけであり、コードまで追いかけていない。
しかしこういう情報はAtemelがドキュメントにまとめて欲しいものだ。APシリーズがAVR32Bだなんて初めて知った(UC3のマニュアルしか見たことがないから)。
avr32_gnu_toolchain_2.2.1_source\gcc-4.3.2\gcc\config\avr32\linux-elf.hおよびavr32-elf.h
にある記述から、マクロ定義情報を探してみた。「TARGET_〜」はC言語マクロである。たぶんCPU製品毎の定義情報をチェックするのだろう。「part名」、「arch名」というのは後述の表を参照のこと。
条件 | マクロ名 |
---|---|
無条件 | __avr32__ |
無条件 | __AVR32__ |
LINUX-ELF出力用 | __AVR32_LINUX__ |
ELF出力用 | __AVR32_ELF__ |
無条件 | part名 |
無条件 | arch名 |
avr32_arch->uarch_type == UARCH_TYPE_AVR32A | __AVR32_AVR32A__ |
avr32_arch->uarch_type != UARCH_TYPE_AVR32A | __AVR32_AVR32B__ |
TARGET_UNALIGNED_WORDが真のとき | __AVR32_HAS_UNALIGNED_WORD__ |
TARGET_SIMDが真のとき | __AVR32_HAS_SIMD__ |
TARGET_DSPが真のとき | __AVR32_HAS_DSP__ |
TARGET_RMWが真のとき | __AVR32_HAS_RMW__ |
TARGET_BRANCH_PREDが真のとき | __AVR32_HAS_BRANCH_PRED__ |
TARGET_FAST_FLOATが真のとき | __AVR32_FAST_FLOAT__ |
ELF出力で、TARGET_NO_MUL_INSNSが真のとき | __AVR32_NO_MUL__ |
avr32_gnu_toolchain_2.2.1_source\gcc-4.3.2\gcc\config\avr32\avr32.c
には製品毎のマクロ情報がある。左端のnameは-mpart=オプションの文字列、architecture typeは-marchオプションのアーキテクチャ名(gcc内部用マクロの都合で大文字になっているが指定は小文字)、macroはその製品で定義されるマクロ名である。part_typeはgcc内部で利用されるマクロで、通常は関係ないがavr32-gccのソースを追いかける人用に残した(というほどのものではないが)。
name | part_type | architecture type | macro |
---|---|---|---|
none | NONE | AP | __AVR32__ |
ap7000 | AP7000 | AP | __AVR32_AP7000__ |
ap7001 | AP7001 | AP | __AVR32_AP7001__ |
ap7002 | AP7002 | AP | __AVR32_AP7002__ |
ap7200 | AP7200 | AP | __AVR32_AP7200__ |
uc3a0128 | UC3A0128 | UCR2 | __AVR32_UC3A0128__ |
uc3a0256 | UC3A0256 | UCR2 | __AVR32_UC3A0256__ |
uc3a0512 | UC3A0512 | UCR2 | __AVR32_UC3A0512__ |
uc3a0512es | UC3A0512ES | UCR1 | __AVR32_UC3A0512ES__ |
uc3a1128 | UC3A1128 | UCR2 | __AVR32_UC3A1128__ |
uc3a1256 | UC3A1256 | UCR2 | __AVR32_UC3A1256__ |
uc3a1512 | UC3A1512 | UCR2 | __AVR32_UC3A1512__ |
uc3a1512es | UC3A1512ES | UCR1 | __AVR32_UC3A1512ES__ |
uc3a3revd | UC3A3REVD | UCR2NOMUL | __AVR32_UC3A3256S__ |
uc3a364 | UC3A364 | UCR2 | __AVR32_UC3A364__ |
uc3a364s | UC3A364S | UCR2 | __AVR32_UC3A364S__ |
uc3a3128 | UC3A3128 | UCR2 | __AVR32_UC3A3128__ |
uc3a3128s | UC3A3128S | UCR2 | __AVR32_UC3A3128S__ |
uc3a3256 | UC3A3256 | UCR2 | __AVR32_UC3A3256__ |
uc3a3256s | UC3A3256S | UCR2 | __AVR32_UC3A3256S__ |
uc3b064 | UC3B064 | UCR1 | __AVR32_UC3B064__ |
uc3b0128 | UC3B0128 | UCR1 | __AVR32_UC3B0128__ |
uc3b0256 | UC3B0256 | UCR1 | __AVR32_UC3B0256__ |
uc3b0256es | UC3B0256ES | UCR1 | __AVR32_UC3B0256ES__ |
uc3b164 | UC3B164 | UCR1 | __AVR32_UC3B164__ |
uc3b1128 | UC3B1128 | UCR1 | __AVR32_UC3B1128__ |
uc3b1256 | UC3B1256 | UCR1 | __AVR32_UC3B1256__ |
uc3b1256es | UC3B1256ES | UCR1 | __AVR32_UC3B1256ES__ |
uc3l064 | UC3L064 | UCR3 | __AVR32_UC3L064__ |
uc3l032 | UC3L032 | UCR3 | __AVR32_UC3L032__ |
uc3l016 | UC3L016 | UCR3 | __AVR32_UC3L016__ |
上記と同じソースにあるアーキテクチャ毎のマクロ情報がある。nameは-march=オプションの文字列、microarchitecture typeがマニュアル等に書かれているアーキテクチャ(という言い方しかないが)で、feature flagsはgccソース内のビットフラグ・マクロでCPU内部機能を表す。macroはそのアーキテクチャで定義されるマクロ名とその値である。architecture typeはgcc内部で利用されるマクロ名である。
feature flagsには、本当はプリフィックス「FLAG_AVR32_」が付いている。表の右端が削れて見えないため、このマクロ名を省略して短くした。
name | archite- cture type |
micro- archite- cture type |
feature flags |
macro |
---|---|---|---|---|
ap | AP | AVR32B | HAS_DSP ¦ HAS_SIMD ¦ HAS_UNALIGNED_WORD ¦ HAS_BRANCH_PRED ¦ HAS_RETURN_STACK ¦ HAS_CACHES | __AVR32_AP__ |
ucr1 | UCR1 | AVR32A | HAS_DSP ¦ HAS_RMW | __AVR32_UC__=1 |
ucr2 | UCR2 | AVR32A | HAS_DSP ¦ HAS_RMW ¦ HAS_V2_INSNS | __AVR32_UC__=2 |
ucr2nomul | UCR2NOMUL | AVR32A | HAS_DSP ¦ HAS_RMW ¦ HAS_V2_INSNS ¦ HAS_NO_MUL_INSNS | __AVR32_UC__=2 |
ucr3 | UCR3 | AVR32A | HAS_DSP ¦ HAS_RMW ¦ HAS_V2_INSNS | __AVR32_UC__=3 |