2

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

ありがとう。

4

3 に答える 3

1

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

RTOSをまだお持ちでない場合は、RTOSを調べるか(数百あります)、プロトスレッドのような単純なものを組み込むことを検討してください:http ://www.sics.se/~adam/pt/

于 2009-04-10T19:33:00.593 に答える
1

つまり、2 つのスレッドがあります。1 つはカーネルを実行し、もう 1 つはアプリを実行していますか? カーネル内の関数に ReadyToYield() を作成する必要があります。これは、アプリケーションを閉じてもよい場合にアプリケーションが呼び出すことができます。ReadyToYield() は、カーネル スレッドにフラグを立てて良いニュースを伝え、カーネル スレッドが何をすべきかを決定するまで待機します。次のようになります。

volatile bool appWaitingOnKernel = false;
volatile bool continueWaitingForKernel;

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

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

カーネルスレッド呼び出しで:

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

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

明らかに、ここでの実際の実装は基盤となる O/S に依存しますが、これが要点です。

ジョン。

于 2009-04-10T19:36:20.973 に答える
0

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

(2) コンテキストの切り替えを行うときは、状態を保存する必要があります。

于 2009-04-10T19:49:38.820 に答える