• 締切済み

割り込み処理のシミュレート

現在開発している組み込み系システムのシミュレートをVCで行いたいと考えています。 組み込み系のシステムは簡単に言うと、 普段はメインループでくるくる回っており、1ms毎にタイマ割り込みが発生し、変数の値を書き換え、メインループではその変数の変化によって何か処理を実行するというものです。 このようなシステムをVCでできるだけ同じようにシミュレートするため、マルチスレッドを用いようと考えているのですが、以下の性質を実現することは可能でしょうか? ・メインスレッド実行中はタイマ割り込みスレッドは割り込み可能。 ・タイマ割り込みスレッド実行中はメインスレッドは割り込んでこない。 ・メインスレッドで特定の区間タイマ割り込みスレッドの割り込みを禁止できる。 ・高速シミュレートを行いたいため、割り込みの禁止などはできるだけ低負荷で行いたい。(ミリ秒単位だとNG) ・複数の割り込みスレッドがある場合、各スレッドごとに割り込みレベルを設け、このレベル以下を割り込み禁止など行いたい。 スレッド以外の実現方法などあればそちらもご教授願いたいです。 よろしくお願いします。

みんなの回答

回答No.2

最近の組み込み系は、不案内なんですが、 割り込みコントローラは使用しないのですか。 割り込み判定が、タイマーだけみたいですが、 これでは、応答速度に、問題があるのでは。 シミューレートだから使用できないとうことかも知れませんが。 だとすると、その組み込みシステム用に、 きちんとしたシミューレータを作成する必要があるのでは。

Ryo0617
質問者

お礼

回答ありがとうございます。 できればどのパソコン上でも動かせるシミュレータが作りたかったので、割り込みコントローラの使用などは考えていませんでした。

  • gentoo314
  • ベストアンサー率41% (15/36)
回答No.1

思いつくまま書いてみますので、検討してみてください。 マルチメディアタイマーを使うと比較的安定した間隔で、別スレッドからコールバック関数がコールされます。 これがタイマー割り込みハンドラに該当する。 ハンドラの入り口で、自身より下位のスレッドをサスペンドし、出口でレジュームする。割り込みのシミュレートね。割り込みを2本以上作るなら、タイミング問題が出るので、スレッドの操作をクリティカルセクションで排他したほうがよい。 メインスレッドで排他したい箇所には、排他用のクリティカルセクションをかける。ハンドラ側はスレッド操作の内側にクリティカルセクションをかける。

Ryo0617
質問者

お礼

回答ありがとうございます。 割り込みスレッド実行時にメインループスレッドに対してサスペンド処理を行ったところ、私のやり方では25msくらいの時間がかかりました。これでは1msタイマなどのシミュレートには使用できませんでした。やり方が悪いのかwindowsではこれが限界なのかわかりませんが、いろいろ試してみたいと思います。

