• 自定义任务状态来操作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已经挂起
    ");
            }
        }    
    }
    else if(strcmp(ppara1,"任务恢复2") == 0)//收到恢复的命令
    {
        if(osState2 == osThreadSuspended)//如果任务是挂起状态,才执行任务恢复动作
        {
            if(osOK ==osThreadResume(myTask02Handle))//如果任务挂起成功
            {
                osState2 = osThreadRunning;//则改变任务2的状态为运行
                printf("任务2已经恢复
    ");
            }    
        }
    }
    else if(strcmp(ppara1,"任务删除2") == 0)//收到删除的命令
    {
        if(osState2 != osThreadDeleted)//如果任务不是删除状态,才执行任务删除动作
        {
            if(osOK == osThreadTerminate(myTask02Handle))//如果任务删除成功
            {
                osState2 = osThreadDeleted;//则改变任务2的状态为删除
                printf("任务2已经删除
    ");
            }
        }    
    }
    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已经创建
    ");
        }    
    }
  • 相关阅读:
    数组和排序算法(冒泡、选择、插入排序)
    异常
    线程的五个状态,sleep和wait
    ArrayList、Vector、LinkedList
    String,StringBuffer,StringBuilder的区别
    Math.round(),Math.ceil(),Math.floor()的区别
    单例模式之双重锁模式、静态内部类模式、饿汉模式、懒汉模式,和安全的懒汉模式
    工厂模式简单的汽车工厂
    存储过程的优点
    数据库SQL特点数据查询,数据操纵,数据定义,数据控制,建立索引, 事务acid,数据库隔离级别
  • 原文地址:https://www.cnblogs.com/lizhiqiang0204/p/11527859.html
Copyright © 2020-2023  润新知