zoukankan      html  css  js  c++  java
  • 自定义任务状态来操作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已经创建
    ");
        }    
    }
  • 相关阅读:
    webbrowser获取页面文章指定段落内容
    webbrowser防止弹窗(IE)
    webbrowser模拟手动输入
    WPF加载Winform窗体时 报错:子控件不能为顶级窗体
    FAQs: 我们可以在那里来为我的没有提升管理权限的应用程序存储用户数据?
    Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)
    必应代码搜索 Bing Code Search 安装
    Microsoft Visual Studio Professional 2012 专业版 下载
    vs2012 aspx 没有设计视图了?
    vs2010 Express 下载连接
  • 原文地址:https://www.cnblogs.com/lizhiqiang0204/p/11527859.html
Copyright © 2011-2022 走看看