RTP之进程的退出

2019-08-23 17:01:28 浏览数 (1)

在《Task之任务的删除》里介绍了任务是如何退出的,那么进程呢?进程里可以启动多个任务,这些任务的存在与进程的存在是否有关系?

1

主任务返回,即main()函数执行return后,整个进程就会终止。看个例子

执行这个RTP

可以看到taskA并没有执行

把主任务的优先级降低

这次taskA能够执行了。这样就证明了主任务返回时,整个RTP也就退出了

2

如果主任务的工作确实已经做完了,而其它任务还有工作要做怎么办?可以让主任务自己退出,而不是直接返回:调用taskExit()

不管主任务的优先级如何,其它任务都会执行了

可以看到,即使主任务已经退出,taskA还会执行,说明RTP并没有随着主任务一起结束

3

为了让其它任务正常执行,除了主任务调用taskExit(),我在开发阶段常用的方法是taskSuspend()

这样通过主任务的状态,来控制RTP的状态,并且可以随时查看RTP的属性了

4

在2这种情况,即主任务调用taskExit()后,RTP是什么时候退出的呢:RTP不能为空,当最后一个任务退出后,RTP退出!

在RTP中启动多个任务

可以看到,RTP里的每个任务都会被执行,执行顺序取决于它们自己的优先级。只有它们都执行完之后,RTP才会结束

5

任一任务调用exit(),整个RTP就会退出

taskB的优先级高一些,所以它一旦被创建,就会抢占执行

一旦taskB调用exit(),整个RTP就都结束了,所以taskA和主任务就没有机会执行了

其实主任务在调用return正常返回时,就相当于调用了exit()

6

强制终止RTP,即调用rtpDelete()。把之前的例子改一下,这次让多个任务不退出

然后调用rtpDelete()删除RTP

rtpDelete()同时把RTP中的所有任务也删除了

也就是说,如果RTP中某个任务调用rtpDelete(0)的话,就相当于调用了exit(0),有兴趣的童鞋,可以试一试,也看看它俩的源码

总结一下,对于用户态的程序:

  • 任一任务调用taskExit() - 当前任务结束
  • 非主任务返回 - 相当于调用taskExit()
  • rtpDelete() - 进程结束
  • 任一任务调用exit() - 相当于调用rtpDelete()
  • 主任务返回 - 相当于调用exit()

最后留个问题:内核态中,1-任务入口函数返回、2-其它函数返回、3-taskExit()、4-exit()、5-taskDelete(),这五者的关系如何?

这正是:

单任务可退出,无关它人调度。

主任务若返回,进程整体销毁。

我是泰山,专注VX15年!

欢迎关注VxWorks567

一起学习,共同进步!

0 人点赞