TRONのラウンドロビンに関する疑問

このQ&Aのポイント
  • SH704x-10MHzでiTRONのお勉強を始めました。従来のシングルスレッドだった時、タッチパネルに加工処理したデータを表示させるのに約0.5秒ほどかかっていた処理が今回Taskとして組み込むと約4.5秒かかるようになってしまいました。
  • 更にタッチパネルの状態をチェックするTaskも同じ優先順位で組み込むと67秒もかかるようになってしまいました。サンプルプログラムはCMT0の1msec割込み毎にirot_rdqを実行していたのですが、10msec経過してからirot_rdqを実行する方法に変更したところ5.6秒に劇的に短縮されました。
  • CMT0処理(irot_rdq含むとき)はトレースを追ってみると約0.2msecかかっているのですがCMT0内の処理が多すぎるのでしょうか?ネットでは同件のような情報が見つからず。書籍を購入するにも知りたい事が書かれているのか調べられず。
回答を見る
  • ベストアンサー

TRONのラウンドロビンについて

SH704x-10MHzでiTRONのお勉強を始めました。 従来のシングルスレッドだった時、 タッチパネルに加工処理したデータを表示させるのに約0.5秒ほどかかっていた処理が 今回Taskとして組み込むと約4.5秒かかるようになってしまいました。 (この時アイドルTaskと上位優先順位Task有り。但し上位優先順位Taskはデータ表示処理を起床させ自らはスリープ) 更にタッチパネルの状態をチェックするTaskも同じ優先順位で組み込むと67秒もかかるようになってしまいました。 サンプルプログラムはCMT0の1msec割込み毎にirot_rdqを実行していたのですが、10msec経過してからirot_rdqを実行する方法に変更したところ5.6秒に劇的に短縮されました。 が、本来の速さにはまだまだ程遠い状況です。 irot_rdqは100msecにもしてみましたが10msecの時より若干速くなっただけでした。 CMT0処理(irot_rdq含むとき)はトレースを追ってみると約0.2msecかかっているのですが CMT0内の処理が多すぎるのでしょうか? それともirot_rdqは「こういうもの」なのでしょうか。 ネットでは同件のような情報が見つからず。 書籍を購入するにも知りたい事が書かれているのか調べられず。 サンプルプログラムは簡単すぎて参考にならず。 どなたかご存知の方いらっしゃいましたら是非 ご指導お願いいたします。

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

こんばんは。 CMT0の処理、とおっしゃっているのは、おそらくコンペアマッチタイマーによる割り込み処理のことだと思いますが、割り込み処理の中にいろいろ書き込まれているのでしょうか?  割り込み処理の最中はOS(タスクスケジューラの)管轄外になります。割り込み処理中は、イベントフラグを立てたり、タスクを起こしたりするだけにとどめて、極力軽量化して、処理に時間がかかるものはタスク内で実行することをお勧めします。

miyuyu
質問者

お礼

Interestさん。回答ありがとうございます。 CMT=コンペアマッチタイマーの事です。 TRONを始めてまもなく、またハード面の細かい所まで考えてプログラミングした事が無かった為 ハードウェアマニュアルに記載されていた記号をそのまま使ってしまいました。 コンペアマッチタイマ割込み処理は従来から有った CMT0フラグクリア処理 時間カウント用変数のインクリメント タッチパネルの押下のチェック 今回追加したのは 10msec毎にirot_rdq用の変数1個インクリメント 末尾に sys_clk();sys_tim();ret_int();の処理です。 (3つはサンプルのままコピー) > 極力軽量化して CMT0内部での処理を別タスクを分けられるか検討してみます。 ありがとうございました。

その他の回答 (1)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

ANo.1 = Interest です。 予想通り、割り込み処理の中にいろいろ書き込んでらしたのですね。 > CMT=コンペアマッチタイマーの事です。 私はSH系のマイコンをさわったことがあるのでわかりましたが、他のマイコンになると同じ機能でも名称が異なることにご注意ください。 miyuyuさんが使用されているITRONがどこのものでどう実装されているかわかりませんが、おそらくCMT0割り込みはITRONのシステムクロックを作っているものと思います。(私が個人で使用しているミスポのNOIRi3ではそうなっています。)これにはまったく手を加えないのが得策です。 もし一定の時間間隔で何らかの処理をしたいのでしたら、「周期起動ハンドラ」を使ってタスクをwakeupします。(周期起動ハンドラは”ハンドラ”ですからタスクではありません。極力軽く作りましょう。)

miyuyu
質問者

お礼

> 他のマイコンになると同じ機能でも名称が異なる~ そうなのですか。以後気をつけます。勉強になりました。 > 「周期起動ハンドラ」を使って なるほど、そのような使い方をするのですね。 まだ試していませんが、期待できそうな気がします。 結果が出たらご報告いたします。

miyuyu
質問者

