7193|16

11

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

为什么我把某个任务删除了,但任务还在运行? [复制链接]

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函数想延时多长时间都不行,都差不多是一秒的周期在运行,是不是因为这个任务在周期运行,然后周期创建其他任务,导致其他任务也周期运行,只是延时无效???

最新回复

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

回复
举报

11

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
最后一句是“致使延时无效”
 
 

回复

79

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
我记得是不是应该这样子:由其他任务提出删除,自己接收到信号量或者消息,进而删除自己。
 
 
 

回复

463

帖子

0

TA的资源

纯净的硅(中级)

4
 

回复 楼主 fanggengshun 的帖子

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

仅供参考!
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

5
 
谢谢你们热心的回答
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 wstrom 的帖子

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

回复

2131

帖子

0

TA的资源

至上芯片

7
 

回复 6楼 fanggengshun 的帖子

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

回复

11

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 7楼 daicheng 的帖子

谢谢你
对的,我这任务就是创建与初始化任务。。
我也使用过
while(1)
{
OSTaskDel(OS_PRIO_SELF);
}
但还是在不断重复,请问这是什么原因,在复位是怎么回事?是板子的问题吗,这是别人做的板子,芯片是lpc2366
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

9
 
请问各位,ads编写中断函数时,使用__irq与不使用之间的区别
 
 
 

回复

449

帖子

0

TA的资源

五彩晶圆(高级)

10
 

在OSTaskDel(OS_PRIO_SELF);之前加上

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

OSLockNesting=0; //可不加

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

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

回复

6

帖子

0

TA的资源

一粒金砂(初级)

11
 

回复 楼主 fanggengshun 的帖子

while(1);
加在后面
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

12
 
最后一句是“致使延时无效”
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

13
 
强烈建议你单步进OSTaskDel(OS_PRIO_SELF);看一下.
 
个人签名成长,学习
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

14
 
结局呢?
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

15
 

回复 楼主 fanggengshun 的帖子

OSTaskDel的返回值是不是OS_ERR_NONE哇?
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

16
 
错在最后一行代码
OSTaskDel(OS_PRIO_SELF);

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

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

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

     其它代码...

    OSTaskDel(10);     //删除任务Task0      
}
 
 
 

回复

104

帖子

0

TA的资源

一粒金砂(高级)

17
 

回复 楼主 fanggengshun 的帖子

楼主,简单的问题啊,哈哈。所谓删除任务,是删除的任务链表里面的内容,就是相当于没有了身份证。但是程序还在这个任务。只有单任务切换后,就是跳出这个任务,然后系统会去查任务链表。任务链表里面没有了这个任务,就不会以后的切换也就不会再进入这个任务了。这才是任务删除啊,呵呵,总的来说,删除任务,就是这个任务不会再被选用而已。呵呵
关键是删除任务后发生任务切换,切记。可以翻看源码看看,这样就很容易明白
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表