関連するQ&A

  • C++でシングルスレッドで同期処理すべきか?

     こんばんは。 C++でプログラミングの勉強をしている者ですがシングル スレッドで同期処理をし、メイン処理からそのスレッドを実行した場合は スレッドの処理が終わるまで、そのスレッドに扱われる変数にアクセスできないという 認識で会っていますか? そもそも同期処理というのが、マルチスレッドで、同じメソッドを扱う場合、片方の処理が 終わるまでもう片方の処理は待機しているという認識で合ってますか? メイン処理からスレッドを作成し、スレッドの動きを止め、あるタイミングでスレッドの 処理を再開させる処理をメイン処理で実装することはできるでしょうか?

  • CSocket通信での待機処理について

    VC++2008にて、サーバとクライアントPCにて、相互通信を行うプログラムを作成しています。 クライアントは、CSocketを利用しマルチスレッドにて通信を行っています。 thread_start→マルチスレッド作成→ CSocket::Sendでサーバへメッセージ送信→ CSocket::OnReceiveでサーバのメッセージ受信→ サーバメッセージから処理実行と言った流れです。 通常の処理は、この流れで問題ないのですが、 ある処理の場合、thread_startをforループで数回繰り返す 処理を行っています。 この時、データにタイムラグが出てしまうため、 thread_startから処理実行までの一連の流れが終了するまで、 次のthread_startは呼ばれずに待機させたいのですが、 どのようにすれば良いのかが分かりません。 Sendを呼んだタイミングで、 WaitForSingleObjectでスレッドのハンドルを渡したり、 CreateEventでイベントハンドルを渡したりしてみたのですが、 WaitForSingleObjectを呼ぶと、OnReceiveで受信する前で 止まってしまうため、そのままフリーズ状態になってしまいます。 どのタイミングでWaitFor~を呼ぶべきなのか、 もしくは、何か別の手段があるのでしょうか?

  • (定周期タイマ割込み後ポーリング処理で事象検知)と(事象検知→割込みで処理)の違いと使い分け

    テクニカルエンジニア(エンべデッドシステム)の勉強をしています。 定周期タイマ割込みによるポーリング処理での事象検知と、事象検知しての割り込み処理の違いと使い分けについて質問です。 ・定周期タイマ割込みによるポーリング処理で事象検知(後述(1)) ・事象検知→割込み処理(後述(2)) ★質問1 (1)ではシステムに常に一定の負荷がかかってしまいますが、(2)の場合は事象の起きる頻度により負荷が変わってきます。設計思想としては(1)の負荷がシステム全体にとって微々たるものであれば採用し、負荷が大きければ(2)を採用するようなイメージなのですが、使い分け方としてはこれで正しいのでしょうか。どういうケースで(1)、(2)を使い分けているのか知りたいです。 ★質問2 同じマイコンを使った場合、一般的に割込み処理にかかる時間は(1)と(2)でどれほど違いがあるのでしょうか。 ★質問3 試験問題の解説の中で「((2)の割込み処理全体のかかる時間)<((1)のタイマ周期)なら(2)のシステムのほうが良い」と記述されていますが、よくわかりません。(2)のシステムのほうが(1)より良くなる条件はなになのでしょうか。 組み込み設計経験者ではないため、変な質問内容になっていたらすみません。。

  • (マルチスレッド)_beginthreadexに複数の引数を渡す

    現在プログラムでマルチスレッドをやろうとしているのですが、 マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか? MSDNで調べてみると、_beginthreadex関数の4番目のNULLのところに引数リストを 指定できるとあったのですが、その意味が良くわかりませんでした。 以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合は どのように書けばいいのでしょうか? #include <stdio.h> #include <windows.h> #include <process.h> unsigned WINAPI MyThread( void *lpx ){ while (1) { printf("スレッド実行中\n"); Sleep(1000); } return 0; } void main(){ // スレッドに渡したい変数の宣言 int a = 128; int b = 256; int c = 512; // スレッドIDの宣言 DWORD thID; // マルチスレッドの開始 (HANDLE)_beginthreadex( NULL, 0, &MyThread, NULL, 0, (unsigned int*)&thID ); // ループ while (1) { printf("メイン関数実行中\n"); Sleep(2000); } }

  • Androidのマルチスレッド処理の開始タイミング

    組み込みボード上にAndroidOSをのせ、 その上でRS232C通信制御するプログラムを作成しております。 RS232C通信制御についてはThreadクラスを派生させたクラスを 作成し、マルチスレッド処理として、アプリ起動中に、常に動作させたい と考えています。 このとき、RS232C通信制御するスレッドを 開始するタイミング、終了するタイミングはメインアクティビティのどの タイミングで行うのが1番よいのでしょうか? 現状は以下で考えています。 public class MainActivity extends Activity { ComCtrl m_ComCtrl ; // RS232C通信制御スレッド protected void onCreate(Bundle savedInstanceState) { m_ComCtrl = new ComCtrl( null ) ; // スレッド生成 m_ComCtrl.start() ; // スレッド開始 } protected void onDestroy() { m_ComCtrl.halt() ; // スレッド終了(スレッドメインループを終了させる独自メソッド) } }

    • ベストアンサー
    • Java
  • C# マルチスレッドにおける例外処理

    下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。 しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。 (try-catchでも例外を捕捉できません) マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか? using System; using System.Threading; class Class1 { delegate void delg(); public static void Main() { delg d = new delg(multi); d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始 System.Threading.Thread.Sleep(500); //マルチスレッドで例外を強制的に投げているので、 //ここまでたどり着く前にアプリケーションが落ちるはず。 //しかし、実際には正常終了。 Console.WriteLine("メインメソッド 正常終了"); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); throw new Exception(); //例外を強制的に投げる。 } public static void call(IAsyncResult ar) { Console.WriteLine("コールバックメソッド実行"); } }

  • C++マルチスレッド処理について

    こんにちは 現在スレッドを作成して,マルチスレッド処理をしようとしているのですが, 全然理解できないので皆様のお力をお貸し下さい。 やりたい事は, (1) メインスレッドからスレッド1を作成。 (2) スレッド1では,ひたすらファイルなどからデータを取得させる。(読み込めなくなるまで) (3) メインスレッドでは,時々スレッド1を止めて,再度処理を続行させたい。 class Sample { public: // Sampleオブジェクト作成,同時にスレッド1を作成 Sample* create(); // スレッド1を止めて,再度動かす void process(); private: // この関数をスレッド1で処理させる // 内部では,読み込めなくなるまで無限ループ? void get(); }; スレッドに関してはイメージが湧くのですが, mutex (必要ですか?) に関しては一向に理解できません。 何を排他制御するのでしょうか。オブジェクト? 関数? 複雑ではなさそうなのですが,今までシングルスレッドの処理のみ書いていたため ピンときません。 よろしくお願い致します。

  • マルチスレッドの疑問点と配列について

    こんばんわ。 VC++.NET2003を用いて、C言語プログラミングを行っています。以下に質問内容をまとめます。 1.現在、マルチスレッドを行っています。マルチスレッドの注意点として、 ・スレッドが複数同時に処理(現在2スレッド)され、それぞれのスレッドで同一のグローバル変数をアクセスする。 ・各スレッドで使用しているスタティック変数はプロセスとして1つの領域に確保される。 と記述されていました。 現在、2スレッド動かしているのですが、2スレッド共通で使用したい変数がある場合は、グローバル変数として宣言してよいのでしょうか? スタティック変数というのは、 static int i を指すのでしょうか・・・・初心者的発言で申し訳ありません。 次にもう一つ質問させていただきます。 配列を整数型で10000要素、静的に用意します。 これを、memset関数ですべての番地に0を初期値として入れておきます。 たとえば、9000という数字があった場合、9000番に整数値9000を格納する。また、56では56番に56を格納する。 そして、最終的に10000要素を走査し0の場所をカウントする。 ということは可能でしょうか?もしよろしければ、サンプルを教えていただきたいと思っています。 よろしくお願い致します。

  • メインスレッドのPostMessageとマルチスレッドでの処理

    お世話になります、fujicafeと申します。 現在Visual Studio 2005にてVC++のプログラムの作成をしており、 お聞きしたいことがありまして、こちらにて投稿させていただきました。 質問したい内容はPostMessageによる非同期呼び出しによるメインスレッド関数の処理と、別スレッドからのメインスレッド関数呼び出しによる処理の違いについてです。 現在、メインスレッドにマルチメディアタイマーを使って、ある時間間隔毎にメインスレッドの関数を呼び出しています。その関数の呼び出しにはPostMessageを使用しています。 その関数の呼び出しをAfxBeginThreadを使用して、メインスレッドから別スレッドを作成し、その別スレッド内にてメインスレッドのオブジェクトを作成して、実行したいメインスレッドの関数を呼び出すと、もともとのPostMessageを使用して関数を呼び出すのとでは処理としてどのような違いがあるのでしょうか? スレッドを別にするということで、メインスレッド側に負荷をかけないといったことが違うのでしょうか? だいぶ検討はずれの質問かとは思いますが、ご教授よろしくお願いいたします。

  • マルチスレッド[ VB.NET 2005 ]

    VB.NET 2005 VC++で作成した通信DLLをマルチスレッドで呼び出すプログラムを作成しています。 マルチスレッドについてご質問です。 ---------------------------------------------------------------- Private Sub ThreadMethod(ByVal aiIndex As UInt32) fSockInit() ← スレッドスタートなので別スレッドで動く End Sub '************************************************** ' フォームロード '************************************************** Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load wkThread(Index) = New Thread(New ThreadStart(AddressOf ThreadMethod)) wkThread(Index).Start() End Sub '************************************************** ' 接続ボタン押下 '************************************************** Private Sub btConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConnect.Click fConnect() ← スレッドを指定して動かしたい End Sub '************************************************** ' パラメータ設定ボタン押下 '************************************************** Private Sub btParm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btParm.Click fParmSet() ← スレッドを指定して動かしたい End Sub ---------------------------------------------------------------- 上記の例では、fSockInitはスレッド別に動作しますが、fConnect、fParmSetはメインスレッドで動作するようになっています。 frmMain_Loadで作成したスレッドを指定(※1)して関数を呼び出すことは出来ないのでしょうか? ※1.「クリックイベント(メインスレッド)→実行するスレッドを指定→関数呼び出し→メインスレッドに戻す」の様に。。。

専門家に質問してみよう