自定義任務狀態來操作FreeRTOS任務的掛起,恢復,刪除


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");
    }    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM