• ベストアンサー
  • 困ってます

リアルタイムOS(RTOS)の割り込み処理について

RTOSではないOSの割り込み処理とRTOSの割り込み処理とでは,作成するプログラムは違うのでしょうか? 例えば,Linux PCでロボット制御のためのC言語プログラム(プログラムAとします)を作成して実行したところ,リアルタイム性が良くなかったため,リアルタイムカーネルをインストールしたとします.そうするとプログラムAを何も書き換えずにそのまま実行するとRTOSの割り込み処理がおこなわれるのでしょうか?それとも,プログラムAをRTOSの割り込み処理をするためのプログラムに書き換えないといけないというものでしょうか?(RTOS専用の割り込み処理のための関数などがあるのでしょうか?) よろしくお願いいたします.

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数79
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

同じ人なんだろうな CPUの作り方をまず読む 8086系には割り込みピン https://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/pc-lega7.htm があり そこがHIになると そこに対応したIRQの番号の割り込みベクタに書かれたアドレスの割り込みが発生する それと別にタイマー割込み がある(クロックベース) 同じく割り込みベクタに書かれたアドレスのプログラムを実行する 割り込み中は割り込み禁止にしないとほかの割り込みが発生し(自分自身も)多重割り込みが発生する また割り込みしたまま重い処理をすると 処理事態が重くなる これらは現在のクロックベースで動くCPU全体に言えるので RTOSと謳うOSも実際にはRTOSではない 電気を使っているので一瞬だと思えるが 電気でも金属帯を流れる速度がありそれが障壁となる CPUの並列化も一緒 分散コンピュータでも一緒 昔は4GHzの壁があったが現在は5GHzの壁 液体窒素で7GHz 世界1を久しぶりに奪還した 富岳でさえ リアルタイムは無理 https://www.nikkei.com/article/DGXMZO60655390S0A620C2MM8000/ 巷で話題のガリュム半導体でも無理 https://pc.watch.impress.co.jp/docs/column/semicon/1220487.html 本来の意味でのリアルタイムは 量子コンピュータを待たなければならない 今は妥協

共感・感謝の気持ちを伝えよう!

質問者からのお礼

いつもありがとうございます.大変助かります.まずはCPUについて勉強したいと思います.

関連するQ&A

  • タイマ割り込みについて

    タイマ割り込みというのは割り込み周期で常に 割り込む関数を実行するのでしょうか? 繰り返し(while,for)を使わなくても常にやるのか? ということを聞いています。 関数とはC言語の関数で、DSPボードでやっています。 よろしくお願いします。 説明が下手ですいません。

  • H8マイコンでの割り込み(シリアルポート入力で)

    マイコン:AKI H8/3048F 開発環境:GCC Developer Lite マイコンとパソコンをRS-232Cケーブルでつないでいます。 ハイパーターミナルを使用して、マイコンを制御したいと考えております。 それで、パソコンのキーボードから入力があった時だけ、割り込みを実行したいです。 割り込みが無い場合は、パソコンでマイコンを制御することができたのですが、割り込みを追加したら、うまくいかなくなりました。 アセンブラを使用せずに、C言語だけでプログラムを完成させたいと思っています。 SCI1からの割り込み処理をするには、どの様にしたらよいのでしょうか? どうか、お願いいたします。

  • Delphiのマルチスレッドの割り込み処理について

    Delphiのマルチスレッドの割り込み処理について教えて欲しいのですが、ファイルをスレッドオブジェクトで作成して クラス名.Execute関数内でSynchronizeメソッドを使用しています。 本にはSynchronizeメソッドは「渡したメソッドが実行され終了するまで待ちます」と書いてあり、テストプログラムを作成してもそうでした。ということはSynchronizeメソッドは普通の関数と一緒のような気がしてしまうのですが、違うのでしょうか? Procedure MyThread.Execute begin Synchronize(AAA); AAAの処理が終了するまで待機している end; Procedure TmyThread.AAA; begin 'したい処理' end;

