2017-07-18 18 views
0

Visual Studio 2010でWINAPIを使用して埋め込みHWシミュレータを開発しようとしています。 割り込みをエミュレートしようとしたときに問題が発生しました... 割り込みの動作は... threadAが動作している間に割り込みが発生します したがってthreadAがホールドされ、ISR機能を実行するためにジャンプします。 ISR機能が行われている 後、スレッドAが再開して作業を続けることができます...MSDNは割り込みの動作をシミュレートします

私はスレッドAを一時停止し、 がどうなる割り込みスレッドと呼ばれるスレッドは、そこにあるマルチスレッド によって、このアクションをシミュレートしてみましたISR操作を行い、次にthreadAを再開します。

しかし、問題は私のコードprintf( "b")は表示されません。

MSDNで割り込みをシミュレートする方法はありますか? 、 のみ特定のプロセスに送信することができます...私は、 をこの疑問を解決するためにsingalsとsignalhandlerを使用する方法について考えられますが、Windowsの信号が特定のスレッドに送信できないように見えます

HANDLE thd_main; 
HANDLE thd_int; 
HANDLE Array_Of_Thread[2]; 

thd_main(){ 
    while(1){ 
     /* polling for jobs and do specific operation */ 
    } 
} 

thd_int(){ 
    while(1){ 
    if (WaitForSingleObject(g_timer, infinite) == WAIT_TIMEOUT){ 
     printf("a"); 
     suspendthread(thd_main); 
     printf("b"); 
     /* ISR operation */ 
     resumethread(thd_main); 
    } 
    } 
} 

int main() 
{ 
    thd_main = CreateThread(NULL, 0, 
      Thread_main, NULL, 0, NULL); 

    thd_int = CreateThread(NULL, 0, 
      Thread_int, NULL, 0, NULL); 
    Array_Of_Thread[0] = thd_main; 
    Array_Of_Thread[1] = thd_int; 
    WaitForMultipleObjects(3, Array_Of_Thread_Handles, TRUE, INFINITE); 
    closehandle(thd_main); 
    closehandle(thd_int); 
    return 0; 
} 

答えて

0

あなたは使用しないでくださいSuspend/ResumeThreadを使用してスレッド同期を行う! 主にこれらの関数は、デバッグ目的で存在します。

この機能は主それは、スレッドの同期のために使用されることを意図し ないデバッガで使用するために設計されていますSuspendThreadため

参照ドキュメントは、MSDNのドキュメントを参照してください。

主な問題は、スレッドをブロックしたことを知らないことです。多分、このスレッドでロックされているリソースを使用するだけです。デッドロックが発生する可能性があります。特にスレッド開始段階でCRTオブジェクトを使用すると、デッドロックの問題が発生する可能性があります。しかし、同期オブジェクトを使用しても失敗する可能性があります。

関連する問題