BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #3152同步于 2008/12/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

求教一个有关任务删除的问题

ninadw
2008/12/11镜像同步8 回复
初学tornado/vxworks,下面是我的一个测试程序. 问题是在shell中输入progStart任务运行起来后,再输入progStop时没有返回值,VxSim上会一直有输出,也就是任务根本就没有被删除。 请问这是怎么回事呀?代码哪里有问题?谢谢啦! #include "Vxworks.h" #include "taskLib.h" #include "semLib.h" #include "stdio.h" #define STACK_SIZE 2000 /*任务id*/ int tidA; int tidB; /*信号量id*/ SEM_ID semBinary; int progStart(void); int A(void); int B(void); int progStop(void); int progStart(void) { if((semBinary=semBCreate(SEM_Q_PRIORITY,SEM_EMPTY))==NULL) { printf("Binary semaphore create failed\n"); return 1; } if(tidA=taskSpawn("tA",240,0,STACK_SIZE,(FUNCPTR)A,0,0,0,0,0,0,0,0,0,0)==ERROR) { printf("TaskA create failed\n"); return 1; } if(tidB=taskSpawn("tB",200,0,STACK_SIZE,(FUNCPTR)B,0,0,0,0,0,0,0,0,0,0)==ERROR) { printf("TaskB create failed\n"); return 1; } return 0; } int A(void) { semFlush(semBinary); while(1) { taskDelay(sysClkRateGet()*2); printf("ss"); } return 0; } int B(void) { semTake(semBinary,WAIT_FOREVER); while(1) { taskDelay(sysClkRateGet()*2); printf("aa"); } return 0; } int progStop(void) { if(taskDelete(tidB)==ERROR) return 1; if(taskDelete(tidA)==ERROR) return 1; if(semDelete(semBinary)==ERROR) return 1; return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
ninadw机器人#1 · 2008/12/11
着急呀,在线等,顶一下~
lester98机器人#2 · 2008/12/11
呵呵,随着期末的临近问Vxworks的问题越来越多了
eelb机器人#3 · 2008/12/11
我试了没问题啊 还有楼主把程序贴全啊 没有头文件,别人更嫌麻烦 #include "Vxworks.h" #include "taskLib.h" #include "semLib.h" #include "stdio.h"
ninadw机器人#4 · 2008/12/12
很抱歉,下次我会贴全的。 可我又运行了,还是那个问题,难道是环境的问题?
eelb机器人#5 · 2008/12/12
昨天回寝室时看的,没细看 今天又看了一下,确实有问题 if(tidA=taskSpawn("tA",240,0,STACK_SIZE,(FUNCPTR)A,0,0,0,0,0,0,0,0,0,0)==ERROR) 这句话==的优先级大于=的 也就是你先做的==判断,肯定不相等结果为0,然后赋给了tidA,if判断是根据tidA的值,由于tidA是0,所以把报错那段也跳过了 而且tidA和tidB都是0,而不是保存的id名,所以你后来调用stop就出问题了 ps。你的semBCreate居然是对的。。- -!这个迷惑性太强了,注意编程习惯。。
lukewenleshi机器人#6 · 2008/12/12
同样的问题我也遇到过,正如5楼说的。另外感觉的你的semFlush(semBinary);用的不太合适,之所以现在你的任务B也能运行,是因为任务B的优先级比任务A高,任务B抢占任务A先运行了,任务B先semTake()后任务A才semFlush()。你可以看看windview图。
ninadw机器人#7 · 2008/12/12
是这个原因啊,太感谢了!!我会多加注意编程习惯的。再次感谢!
hobby机器人#8 · 2008/12/13
【 在 eelb 的大作中提到: 】 : 昨天回寝室时看的,没细看 : 今天又看了一下,确实有问题 : if(tidA=taskSpawn("tA",240,0,STACK_SIZE,(FUNCPTR)A,0,0,0,0,0,0,0,0,0,0)==ERROR) : ................... 很好啊!真细致 刚才还特意查了一下操作符优先级,才发现赋值的优先级竟然只比逗号高而已 PS:古人云,多加几个括号,什么事情都没有了……或者分两行写也可以嘛