mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-18 05:45:19 +01:00
Don't use interrupts reserved by esp-hal
Excluding the reserved interrupts fixes the task priorities. I also considered refactoring `rtic/src/export/riscv_esp32c6.rs` to use esp-hal instead of esp32c6 directly as it has code to do all the pointer wrangling itself, but decided against it for now. It might be nice to refactor both esp implentations to use it though.
This commit is contained in:
parent
c6fbbaaae8
commit
0615841cb8
2 changed files with 16 additions and 38 deletions
|
|
@ -13,11 +13,10 @@ mod esp32c6 {
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use syn::{parse, Attribute, Ident};
|
use syn::{parse, Attribute, Ident};
|
||||||
|
|
||||||
// Section 1.6.2 technical reference manual specifies which interrupts can be configured.
|
// esp-hal reserves interrupts 1-19:
|
||||||
const EXTERNAL_INTERRUPTS: [u8; 28] = [
|
// https://github.com/esp-rs/esp-hal/blob/esp-hal-v1.0.0-beta.0/esp-hal/src/interrupt/riscv.rs#L200
|
||||||
1, 2, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
|
// https://github.com/esp-rs/esp-hal/blob/esp-hal-v1.0.0-beta.0/esp-hal/src/interrupt/riscv.rs#L725
|
||||||
28, 29, 30, 31,
|
const EXTERNAL_INTERRUPTS: [u8; 12] = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];
|
||||||
];
|
|
||||||
|
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
pub fn impl_mutex(
|
pub fn impl_mutex(
|
||||||
|
|
@ -243,12 +242,9 @@ mod esp32c6 {
|
||||||
)
|
)
|
||||||
.zip(EXTERNAL_INTERRUPTS)
|
.zip(EXTERNAL_INTERRUPTS)
|
||||||
{
|
{
|
||||||
// interrupt1...interrupt19 are already defined in esp_hal
|
if *name == dispatcher_name {
|
||||||
if curr_cpu_id > 19 {
|
let ret = &("interrupt".to_owned() + &curr_cpu_id.to_string());
|
||||||
if *name == dispatcher_name {
|
stmts.push(quote!(#[export_name = #ret]));
|
||||||
let ret = &("interrupt".to_owned() + &curr_cpu_id.to_string());
|
|
||||||
stmts.push(quote!(#[export_name = #ret]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
pub use esp32c6::{Interrupt, Peripherals};
|
pub use esp32c6::{Interrupt, Peripherals};
|
||||||
use esp32c6::{INTERRUPT_CORE0, INTPRI, PLIC_MX};
|
use esp32c6::{INTERRUPT_CORE0, PLIC_MX};
|
||||||
pub use riscv::interrupt;
|
pub use riscv::interrupt;
|
||||||
pub use riscv::register::mcause;
|
pub use riscv::register::mcause;
|
||||||
|
|
||||||
|
|
@ -148,32 +148,14 @@ pub fn enable(int: Interrupt, prio: u8, cpu_int_id: u8) {
|
||||||
.offset(int as isize)
|
.offset(int as isize)
|
||||||
.write_volatile(cpu_int_id as u32);
|
.write_volatile(cpu_int_id as u32);
|
||||||
|
|
||||||
match int {
|
// Set the interrupt's priority:
|
||||||
Interrupt::FROM_CPU_INTR0
|
(*PLIC_MX::ptr())
|
||||||
| Interrupt::FROM_CPU_INTR1
|
.mxint_pri(cpu_int_id as usize)
|
||||||
| Interrupt::FROM_CPU_INTR2
|
.write(|w| w.bits(prio as u32));
|
||||||
| Interrupt::FROM_CPU_INTR3 => {
|
|
||||||
// Set the interrupt's priority:
|
|
||||||
(*INTPRI::ptr())
|
|
||||||
.cpu_int_pri(cpu_int_id as usize)
|
|
||||||
.write(|w| w.bits(prio as u32));
|
|
||||||
|
|
||||||
// Finally, enable the CPU interrupt:
|
// Finally, enable the CPU interrupt:
|
||||||
(*INTPRI::ptr())
|
(*PLIC_MX::ptr())
|
||||||
.cpu_int_enable()
|
.mxint_enable()
|
||||||
.modify(|r, w| w.bits((1 << cpu_int_id) | r.bits()));
|
.modify(|r, w| w.bits((1 << cpu_int_id) | r.bits()));
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
// Set the interrupt's priority:
|
|
||||||
(*PLIC_MX::ptr())
|
|
||||||
.mxint_pri(cpu_int_id as usize)
|
|
||||||
.write(|w| w.bits(prio as u32));
|
|
||||||
|
|
||||||
// Finally, enable the CPU interrupt:
|
|
||||||
(*PLIC_MX::ptr())
|
|
||||||
.mxint_enable()
|
|
||||||
.modify(|r, w| w.bits((1 << cpu_int_id) | r.bits()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue