問題タブ [isr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
297 参照

arduino - Arduino Uno 上の 2 つの ISR

私は宿題のコードを書いています。課題の一部は、16x2 LCD に arduino がオンになっている時間を示す時計を表示させることです。このクロックは、タイマー割り込みで実行する必要があります。私はその部分を機能させましたが、割り当ての 2 番目の部分は、クロックをすべて 0 にリセットする別の割り込み (信号としての外部ボタン) を持つことです。現在、ISR は何もしていないようです。何か案は?

0 投票する
0 に答える
314 参照

linux - LinuxでのUART受信

これは主に概念的な質問です。

UART を介して外部デバイスからデータを受信する ARM ボードがあります。データを正常に送受信できます (/dev/ttyS1 経由)

しかし、データを受信するには、端末から「read」または「cat」コマンドを明示的に使用する必要があります。

読み取りコマンドを使用せずに、データを受信して​​受信データを保存するための割り込みを行う方法を見つけようとしています。poll() を永続的に使用する C プログラムを作成することを考えていましたが、これを行うためのより良い方法があるかどうか疑問に思っていました。

ポーリングが唯一の方法である場合、これに関するチュートリアルはありますか?

0 投票する
1 に答える
1363 参照

c++ - 割り込みルーチン内で C++ オブジェクト (および揮発性) を使用する正しい方法は何ですか?

私は現在、Atmel AVR マイクロコントローラー (gcc) を使用していますが、一般的なマイクロコントローラーの世界、つまり通常はシングル スレッドであるが割り込みを伴うものに回答を適用したいと考えています。

volatileISR で変更できる変数にアクセスするときに C コードで使用する方法を知っています。例えば:

g_popIndex は ISR の内部で変更され、ISR の外部でvolatileアクセスされるため、その変数へのメモリ アクセスを最適化しないようにコンパイラに指示するように宣言する必要があります。ISR によって変更されていないため、私が間違っていない限り、宣言する必要がないことに注意してg_pushIndexくださいg_valuesvolatile

クラス内のキューに関連するコードをカプセル化して、再利用できるようにしたいと考えています。

上記のコードは間違いなくより読みやすいです。volatileとありますが、この場合どうすればよいのでしょうか。

1) それはまだ必要ですか? メソッドを呼び出すと、関数が宣言されている場合でも、Queue::isEmpty()への最適化されていないアクセスが保証されますか? 私はそれを疑います。コンパイラがヒューリスティックを使用してアクセスを最適化する必要がないかどうかを判断することは知っていますが、一般的な解決策としてそのようなヒューリスティックに頼るのは嫌いです。g_queue.m_popIndexinline

Queue::m_popIndex volatile2)機能する(そして効率的な)解決策は、クラス定義内でメンバーを宣言することだと思います。ただし、クラスの設計者は、Queueどのメンバー変数がvolatile. 将来のコード変更にうまく対応できません。また、一部のインスタンスがISR 内で使用されていない場合でも、すべてのQueueインスタンスがメンバーを持つようになりました。volatile

3) クラスをビルトインのように見る場合、ISR で変更され、ISR の外部でアクセスされるため、グローバル インスタンス自体を としてQueue宣言するのが自然な解決策だと思います。ただし、オブジェクトに対して呼び出すことができるのは関数のみであるため、これはうまく機能しません。突然、すべてのメンバー関数を宣言する必要があります( ISR 内で使用されるものだけでなく)。繰り返しますが、デザイナーはどのようにしてそれを事前に知ることができますか? また、これはすべてのユーザーにペナルティを課します。すべてのメンバー関数を複製し、クラスにと non-の両方のオーバーロードを含める可能性がまだあるため、非ユーザーはペナルティを受けません。かわいくない。g_queuevolatilevolatilevolatileQueuevolatileconstQueueQueuevolatilevolatilevolatile

4)クラスは、必要に応じてすべてのメンバー変数にQueueオプションで追加できるポリシー クラスでテンプレート化できます。volatile繰り返しますが、クラス設計者は事前にそのことを知っておく必要があり、解決策は理解するのがより複雑になりますが、まあまあです。

これに対する簡単な解決策が欠けているかどうか知りたいです。ちなみに、私は (まだ) C++11/14 をサポートせずにコンパイルしています。

