OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3467|回复: 16

uCOSII删除任务请求问题。删除过后,另一个任务不能运行!

[复制链接]

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
发表于 2017-8-18 20:06:29 | 显示全部楼层 |阅读模式
10金钱
根据任哲老师的《嵌入式实时操作系统uCOS-II原理及应用》,实现功能:在UCOSII中创建了两个任务,AppStartTask()和youtask(),任务AppStartTask()请求删除youtask()。AppStartTask()任务打印“M”,youtask打印“Y”;


遇到的问题:AppStartTask()任务请求删除youtask()任务以后,AppStartTask()不能正常打印。
附源码:运行环境VS;可以在win10上运行。
uCOS初学者,希望大家指教,谢谢!!!   文件太大了,上传受到限制,下面是源码的百度云链接
链接:http://pan.baidu.com/s/1dEC5SXF 密码:4hzd

无法可挡
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-19 08:39:08 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2017-8-19 08:42 编辑

我记得之前看资料,请求删除后,被删除的任务自己判断有没有请求删除自己,然后自己删除自己。
小小蜗牛
回复

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
 楼主| 发表于 2017-8-20 10:29:23 | 显示全部楼层
jiutianshenjian 发表于 2017-8-19 08:39
我记得之前看资料,请求删除后,被删除的任务自己判断有没有请求删除自己,然后自己删除自己。

void youtask(void *pdata)
{
        pdata = pdata;
       
        while(1)
        {
                printf("Y");
                OSTimeDlyHMSM(0, 0, 0, 500);
                OS_ENTER_CRITICAL();
                if(OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)
                {
                        printf("YouTask: 我必须要删除自己\n");
                        OSTimeDlyHMSM(0, 0, 0, 500);
                        printf("YouTask: 我已经删除了自己\n");
                        OSTaskDel(YOUTASK_PRIO);
                }
                OS_EXIT_CRITICAL();
        }
}
是这样写的,根据任哲老师那本书也是一样的。成功删除以后,请求删除方也不能运行了
无法可挡
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-21 10:39:03 | 显示全部楼层
那看你请求删除任务,返回值判断。
小小蜗牛
回复

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
 楼主| 发表于 2017-8-21 14:23:35 | 显示全部楼层
jiutianshenjian 发表于 2017-8-21 10:39
那看你请求删除任务,返回值判断。

您说的是什么意思,可以详细一点吗?   请求任务删除已经判断了呀, 要是返回值为OS_TASK_DEL_REQ,就调用OSTaskDel(),就是写的呀?
无法可挡
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-21 14:51:18 | 显示全部楼层
你说请求删除方不能运行了
请求删除方怎么不运行了
小小蜗牛
回复

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
 楼主| 发表于 2017-8-21 16:19:45 | 显示全部楼层
jiutianshenjian 发表于 2017-8-21 14:51
你说请求删除方不能运行了
请求删除方怎么不运行了

被删除方也就是YOUTASK()任务被删除以后,AppStartTask()任务是请求删除,它的请求完成以后,自己还应该继续打印字符"M"呀。运行的现象是请求完成以后AppStartTask()任务直接停止了,没有继续打印字符“M”
无法可挡
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-21 16:24:58 | 显示全部楼层
你先把临界区中的延时去掉
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-21 16:36:21 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2017-8-21 16:45 编辑
黑暗主宰 发表于 2017-8-21 16:19
被删除方也就是YOUTASK()任务被删除以后,AppStartTask()任务是请求删除,它的请求完成以后,自己还应 ...

我的意思是,你把AppStartTask()任务也贴出来吧。
两个任务都给别人看看还有就是现象是什么样?打印哪里出问题了
小小蜗牛
回复

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
 楼主| 发表于 2017-8-21 16:59:27 | 显示全部楼层
jiutianshenjian 发表于 2017-8-21 16:36
我的意思是,你把AppStartTask()任务也贴出来吧。
两个任务都给别人看看还有就是现象是什么样?打印哪里 ...

void  AppStartTask (void *p_arg)
{       
        static UINT8 i = 0;

    p_arg = p_arg;
   
        OSTaskCreate(youtask, (void *)0, (OS_STK *)&YOUTASK_STK[YOUTASK_SIZE-1], YOUTASK_PRIO);

    while(1)                                 
        {   
                if(i > 50)
                {
                        printf("\n");
                        i = 0;
                }
                i++;
                printf("M");                                   
        OSTimeDlyHMSM(0, 0, 0, 500);     
                if(i == 30)
                {
                        while(OSTaskDelReq(YOUTASK_PRIO) != OS_TASK_NOT_EXIST)
                        {
                                printf("MyTask:我要求YouTask自己删除自己\n");
                                OSTimeDly(1);
                                break;
                        }
                        printf("M");
                }
                else
                        continue;
    }
}
您看看,是不是那个出问题了
无法可挡
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-21 17:20:20 | 显示全部楼层
到底哪里出问题了?
打印了什么?该打印什么没打印?
另外,你不要给临界区加延时。
while(OSTaskDelReq(YOUTASK_PRIO) != OS_TASK_NOT_EXIST)这句是直接成立了吗?那不是直接打印了M
你把你的现象贴出来,本来应该怎样,结果怎样.
小小蜗牛
回复

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
 楼主| 发表于 2017-8-21 17:35:53 | 显示全部楼层
jiutianshenjian 发表于 2017-8-21 17:20
到底哪里出问题了?
打印了什么?该打印什么没打印?
另外,你不要给临界区加延时。


这个是打印的内容,删除任务后,应该继续打印M,现在是删除任务后没有动静了
无法可挡
回复

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
 楼主| 发表于 2017-8-21 17:40:18 | 显示全部楼层
无法可挡
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-21 17:48:42 | 显示全部楼层

恭喜你,你的问题已经描述清楚了。
1.你去掉进入和退出临界区,试下有变化吗?
2.你的ucosii和我的为什么不一样呢?返回值宏定义名字都不同。
3.不打印之后程序跑到哪里了,能跟踪吗?
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2017-8-21 17:53:02 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2017-8-21 17:59 编辑

任务删除了自己,后面临界区能否退出?
删除自己前释放占用资源,临界区进去了没出来也算吧。

只有你去试试了。

小小蜗牛
回复

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-1-5
在线时间
16 小时
 楼主| 发表于 2017-8-24 21:39:43 | 显示全部楼层
代码本事的逻辑是没有问题的,只是移植到VS环境下出现了一点问题,在虚拟机下用BC3.1进行编译,代码运行的结果和预想的一样。但是现在vs下的工程,出现问题在哪还没有发现,望论坛内的高手可以指点一下,谢谢!
无法可挡
回复

使用道具 举报

14

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
500
金钱
500
注册时间
2017-4-25
在线时间
110 小时
发表于 2017-9-15 14:19:37 | 显示全部楼层
我只知道删除任务是任务接受请求删除自身(就是不运行任何调用跳转到该任务的事件)
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表