This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

sys/bios 6.0中Task下的Task_delete和Task_exit有啥区别?一个task正常退出后自动调用Task_exit,它的作用只是将任务状态切换为Terminated吗?

Other Parts Discussed in Thread: SYSBIOS

具体的情境是这样的,我在查看sys/bios 6.0 的API说明文档时,看到Task_exit函数的作用只提到将任务状态由Running切换至Terminated,我之前一直以为任务调用Task_exit后就应该完成了释放句柄和stack的任务,而Task_delete函数的作用才是释放任务句柄和stack,那是不是意味着要彻底清除任务还要在Task_exit后再调用Task_delete呢?

  • 是的,如果不再需要该任务就可以执行Task_delete将任务所占用的资源全部释放。
  • 非常感谢您的回复!我在主任务线程中增加了删除一个子任务的代码,代码如下:

            while(1)
            {
             if(NULL!=hSndDvcInfoTsk)
             {
              Task_stat(hSndDvcInfoTsk,&sTskStat);
              if(Task_Mode_TERMINATED==sTskStat.mode)
              {
                Task_delete(&hSndDvcInfoTsk);
                break;
              }
              else
              {
               Task_sleep(2);//2ms
               ++dbgDelayCnts;
              }

             }
             else
                 break;

            }

    运行后程序直接崩溃了,提示错误如下:

    ti.sysbios.heaps.HeapMem: line 370: assertion failure: A_invalidFree: Invalid free
    xdc.runtime.Error.raise: terminating execution

    调试时在Task_delete这设了断点,程序运行至断点处还没问题,运行该函数后就提示上面的错误,文档中提到过删除处于终止状态的任务应该是最安全的,而且我要删除的任务也是动态创建的,请问这是什么原因?

  • 如果任务中使用了信号量或者其他同步模块,必须要将相关资源释放掉才能将任务删除,不然有可能会产生错误。检查一下是否存在这种可能性。
  • 您好,要删除的任务中没有用到同步,这个要删除的任务主要是通过socket的send函数向上位机发送一些设备参数,用到了malloc在堆中分配了一些空间,但在任务结束前已经free掉了。
  • 看一下这个链接:
    software-dl.ti.com/.../HeapMem.html

    This could arise when multiple frees are done on the same buffer or if corruption occurred.
    This also could occur when an alloc is made with size N and the free for this buffer specifies size M where M > N. Note: not every case is detectable.
    This assert can also be caused when passing an invalid addr to free or if the size is causing the end of the buffer to be out of the expected range.

    检查一下在你的代码里是否存在这样的情况。

  • 貌似找到原因了!

    在.cfg配置文件中看到一项配置“Task.deleteTerminatedTasks=true”,文档说明中提到这一项的作用是增加一个Idle任务,自动删除动态创建的并已处于Terminated状态的任务,也就是说不需要自己在调用task_delete函数,否则导致对已经释放的stack再次释放,引发Assert。此外,由于我的程序中用到了NDK组件,它强制要求这一配置属性,所以无法修改。

    不过,仍有一个疑问,如果任务已经删除,那么该任务的句柄应该置为NULL,为什么调用Task_stat仍然会返回其状态,还是说自动删除只是释放了任务stack空间,这里不是很清楚。