[讨论] 为什么我把某个任务删除了,但任务还在运行?

fanggengshun   2011-7-28 16:20 楼主

void Task0 (void *pdata)
{
uint8 err;
uint16 i;
pdata = pdata;
Uart0ReviceMbox = OSMboxCreate(NULL);
Uart3ReviceMbox = OSMboxCreate(NULL);
OSMutexCreate(3,&err);
Test2toTest = OSSemCreate(0);
OSTaskCreate(TaskGetTime,(void *)0,&TaskGetTimeStk[TaskGetTimeStkLenth-1],13);
OSTaskCreate(TaskDealTime,(void *)0,&TaskDealTimeStk[TaskDealTimeStkLenth-1],12);
OSTaskCreate(TaskClrDog,(void *)0,&TaskClrDogStk[TaskClrDogStkLenth-1],1);
OSTaskCreate(TaskTest,(void *)0,&TaskTestStk[TaskTestLength-1],11);
OSTaskCreate(TaskTest2,(void *)0,&TaskTest2Stk[TaskTest2Length-1],10);
TargetInit ();
Gpio_Init();
UART0Init(115200); // 取默认串口0的通信波特率为115200
UART3Init(115200); // 取与模块默认通信波特率为115200
UART1_AllIni(9600); // 取默认串口1通信波特率为300
UART2_AllIni(115200); // 取默认串口2通信波特率为115200
RS485_CSHIGH1;
RS485_CSLOW; // 低电平485允许接收
UART0_SendStr(what);//发送what字符串
OSTaskDel(OS_PRIO_SELF);
}

这时串口仍然周期发送what这个字符串,这是为什么???然后由这个任务创建的其他的任务无论我调用ostimedly函数想延时多长时间都不行,都差不多是一秒的周期在运行,是不是因为这个任务在周期运行,然后周期创建其他任务,导致其他任务也周期运行,只是延时无效???

回复评论 (16)

最后一句是“致使延时无效”
点赞  2011-7-28 16:22
我记得是不是应该这样子:由其他任务提出删除,自己接收到信号量或者消息,进而删除自己。
点赞  2011-7-28 17:31

回复 楼主 fanggengshun 的帖子

我具体分析不出你的问题所在,但是
1、你的任务不符合规范。任何一个任务都是一个死循环
2、删除任务自身需要在死循环中删除
3、如果每秒输出是不是你在外部间隔调用这个“函数”了

仅供参考!
点赞  2011-7-29 11:44
谢谢你们热心的回答
点赞  2011-7-29 13:52

回复 4楼 wstrom 的帖子

试了一下,让这段程序在一个死循环里面也不行,还是在重复运行这个任务,没有删除掉。。除了main(),也没有其他地方创建这个任务。。而且任务真的都需要死循环吗,看过很多例子都不用这样。
点赞  2011-7-29 15:51

回复 6楼 fanggengshun 的帖子

估计你的意思 是创建与初始化后任务就不需要了,那么如果你删除成功任务肯定不运行了
如果这样还运行看看是不是在复位
仿真测试一下,看看问题在哪里
while(1)
{
     OSTaskDel(OS_PRIO_SELF);
}
处处留心皆学问!
点赞  2011-7-29 17:00

回复 7楼 daicheng 的帖子

谢谢你
对的,我这任务就是创建与初始化任务。。
我也使用过
while(1)
{
OSTaskDel(OS_PRIO_SELF);
}
但还是在不断重复,请问这是什么原因,在复位是怎么回事?是板子的问题吗,这是别人做的板子,芯片是lpc2366
点赞  2011-7-30 12:26
请问各位,ads编写中断函数时,使用__irq与不使用之间的区别
点赞  2011-7-30 16:40

在OSTaskDel(OS_PRIO_SELF);之前加上

OSIntNesting=0; //清UCOSII中断标志

OSLockNesting=0; //可不加

应该就没问题了,具体你看下OSTaskDel();这个函数定义就明白了

[ 本帖最后由 SuperStar515 于 2011-8-9 13:38 编辑 ]
世界是个圈,人生也是个圈。
点赞  2011-8-9 13:36

回复 楼主 fanggengshun 的帖子

while(1);
加在后面
点赞  2011-8-26 09:58
最后一句是“致使延时无效”
点赞  2011-8-29 12:47
强烈建议你单步进OSTaskDel(OS_PRIO_SELF);看一下.
成长,学习
点赞  2012-2-26 23:46
结局呢?
点赞  2012-3-18 19:54

回复 楼主 fanggengshun 的帖子

OSTaskDel的返回值是不是OS_ERR_NONE哇?
点赞  2012-4-19 12:00
错在最后一行代码
OSTaskDel(OS_PRIO_SELF);

OS_PRIO_SELF 这个参数应该是你要删除的任务具体的优先级.

比如你要删除任务Tast0,  task0任务的优先级为10;
那么task0的代码如下:

void task0(void *data)
{
    data=data;

     其它代码...

    OSTaskDel(10);     //删除任务Task0      
}
点赞  2012-4-23 13:52

回复 楼主 fanggengshun 的帖子

楼主,简单的问题啊,哈哈。所谓删除任务,是删除的任务链表里面的内容,就是相当于没有了身份证。但是程序还在这个任务。只有单任务切换后,就是跳出这个任务,然后系统会去查任务链表。任务链表里面没有了这个任务,就不会以后的切换也就不会再进入这个任务了。这才是任务删除啊,呵呵,总的来说,删除任务,就是这个任务不会再被选用而已。呵呵
关键是删除任务后发生任务切换,切记。可以翻看源码看看,这样就很容易明白
点赞  2012-4-24 10:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复