千家信息网

VxWorks系统里如何删除任务

发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,小编给大家分享一下VxWorks系统里如何删除任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!与任务相关的API由系统库
千家信息网最后更新 2024年11月18日VxWorks系统里如何删除任务

小编给大家分享一下VxWorks系统里如何删除任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

与任务相关的API由系统库taskLib提供。

正常情况下,任务执行完自己的最后一条语句后,就主动退出了。不需要做什么额外操作。

不过任务也可以被动态删除。相关的API有

taskExit()会终止当前任务,并删除任务的Stack与TCB。事实上,执行完最后一条语句时,就会自动调用taskExit()。也就是说一般情况下,代码中没必要显式的调用taskExit()。

exit()在Kernel模式下,与taskExit()的作用相同。不过在用户模式下,exit()要强大一些,它会把当前的进程整个删除,并释放进程的内存空间。事实上,RTP的main()函数在执行完最后一条语句时,就会自动调用exit ()。同样,代码中很少显式的调用exit()。

taskDelete()的参数为0时就是删除任务本身,相当于taskExit(0)。换句话说,taskDelete()不同的地方是,它可以删除其它任务。

可以看到,不管任务是主动退出,还是被删除,都只是删除Stack和TCB(因为任务就是由它俩组成的),这就存在一个很大的风险,即任务在工作时占用的其它系统资源没有被释放。这些系统资源主要有三类:动态申请的内存,IO资源,互斥信号量。所以任务退出或删除时,务必对其资源进行回收(RTP里好一些,动态内存和私有信号量会随着RTP的退出而自动回收)。

另外,任务的退出或被删除,是不会通知其它任务的。而且任务被其它任务删除的话,它自己也是不知道具体的删除位置的。这就无法保证关系资源的回收,甚至可能破坏正在访问的数据。

不过通常情况下,只是在项目的开发调试阶段或软件的异常处理代码中,才会调用这些删除函数。

在正常的代码流程中,为了防止任务执行时被意外删除,可以使用taskSafe()和taskUnsafe()对任务进行保护。例如正在访问共享资源x的任务A突然被删除了,x的数据一致性就没法保证。而A调用taskSafe()后,其它任务试图删除A时,就会被阻塞,直到A调用taskUnsafe()解除保护。这种保护还支持嵌套使用,即调用taskUnsafe()之前,可以多次调用taskSafe(),不过后续需要调用相同次数的taskUnsafe()。

可以看到,文件fd、critical region和信号量都得到了保护。但动态内存buf有未释放的风险。

以上是"VxWorks系统里如何删除任务"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0