Skip to content

Commit b2a9d9f

Browse files
authored
Merge pull request #12 from mutantbob/support/avr-platform
Support/avr platform
2 parents 627beef + 7f915c4 commit b2a9d9f

File tree

5 files changed

+53
-1
lines changed

5 files changed

+53
-1
lines changed

.github/workflows/rust.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ jobs:
1616
steps:
1717
- uses: actions/checkout@v2
1818
- name: Build
19-
run: ./ci.sh
19+
run: ./ci.sh

avr-specs/avr-atmega328p.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"arch": "avr",
3+
"atomic-cas": false,
4+
"cpu": "atmega328p",
5+
"data-layout": "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8",
6+
"eh-frame-header": false,
7+
"exe-suffix": ".elf",
8+
"executables": true,
9+
"late-link-args": {
10+
"gcc": [
11+
"-lgcc"
12+
]
13+
},
14+
"linker": "avr-gcc",
15+
"linker-is-gnu": true,
16+
"llvm-target": "avr-unknown-unknown",
17+
"max-atomic-width": 8,
18+
"no-default-libraries": false,
19+
"pre-link-args": {
20+
"gcc": [
21+
"-mmcu=atmega328p",
22+
"-Wl,--as-needed"
23+
]
24+
},
25+
"target-c-int-width": "16",
26+
"target-pointer-width": "16"
27+
}

ci.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
set -euxo pipefail
44

5+
rustup toolchain install nightly-2021-01-07 --component rust-src
6+
cargo +nightly-2021-01-07 build -Zbuild-std=core --target avr-specs/avr-atmega328p.json
7+
58
cargo build
69
cargo build --target thumbv6m-none-eabi
710
cargo build --target thumbv7em-none-eabi

rust-toolchain.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ targets = [
88
"thumbv7em-none-eabi",
99
"riscv32imc-unknown-none-elf",
1010
"riscv32imac-unknown-none-elf",
11+
"avr-specs/avr-atmpeg328p.json",
1112
]

src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#![cfg_attr(docsrs, feature(doc_cfg))]
22
#![no_std]
3+
#![cfg_attr(target_arch = "avr", feature(llvm_asm))]
4+
#![cfg_attr(target_arch = "avr", feature(extended_key_value_attributes))]
35
#![doc = include_str!("../README.md")]
46

57
pub use bare_metal::CriticalSection;
@@ -118,6 +120,25 @@ cfg_if::cfg_if! {
118120
cortex_m::interrupt::enable()
119121
}
120122
}
123+
} else if #[cfg(target_arch = "avr")] {
124+
#[no_mangle]
125+
unsafe fn _critical_section_acquire() -> u8 {
126+
let mut sreg: u8;
127+
llvm_asm!(
128+
"in $0, 0x3F
129+
cli"
130+
: "=r"(sreg)
131+
::: "volatile"
132+
);
133+
sreg
134+
}
135+
136+
#[no_mangle]
137+
unsafe fn _critical_section_release(token: u8) {
138+
if token & 0x80 == 0x80 {
139+
llvm_asm!("sei" :::: "volatile");
140+
}
141+
}
121142
} else if #[cfg(target_arch = "riscv32")] {
122143
#[no_mangle]
123144
unsafe fn _critical_section_acquire() -> u8 {

0 commit comments

Comments
 (0)