Rust编译器支持中断

时间:2017-04-13 10:01:11

标签: rust interrupt bare-metal

我正在为Rust中的AMR板写一个裸机应用程序,涉及中断服务程序。目前,我使用#naked函数和我自己的汇编程序prolog / epilog。但是,我想知道是否有更好的(并且希望更便携)我错过的方式,也许是Rust夜间或任何其他编译器支持的类似属性#interrupt。我认为,就像GCC的__attribute__ ((interrupt ("IRQ")))一样,Rust的后端LLVM提供了这样的属性。

2 个答案:

答案 0 :(得分:5)

中断只是另一种调用约定。对于Rust的AVR端口,我们添加了两种新类型的调用约定,一种用于AVR支持的每种中断。

调用约定is the source code的权威列表。 Rust 1.16列出了这些:

#[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy, Debug)]
pub enum Abi {
    // NB: This ordering MUST match the AbiDatas array below.
    // (This is ensured by the test indices_are_correct().)

    // Single platform ABIs
    Cdecl,
    Stdcall,
    Fastcall,
    Vectorcall,
    Aapcs,
    Win64,
    SysV64,
    PtxKernel,
    Msp430Interrupt,

    // Multiplatform / generic ABIs
    Rust,
    C,
    System,
    RustIntrinsic,
    RustCall,
    PlatformIntrinsic,
    Unadjusted
}

unstable book also mentions that the different calling conventions exist

要使用它们,您可以用它声明您的功能:

#![feature(abi_msp430_interrupt)] 

extern "msp430-interrupt" fn handler() {}

您仍然可以使用中断向量表(或等效的)将该函数注册为异常处理程序。

当然,您可能需要提交一个PR,告知Rust前端使用特定的LLVM调用约定,如果您的列表中尚未包含此内容。

答案 1 :(得分:-3)

在这里复制信息,无耻地;)

https://github.com/nix-rust/nix

https://users.rust-lang.org/t/unix-signals-in-rust/733/3

use nix::sys::signal;

extern fn handle_sigint(_:i32) {
  println!("Interrupted!");
  panic!();
}

fn main() {
  let sig_action = signal::SigAction::new(handle_sigint,
                                          signal::SockFlag::empty(),
                                          signal::SigSet::empty());
  signal::sigaction(signal::SIGINT, &sig_action);
}