3.1. The built-in avr-unknown-gnu-atmega328
target
The Rust nightly compiler contains a built-in target, avr-unknown-gnu-atmega328
, that
generates code for the AVR ATmega328 using the
GNU AVR-GCC toolchain for linking support.
Targeting custom microcontrollers by adapting 'avr-unknown-gnu-atmega328'
See the section 5.1. The Target Specification JSON File for more information about how Rust target specification JSON files work.
To generate a Rust target specification JSON file from the builtin:
rustc --print target-spec-json -Z unstable-options --target avr-unknown-gnu-atmega328 > my-custom-avr-unknown-gnu-atmega328.json
This prints the target specification JSON file my-custom-avr-unknown-gnu-atmega328.json
:
{
"arch": "avr",
"cpu": "atmega328",
"data-layout": "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8",
"eh-frame-header": false,
"env": "",
"exe-suffix": ".elf",
"executables": true,
"is-builtin": true,
"late-link-args": {
"gcc": [
"-lgcc"
]
},
"linker": "avr-gcc",
"linker-flavor": "gcc",
"linker-is-gnu": true,
"llvm-target": "avr-unknown-unknown",
"os": "unknown",
"pre-link-args": {
"gcc": [
"-mmcu=atmega328",
"-Wl,--as-needed"
]
},
"target-c-int-width": "16",
"target-endian": "little",
"target-pointer-width": "16",
"vendor": "unknown"
}
To adapt this file to target a different microcontroller:
- Replace the top-level
"cpu": "atmega328"
with"cpu": "YOUR-AVR-VARIANT-NAME"
- Replace
"-mmcu=atmega328"
with"-mmcu=YOUR-AVR-VARIANT-NAME"
The file can then be passed to Rust via the rustc --target <JSON FILE PATH>
instead of
rustc --target avr-unknown-gnu-atmega328
, which will tailor the generated code to your
desired microcontroller.
It is also possible to customize link parameters if desired by modifying the JSON file.
Compiling for AVR without the GNU toolchain
At the moment, the only builtin AVR target avr-unknown-gnu-atmega328
always requires
AVR-GCC, AVR-libc and AVR-binutils from the GNU project.
The LLVM LLD linker has some limited support for AVR which in the future could be leveraged
to allow compiling AVR Rust binaries without the dependency on the GNU toolchain. Some work
on compiler-builtins
and others would also be required. At the moment, the GNU toolchain
is a hard dependency.