2017-04-13 3 views
2

割り込みサービスルーチンを含むRustのAMRボード用のベアメタルアプリケーションを作成しています。現在、私は#naked関数を自分自身のアセンブラプロローグ/エピローグと併用しています。しかし、Rust nightlyや他のコンパイラのサポートでは、おそらく#interruptのような属性が欲しいと思っています。 GCCの__attribute__ ((interrupt ("IRQ")))のラインに沿って、RustのバックエンドのLLVMはそのような属性を提供していると思います。割り込みのためのラスターコンパイラーのサポート

答えて

4

割り込みは、単に呼び出し規約の別のタイプです。 RustのAVRポートでは、AVRがサポートする割り込みの種類ごとに1つずつ、2種類の新しい呼び出し規約を追加しました。

呼び出し規約の正式リストis the source code。錆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() {} 

それは、割り込みベクタテーブル(または同等)と例外ハンドラとして関数を登録するのはあなた次第まだです。

もちろん、あなたがまだこのリストにない場合は、特定のLLVM呼び出し規約のRustフロントエンドに使用するように通知するPRを提出する必要があります。

-2

は臆面もなく、ここで情報をコピー;)

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); 
} 
+0

私が理解しているように、これはa)a)b)unix環境でのシグナルですか?両方の条件は、質問に記載されている環境によって満たされていません。 – Matthias

+0

2番目のリンクを読んでください。これは割り込みに関するものです。さびはまだそれをサポートしていません。ので、OPはnixライブラリを使用して回避する。 – sailfish009

+0

SIGINTは、ISRが呼び出された後に生成された信号です。現時点では、私はプロローグやエピローグを気にする必要はありません。私はgccの属性 '__attribute__((interrupt(" IRQ "))))のようなハードウェア割り込みのISRのコンパイラサポートを探しています。 – Matthias

関連する問題