扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
小编给大家分享一下VxWorks系统里如何删除任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
创新互联建站基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业棕树数据中心报价,主机托管价格性价比高,为金融证券行业服务器托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。
与任务相关的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系统里如何删除任务”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流