osThreadState osState2;//自定義一個線程的狀態 osThreadState 系統枚舉定義如下: typedef enum { osThreadRunning = 0x0, /* A thread is querying the state of itself, so must be running. */ osThreadReady = 0x1 , /* The thread being queried is in a read or pending ready list. */ osThreadBlocked = 0x2, /* The thread being queried is in the Blocked state. */ osThreadSuspended = 0x3, /* The thread being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ osThreadDeleted = 0x4, /* The thread being queried has been deleted, but its TCB has not yet been freed. */ osThreadError = 0x7FFFFFFF } osThreadState; 如果用系統查詢任務狀態函數查找線程狀態 osState2 = osThreadGetState(myTask02Handle); 查詢到的狀態osState2 = osThreadBlocked等於阻塞的情況很容易出現 在這種情況下來操作線程的創建,刪除,掛起,恢復容易導致程序崩潰 osThreadState osState2程序里我們不使用osThreadGetState來查詢線程的狀態 而是在自己的程序里來賦值,比如創建完任務后osState2 = osThreadRunning; 刪除完任務后osState2 = osThreadDeleted; 掛起任務后osState2 = osThreadSuspended; 恢復完任務后osState2 = osThreadRunning; 這樣任務的狀態始終只有三個狀態osThreadDeleted,osThreadSuspended,osThreadRunning。 if(strcmp(ppara1,"任務掛起2") == 0)//收到掛起的命令 { if(osState2 == osThreadRunning)//如果任務是運行狀態,才會執行掛起動作 { if(osOK == osThreadSuspend(myTask02Handle))//如果任務掛起成功 { osState2 = osThreadSuspended;//則改變任務2的狀態為掛起 printf("任務2已經掛起\r\n"); } } } else if(strcmp(ppara1,"任務恢復2") == 0)//收到恢復的命令 { if(osState2 == osThreadSuspended)//如果任務是掛起狀態,才執行任務恢復動作 { if(osOK ==osThreadResume(myTask02Handle))//如果任務掛起成功 { osState2 = osThreadRunning;//則改變任務2的狀態為運行 printf("任務2已經恢復\r\n"); } } } else if(strcmp(ppara1,"任務刪除2") == 0)//收到刪除的命令 { if(osState2 != osThreadDeleted)//如果任務不是刪除狀態,才執行任務刪除動作 { if(osOK == osThreadTerminate(myTask02Handle))//如果任務刪除成功 { osState2 = osThreadDeleted;//則改變任務2的狀態為刪除 printf("任務2已經刪除\r\n"); } } } else if(strcmp(ppara1,"任務創建2") == 0)//收到創建的命令 { if(osState2 == osThreadDeleted)//如果任務是刪除狀態,才執行任務創建動作 { osThreadDef(myTask02, StartTask02, osPriorityIdle, 0, 128); myTask02Handle = osThreadCreate(osThread(myTask02), NULL);//創建任務 osState2 = osThreadRunning;//則改變任務2的狀態為運行 printf("任務2已經創建\r\n"); } }