0 投票する
2 に答える
982 参照

c++ - Atmel Studio C++ Build の使用中に xmega で ISR を使用できない

Atmel Studio 6.2.1563 を使用して、ATXMEGA64A3U 用の GCC C++ 実行可能ビルドを作成しました。タイマー TCC1 をセットアップして、1 ミリ秒ごとにオーバーフロー割り込みを生成します。しかし、コンパイラは ISR 定義を無視しているようです。

デバッグ モードでは、タイマーが正しく機能しており、OVF 割り込みフラグが設定されていることがわかりますが、制御をサービス ルーチンに渡すことができません。

IDE メッセージ:The breakpoint (the one I set inside ISR function) will not currently be hit. Unable to set requested breakpoint on Target.

using extern "C" { }関連するcファイルのインクルージョンも試しました。他のタイマーを使用しようとすると、同じ問題が発生します。

提案のために開きます。

0 投票する
3 に答える
4821 参照

c - ISR と割り込みハンドラに違いはありますか?

私はオペレーティング システムを勉強していて、ISR と割り込みハンドラの両方という用語に出会いました。これらは同じメカニズムを表す 2 つの単語ですか? そうでない場合、違いは何ですか?

0 投票する
1 に答える
3356 参照

loops - 再開する代わりにメインループを再起動するように割り込みを強制する方法は? (タイミングの問題!)

過去 2 日間、私は基本的にはかなり正確なユーザー調整可能なパルス信号 (周波数とデューティ サイクルの両方が調整可能) を生成するプログラムを作成しました。基本的に micros() 関数を使用して時間を追跡し、4 つのデジタル出力チャネルをローまたはハイにプルします。

これらの 4 つのチャネルには、常に 90 度の位相差が必要です (4cyl エンジンを考えてください)。ユーザーが設定を変更できるように、プログラムを再初期化するためにメイン ループにフラグを返す ISR が実装されています。このフラグはブール値の「set4」として定義されています。false の場合、メイン ループの「while」ステートメントが出力を実行します。true の場合、'if' ステートメントは必要な再計算を実行し、フラグをリセットして、'while' ステートメントを再開します。

プログラムは初期値で完全に動作します。フェーズは完璧です。ただし、ISRが呼び出されてメインループに戻ると、最初に中断された場所から「while」ステートメントでプログラムを再開し、終了してフラグ「set4」を再チェックして、今は真であり、停止する必要があります。その後、「if」ステートメントが後で必要なすべての変数をリセットして再計算しても、これらの 4 つの出力チャンネル間の位相は失われます。手動でテストしたところ、ISR が呼び出された時間に応じて異なる結果が得られ、通常は 4 つの出力チャネルすべてが同期されています。これは、値を変更しない場合でも発生します (したがって、最初に arduino の電源を入れたときに、'if' ルーチンによって変数がまったく同じ値にリセットされます!)。でも、

これは、ISR が呼び出された場所からループが再開されるため、micros() タイマーが原因であると確信しています。cli() と sei() を使用して割り込みをチェックして無効にすることで、別の方法で実行しようとしましたが、cli() の引数が true の場合にフリーズするだけなので、動作させることができませんでした。私が考えることができる唯一の解決策 (私はすべてを試し、一日中検索して試してみました) は、ISR を強制的にループの最初から再開させて、プログラムが正しく初期化されるようにすることです。頭に浮かぶ別の解決策は、おそらく micros() タイマーを何らかの方法でリセットすることです..しかし、これは私が信じているISRを台無しにするでしょう。

何が起こっているのかを視覚化するのに役立つように、ここに私のコードの一部を示します(純粋なコピーアンドペーストではないため、micros変数の「Millis」名と中括弧の欠落を気にしないでください:p):

何がうまくいかないのですか?敬具、ケン

0 投票する
3 に答える
342 参照

c - ISR とメイン: どちらかで実行することのトレードオフは何ですか?

時間と効率性、および ISR が他のプロセスから時間を奪う方法に関係していることはわかっていますが、なぜそうなのかはわかりません。私はいつも、ISR を非常に短くするように言われています。これがなぜなのか、私は少し混乱しています。