補足

/*--------------------*/ Interestさん コンペアマッチタイマー(CMT0)に有った従来処理を 周期起動ハンドラにするため、色々な波及が出てしまい手間取ってしまいました。 連絡送れて申し訳ありません。 昨日最も速かった条件で3.5secだったのを 0.9secまで短縮する事ができました。 本当にありがとうございました。 もしよろしければもう少しInterestさんの知識を分けて頂きたいのですが よろしければご教示ください。 1.CMTは何秒周期でご使用されていますか? 2.その時irot_rdqは何秒毎に実行していますか? 3.CMTと同じインターバルで周期起動ハンドラは動かせないのでしょうか? (同じインターバルにすると動かなくなってしまいました) 4.有用だった書籍などあったら紹介してください。 ■ありがとうございました。(^^♪

関連するQ&A

  • 定周期での割り込み

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

  • イベントフラグを複数のタスクで待った時の優先順位

    μiTRONのイベントフラグ待ちで、 1つのイベントフラグを複数のタスクで同時に待っていた場合に 一番最初に動くタスクは、優先順位順でしょうか? それとも、先に待機した順でしょうか?

  • タスク管理

    以下の問題の答えとその解き方を詳しく教えてください。    2つのタスクA,Bを同時に実行した場合、2つのタスクが処理を終了するまでにかかる時間は    何ミリ秒か。    なお、タスクAの優先度の方が高いものとする。    タスクA: CPU(10ミリ秒)→I/O(50ミリ秒)→CPU(60ミリ秒)    タスクB: CPU(40ミリ秒)→I/O(50ミリ秒)→CPU(30ミリ秒) よろしくお願いします。

  • [コンピュータアーキテクチャ]割り込みについて

    (1)割り込みの優先順位はどのような方法で決定されているか説明しなさい。 (2)入出力割込みの必要性について、プロセッサと入出力装置における時間経過にしたがって具体的に説明しなさい。 コンピュータアーキテクチャについて、以上の2つの設問が分かりませんでした。助言をお願いします。 (1)の設問では、インターネットで調べたのですが、割り込みなどのプロセスやタスクはディスパッチ処理などによって割り当てられている、ということが分かりました。 調べると、例えばディスパッチ処理では、「ディスパッチの優先順位はタスク毎に決められており,作られた時刻に関わらず優先順位の高いタスクから順にディスパッチされていく」ということまでは分かったのですが、その優先順位はどうやって決められているのか?ということが分からず困っています。 そして(2)の設問では、調べただけでは分かりませんでした。「入出力装置における時間経過」の意味が分からず、どう具体的に説明していいのかも分からない状況です。 以上の2点についてご回答お願いします。 質問に補足しなければいけない点などがあればコメントしてください。

  • ラウンドロビン

    ラウンドロビンで タスクがA,B,Cほぼ同時に投げ込まれ それぞれ6,2,2分かかり、 タイムスライス(クオンタイム)が2分で、 タスク切り替えに0.5分かかるとき、 平均ターンアラウンド時間はどうなりますか? ラウンドロビンは A→B→C→A×2 or A→B→C→A→A どちらですか?

  • 【Win2003Server】コマンドから追加したタスクが起動しない

    Windows 2003 Serverを利用しています。 コマンドからタスクを追加したいため、 次のコマンドを実行しました。 schtasks /create /tn "sample" /tr "C:\Program Files\sample\sample.exe" /sc daily /st 22:00:00 コマンド自体は成功してタスクが追加されたのですが、 実行させたいsample.exeが起動しません。 手動でタスクを追加したときと比べると、 [タスク]の[実行するタスク名]がダブルコーテーションで囲まれているか、 囲まれていないかの違いがありました。 コマンドから追加したほうがダブルコーテーションで囲まれていません。 ダブルコーテーションで囲まれていないために、 半角スペースが含まれるパスにある「sample.exe」を実行できないのだろうと 思うのですが、何か解決策はございませんか? もしご存知でしたら、教えて頂けませんか? ぜひよろしくお願い致します。

  • FTP ダウンロードの中断

    Linux-2.6.18-at9 Debianです。 一度受信を開始してしまったFTP転送を中断、再開はできるのでしょうか?。 状況: タスク1.ハードウエアへのデータバースト転送(ioctlによる) : 約5msec タスク2.Host PCへのステータス転送(PC側がClientのTCP/IP) :約2msec タスク3.PCから大量データをファイルの形で受信するタスク(FTP Client) :残り が基本タスクとなるシステムがあります。これがWhile文でLoopしており、約50msecに1回タスク1,2が実行されなければなりません。 FTP Client機能によるファイル受信は50msecのloop時間よりははるかに長く設定されています。 そこでタスク1の実行を阻害しないことを期待してFTP受信タスクを別スレッドにしました。しかし別スレッドではあっても一度始まってしまったファイル受信は中断はできないらしく明らかにタスク1の実行は影響を受けています。 次に別スレッドではなくこれを別のProcessにしました。しかし結果は多少は改善しましたが基本的には同じです。 ファイル受信processの要旨は以下のごとくです: while(1){ errno = 0; if(msgrcv(msqid, &message, BUFSIZ, read_type, 0) == -1){ perror("msgrcv failure"); break; } if (inhbit){ if (filexchg){ system("msh fileRcv.sh file.1"); // msh : bash機能のshell fileRcv.sh : Shell Script else system("msh fileRcv.sh file.2"); } } 二つのファイルを親processの指令とタイミングで交互にダウンロードします。 ftpクライアントの起動にはshellを使っています。 タスク1の実行サイクルが回ってきたら、親がinhibitを発行、FTP受信を中断してもらいたいのですが、bashという別のprocessにコントロールを渡しているのですから、本質的に不可能なことをしているように思います。 仮にFTPのフロー制御ができても再開したときFTP転送の障害が発生する懸念もあります。 親、子間の優先順位をいじることで親のタスクを無条件に優先させる設定ができても親にはIldeループもあり子からみた識別はできません。 タスク1の割り込み化も試みたのですが、実現できませんでした。 何か解決策があればお願いいたします。 TCP/IPにすればパケット単位のフロー制御ができることはわかっているのですが、転送速度が問題になります。

  • VBの実行時の処理の流れ(仕組み)について教えて下さい

    WindowsXp-Pro上でVB.NET2003を使用しています。VB.NET初心者です。 VB.NETはコーディング後デバッグを行いエラーがなければ実行される訳ですが、実行時の処理の流れと言うか、仕組みについてご伝授頂きたいと思います。 VB.NETにおいてはオブジェクト指向が進んでおりコーディング作業時は全体の流れを考えなくても、クラス内でのインスタンスやサブルーチン・関数ルーチン、フォームロード時の処理、モジュール内での処理等のコーディングのみを考えていれば実行できるようになっています(少なくとも今まで私が作成したプログラムはそうでした)。しかし、色々なサンプルプログラムを作っているとこれはクラスで指定した方が良い処理とかモジュールで指定した方が良いのではと思うことが多々あります。 プロジェクトやフォーム、クラス、モジュール、コンポーネントクラス、ユーザーコントロール、データフォームウィザード、継承コントロール (これらはVisualStudioの「プロジェクト」メニューをクリックした時の項目です) 等の処理の順序が判っていればもっと効率的な処理を適材適所に配置できるのではないかと思います。 これらをコーディングレベルで結構ですので機械内での処理の順序をご説明頂ければ幸いに思います。現在のところコンピュータは並列処理はできないので必ず優先順位がつくと思うのですが、未熟な為VBの全体像がつかめず処理の流れも判らずにいます。 よろしくお願い致します。

  • タスクスケジューラに登録したタスクの実行優先度を上げたい

    Excel-VBAで作成したデータ処理プログラムを, タスクスケジューラにて定時実行させてるのですが, 処理が遅くて苦慮しています。(OS:Win2000Server) 単独実行だと5分(CPU使用率max100%)で完了するものが, タスクスケジューラからの実行だと30分(CPU使用率10%以下)もかかります。 タスクスケジューラへ登録したタスクの優先度を上げる術はないものでしょうか。

  • Linuxアプリケーション開発について

    Linuxで複数のプログラムを実行する場合の振る舞いについて教えてください。 現在、自前で作成したlinuxのコンソールプログラムを2つ起動させて実行をしています。 1つのプログラムは、指定したディレクトリの画像ファイルを順番に処理していくもので、 2つめのプログラムは、1つめのプログラムの進行状況と結果を監視して状況を表示するものです。 実行は、2つ目の監視用プログラムを"&"オプションで実行させた後に、1つ目のプログラムを実行させています。 前置きが長くなってしまいましたが、ここで、疑問なのですが、今、プログラムとしては2個実行していますが、プログラム開発ではカーネルで複数のタスク管理をすると言った内容の記述はソースにはありませんが、2つのプログラムがうまく同期して動作しているように見えます。 カーネルの本などに載っているタスク管理を実現するためにプログラム開発時に何かする必要はないのでしょうか。 それとも、カーネルがTCBとか使用してカーネルのタスク管理機能に必要なタスクに分割した上で切り替えを行ってくれるのでしょうか? また、1個のプログラムだけを実行させる場合も、プログラム自体、複数のタスクとして分割されてカーネルからタスク管理されながら順番にタスクを実行しているような気がするのですが、ソースでタスク分割の記述をしないといけないのか、それともやはりカーネルが実行前にタスクへの分割をしてくれるのでしょうか? 長文で読みにくい上、的外れなことを言っているかもしれませんが、ご回答よろしくお願い致します。