2017-01-25 3 views
0

私は、A13プロセッサを搭載したLinux(A13-OLinuXino-MICRO)のcで簡単なコードを書いています。私はgccコンパイラを使用しています。 1から100までカウントしている単純なループがあり、このループでできるだけ中断しないようにしたいとしましょう。私は可能な限り割り込みを無効にする(可能であればタイマーの割り込みさえも)ことができ、ループの後で有効にすることができます。私は私のプログラムに複数の場所を設け、これを強制する必要があります。誰も私に簡単なCコードを教えてもらえますか?ループは中断から保護されています。私は自分のプラットフォームでコンパイルして実行できますか?LinuxのCプログラムで割り込みを無効にする方法

EDIT:カーネルスレッドが答えかもしれません。カーネル権限で何かを実行するには?私は人々がdisable_local_interrupt()について話しているのを見ていますが、私はそれをどのように使用するのか分かりません。

編集:これは私が解決しようとしている実際の問題です。割り込みのない環境でアプリケーションを実行する必要があります。

編集:はい私は、Linuxが私の必要としているものだと確信しています。私は割り込みがOSにとって重要であることを知っています。なぜなら、それらを永久に無効にしたくないからです。私はこれを実行しているときに、OS上で何分の1秒間もno-interruptを強制したいだけです。また、私が解決する必要がある主要な問題はありません、これは私が解決する必要がある "問題"です、なぜ私はこれをやりたいのですか?

+7

これを行う方法はありません。そのような低レベルでユーザーコードから変更を行うことについて考えるべきではありません(そして、カーネルコードでは非常に注意してください)。これはXYの問題です。これであなたが解決しようとしている**実際の**問題は何ですか? – Olaf

+0

これが一般的に利用可能な機能だった場合、タスクスケジューリングはクロック生成割り込みに依存するため、誰かがプラグを物理的に引っ張るまで、システム全体をブロックするような無限ループのプログラムを書くことができます。 – zneak

+0

割り込みを無効にするのはプロセッサ命令と同じくらい簡単です。通常、ニーモニックは 'cli'に似ています。しかし、それは特権命令であり、特権を持つ文脈でのみ実行可能である。 – SergeyA

答えて

5

ユーザスペースで割り込みを無効または有効にすることはできません。

0

ARM.com http://infocenter.arm.com/help/index.jsp?topic=%2Fcom.arm.doc.ddi0344k%2FBeidabib.htmlによると、このCPUの動作モードは異なります。これは、おそらくユーザープロセスからの割り込みを無効にすることができないことを示唆しています。

+0

それでは、より高い特権でそれを行う方法はありますか? – Nhome

+1

はい、あなたのコードをカーネルで実行してください。カーネルドライバを作成します。私はカーネル開発者ではありませんが、ユーザランドからの割り込みを無効にしてから有効にしたくないと推測します。カーネルモードで全動作を実行する必要があります。割り込みを無効にし、必要な動作をして割り込みを再度有効にします。これはまだ奇妙に聞こえるし、RTOSが最も良い選択である可能性が高いです。 –

0

@doronが正しいと思います。ユーザーモードで割り込みを無効にしたり有効にすることはできませんが、回避することはできます。インターフェイスに "ループ"コードをカプセル化するドライバを書くことができ、ドライバで割り込みを有効/無効にすることができます。アプリケーションは、そのインタフェースを呼び出すだけで済みます。

関連する問題