その他の回答 (1)

  • 回答No.2
  • xitian
  • ベストアンサー率33% (923/2794)

 リアルタイムカーネルは普通のLinuxと互換性を持たせながらリアルタイムアプリケーションをも実行できる仕掛けなので、普通に作ったアプリケーションはリアルタイム性なしで動き、リアルタイムタスクとして書いたプログラムはリアルタイムに動くのでしょう。私はこんなすごいことはやったことが無いけど。プログラムとは語るものか? それともシコシコと組む物か? 3か月で完成するのが待ち遠しいです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます.確かに仰る通りだと思いました.とりあえず手を動かすことから始めます.

関連するQ&A

  • H8/3048Fの外部割り込みで,割り込み処理が止まってしまいます.

    H8/3048Fの外部割り込みで,割り込み処理が止まってしまいます. 近々にH8の外部割り込み機能を動作させなければならず,困っております. 外部割り込み端子のIRQ端子を使って,立下りエッジを検出して割り込み処理を行うプログラムを作っています.しかし,回路に電源投入後は正常にメインの処理が実行され,外部入力によって割り込み処理が行われるのですが,割り込み処理実行後,メインの処理に戻らずに止まってしまいます.(このとき,再び外部入力を与えると割り込み処理のみ実行してくれます.) 外部入力は同じくH8/3048FのI/OピンからのH→L(Lの間隔は1usにしています)を立下りエッジとして入力しており,ハイパーターミナルを用いてPCからのキー入力による任意のタイミングで外部入力を与えています.IRQピンにはプルアップ抵抗を組み,電源投入後,すぐにHに安定するようにしています. コンパイラはGCC Developer Liteです. ちなみにH8初心者です.マイコンのプログラミングはPICなら多少かじっております.また,回路の知識も乏しく,皆様のお力添えを頂ければ幸いです.どうかよろしくお願い致します. 以下は作成したソースコードです.(SCI関数ははずしてあります) #include <3048.h> //割り込みサブルーチン void int_irq0 (void) { int a; a = 3; while(a--) { SCI0_OUT_s("warikomi!\r\n"); //「Warikomi!」をPCに表示 wait_ms(500); //500ms待つ } INTC.ISR.BIT.IRQ0F=0; //割り込み要求フラグクリア } //メイン関数 int main(void) { DI; P8.DDR = 0x00; SYSCR.BYTE = 0; SYSCR.BIT.SSBY = 1; //ソフトウェアスタンバイ SYSCR.BIT.STS = 7; //ソフトウェアスタンバイタイマ 使用禁止 SYSCR.BIT.UE = 1; //CCRのUIビット、ユーザービットに SYSCR.BIT.NMIEG = 1; //NMI立ち上がりエッジで割り込み要求 SYSCR.BIT.RAME = 1; //内蔵RAM有効 INTC.ISCR.BYTE = 0; INTC.ISCR.BIT.IRQ0SC = 1; //立下りエッジ INTC.IER.BIT.IRQ0E = 1; initSCI0(BR38400); //SCI0初期化 EI; SCI0_OUT_s("start!\r\n"); //電源投入して初期化したあと,「start!」をPCに表示 while(1) {   SCI0_OUT_s("waiting\r\n"); //無限ループで「waiting」を500ms毎にPCに表示   wait_ms(500); } }

  • リアルタイムOSが必要かどうか

    Linuxが入ったPCで、AD/DAボードを介してロボット制御(サンプリング周期は1ms)をしようと思うのですが、RT Linuxなどのリアルタイムカーネルは入れた方が良いでしょうか?それとも、1ms程度なら必要ないでしょうか?

  • 定周期での割り込み

    c言語での10msecの割込プログラムを作成しようとしています。 ですが、なかなか割込というものが理解できていません。 シングルタスクでの割込プログラムはどうすればよいのでしょうか?  for(;;) {   func(); //10msecごとに実行したい関数   usleep(100000);  } では割込み処理にはならないんですよね? きちんと理解できていないため、質問もあいまいになってしまっていますが、よろしくお願いいたします。 また、シングルタスク等が説明されているサイトがありましたら、教えていただきたく思います。

  • ART-Linux の割り込み周期について

    現在、ART-Linux を用いた実験装置の制御を考えていまして、先日、redhat 7J をART-Linux化しました。 そこで、割り込み周期について、質問したいのですが、 自分のシステムでは、1msの割り込みは、問題なく動くのですが、 100us(マイクロセック)での割り込みは関数 art-enter() から エラーが返ってきてしまいます。 100usで、割り込みを入れるには、どのようにすればいいのでしょうか? 言い換えると、 art_enter() の第三引数に100を渡して、エラーが発生しないようにするには どのような設定が必要なのでしょうか?

  • 割り込み処理(H14春22)

    以下の基本情報処理問題の解答を見ても理解し切れません。 ご助言お願いします。 【問22】割込みが発生すると,あるアドレスが退避され,割込み処理が実行される。割込み処理が完了すると,退避されていたアドレスが復帰され,割込み直前に実行していたプログラムの実行が再開される。退避されていたアドレスはどれか。 ア 割込みが発生したときに実行していた命令のアドレス イ 割込みが発生したときに実行していた命令の次の命令のアドレス ウ 割込み処理の最後の命令のアドレス エ 割込み処理の先頭の命令のアドレス 【答】イ 割込みが発生すると実行されていたプログラムが中断され、割込み処理が実行される。 割込み処理が完了すると退避されていたアドレスが復帰され、割込み直前に実行していた元のプログラムの実行が再開される。 その場合、割込みが発生したときに実行していた命令の次の命令のアドレスが実行される。 【コメント】 下のような流れになると思っています。 なぜ「次の命令のアドレス」が出てくるのか、教えて頂けませんか。 (1)処理実行中 (2)割り込み発生 (3)(1)を中断し、どこかに退避 (4)(2)を実行 (5)(2)が完了したので、(1)を元に戻す (6)(1)を実行(割り込み前に戻る)

  • Linux上で実行関数使用

    Windowsで作成したphpプログラムをLinuxに移動させようとしています。 そのプログラムの中ではC言語で作成したプログラムの実行形式(.exe)をshell_execを使って実行させています。 Linux上で動作させる場合は.outを実行すればよいとはわかるのですが、 どの実行関数を試してみてもパスが通らないか、通っても動作していなor結果が返ってこないようで、全く反応がありません。 .outを単体で実行させた場合は問題なく動作するので、C言語のプログラム上の間違いではないです。 どなたかLinux上で、phpで実行形式を動かす方法を知りませんか?

    • 締切済み
    • PHP
  • PLCをC言語で記述する場合のメリット・デメリット

    現在、私は、三菱や横河のPLCの制御プログラムを、すべて旧来のラダ―言語で 記述しています。しかし、最近、ラダ―のみだと、大規模になるにつれ、全体の処理の把握や、 高速、割り込み処理などの制御に限界を感じています。 そこで、C言語での記述に変更してはどうかと思っていますが、PLCメーカによって、 専用のソフトや専用のPLCを購入する必要があり、躊躇しています。 そこで質問ですが、PLCをC言語などの高級言語で記述する場合の メリット・デメリットをおしえていただきたく。 できれば、従来のラダ―とC言語両方使ったことがある方であればありがたいです。 ちなみに、私は、PLCでCを使った経験はありませんが、ある程度は習熟しています。

  • PICマイコンにつきまして教えてください。

    PICマイコンにつきましておしえてください。 初心者です、以下3点につきまして教えてください。 (1) PICマイコンを用いて、実験機を作成しているのですが、プログラム上の ある関数の処理時間がどのくらいが予測したいと思っています。 アセンブラの場合、クロック周期の4倍が1サイクルで、各処理毎に○サイクル というのが、データシート上に記載されていることから、ざっくり処理時間を 予測することができるのですが、C言語の場合、予測することはできないでしょうか? 加算、減算、ポート出力制御、if文、AD、、、等の1命令毎の処理時間がどのくらいか、 予測することができますでしょうか? (2) 実験機にはLCDをmain関数で表示させており、またTimer割り込み(5μsec)毎に簡単 な処理をおこなわせているのですが、動作させてみると、 LCDが表示せず(文字なしで高速で切り替えを繰り返しているような感じです。) これは、割り込み間隔が早すぎて、main関数に入る前に随時5μsec割り込みが入って main関数の表示ができていないということなのでしょうか? 割り込み間隔を50μsecにしたところ、うまく表示されましたので。。 (そういったことから(1)の質問をしました。) (3) MPLAB IDC2はデバッグシミュレータがあり、予測が難しい場合、ストップウォッチで、 確認しようと思っています。ブレークポイントを処理最初と最後に設定して、RUNで 時間を確認することができますでしょうか? 処理最初のブレークポイントまでは、どのように実行位置をもっていくのでしょうか? 長くなりましたが、よろしくお願いいたします。

  • ロボットハンドの制御手法

    ロボットの制御プログラミングについて 私は現在大学4年で、卒業研究をしているのですが、今まで就活を理由に研究をさぼってました。。。 しかしそろそろ本格的に着手しないと、卒論が通らないって先生に喝を入れられたので、昨日くらいから本気でやり始めました。 まず、何をやればいいのか全く分からなかったので、とりあえず同じ研究をやってる4年生に聞いてみました。 すると、今まで何もしてなかった自分に怒りを通りこしてあきれを感じているらしく、今どこまで進んでいるかだけ教えてくれて、後は自分で判断して勝手にやってと言われました。。苦笑 で、結局自分で考えてもよくわからなかったのでとりあえずロボット(ロボットハンド)を動かしているプログラムを見てみようと思い、初めて触るLinuxのPCにビクビクしながらやっとの事でプログラムを見る事が出来ました。 さて、前置きが長くなりましたがここでみなさんの知恵をお借りしたいのです。 そのプログラムはC言語で書かれていたのですが、今までに見たCとは全く違うものでした。 コメントとかを読んでも全くよくわかりません。 ”スレッド”がどうとかこうとかって書かれていたりして、ググってみたりしたのですがそれでも分からなかったです。 色々とはじめてみる関数が多かったので、ヘッダファイルとかも読んでみたのですが、ヘッダファイルには何か定義みたいのばっかで何が書いてあるのか理解できませんでした。 (ちなみに自分のCに関する能力はC言語入門書をちょっとかじったくらいです。なんかifとかforを使って簡単な計算式をやったりとかは出来ますが、ポインタとか構造体ってのは全く分かりません) ここまで分からないと自分でも笑うしか出来ないのですが、マジで一体何から手をつけて良いのか分からないです。 とりあえずは制御のプログラムを解析して、新しく動かす用(もう少し難しい制御手法)を作るのでしょうが、プログラムの解析が全く進まなくて困り果てています。 こういった全く理解できないプログラムを理解するにはどうしたらいいのでしょうか。 ロボットハンドのような機械を制御する用のプログラムの分かりやすい入門書等ありませんでしょうか。 どなたかご教授していただけると大変うれしいです!

  • C言語からC++の関数をコールする方法について

    初めて質問させて頂きます。 質問は2つあります。 ●1つ目の質問です。 この度、C言語ベースのプログラムに、C++で作成した関数を使用することになりました。 方法としてextern等を駆使しつつ、ラッパー関数を使って対応しております。 そこで質問なのですが、この場合、ラッパー関数に使用するファイル形式はcppまたはcのどちらが正しいのでしょうか?(どちらでも動きました) ●2つ目の質問です。 Windows環境(vs2005)では無事、CからC++の関数を呼ぶことに成功はしました。 しかし、本当に動かしたいのはLinuxでの環境になります。 先程作成したラッパー関数のファイルとC++で作成した関数のファイルをライブラリ(soファイル)化したものを使用し、コンパイルとリンクは問題なく通すことに成功したのですが、 実行させてみると、Cの関数からラッパー関数をコールしているのは確実なのですが、ラッパー関数の処理を通らず、プログラムが止まってしまいます。 試しにラッパー関数の処理を「return 0;」だけにして実行させてみましたが現象は変わらずでした。 そのため、ラッパー関数を呼ぶための何かに問題があると思っています。 ここで質問なのですが、ビルドのときにライブラリをリンクさせるだけでは駄目なのでしょうか。また、他に思い当たることがありましたらご教示頂きたいです。 Windows環境(vs2005)では期待する動作をしているためプログラムは問題ないと思っています。