2009-04-10 18 views
2

私は、複数のアプリケーションを実行できる組み込みデバイス用のフレームワークを作成しています。アプリケーションを切り替えると、現在のアプリケーションの状態が正しくクリーンアップされるようにするにはどうすればよいですか?たとえば、1つのアプリケーションで集中的なループを実行していて、そのループがまだ終了していない間に2番目のアプリケーションを実行するよう要求されたとします。ループが終了するまでループを含むオブジェクトを削除することはできませんが、ループするオブジェクトが削除可能な状態になっていることを確認する方法は不明です。完了したら私に通知する何らかのポーリングメカニズムやイベントコールバックが必要ですか?C++で割り込みを処理する

ありがとうございました。

+0

割り込みが発生した場合は、スケジューリングとマルチタスクが必要なのでしょうか?割り込みは、通常、低レベルの外部トリガを示します。 – lothar

答えて

1

通常、このタイプのものを実行する必要がある場合は、複数のタスクを処理できるOS/RTOSが必要です(たとえOSが単純な自作型のものであっても)。

すでにRTOSを持っていない場合は、一つに見える(利用可能な何百もある)またはprotothreadsのような単純なものを組み込むことを検討することもできます。実行している1:http://www.sics.se/~adam/pt/

1

だから2つのスレッドを持っていますカーネルと1つはアプリを実行している?あなたのカーネル内でReadyToYield()という関数を呼び出す必要があります。この関数は、あなたがアプリケーションを閉じることができたらうれしいときに呼び出すことができます。 ReadyToYield()はカーネルスレッドにフラグを立てて良い知らせを与え、カーネルスレッドが何をすべきかを決めるまで待って待ちます。カーネルスレッド呼び出しで

void ReadyToYield(void) 
{ 
    continueWaitingForKernel = true; 
    appWaitingOnKernel = true; 
    while(continueWaitingForKernel == true); 
} 

:アプリのスレッド呼び出しで

volatile bool appWaitingOnKernel = false; 
volatile bool continueWaitingForKernel; 

:それはこのようになります明らかに

void CheckForWaitingApp(void) 
{ 
    if(appWaitingOnKernel == true) 
    { 
     appWaitingOnKernel = false; 

     if(needToDeleteApp) 
      DeleteApp(); 
     else 
      continueWaitingForKernel = false; 
    } 
} 

、実際の実装は、ここに根本的に依存しますO/Sが、これは要点です。

ジョン。

0

(1)スレッドセーフなコードを書く必要があります。これは組み込みシステムに固有のものではありません。

(2)コンテキストスイッチを行うときに状態を保存する必要があります。

関連する問題