OpenEdv-开源电子网

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

UCOS II 系统运行创建了多任务,但是只有一个任务运行了.

[复制链接]

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2012-3-6
在线时间
5 小时
发表于 2014-9-25 09:50:13 | 显示全部楼层 |阅读模式
5金钱
UCOS II 系统运行创建了多任务,但是只有一个任务运行了.用的是综合实验的代码修改过来的.


运行以后,发现有些功能没执行,然后设置断点时候发现 只有任务watch_task在执行,其他几个任务没执行.不知道是什么问题导致的.各位提个建议我尝试下.

最佳答案

查看完整内容[请看2#楼]

任务里面加了dealy函数没有,如果它的优先级是最高的,又没有dealy,就会出现这样的情况,看看是不是这样的情况,如果不是,就是其他问题了。
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-25 09:50:14 | 显示全部楼层
任务里面加了dealy函数没有,如果它的优先级是最高的,又没有dealy,就会出现这样的情况,看看是不是这样的情况,如果不是,就是其他问题了。
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12090
金钱
12090
注册时间
2013-3-8
在线时间
1285 小时
发表于 2014-9-25 09:50:14 | 显示全部楼层
可能没加delay();也可能delay()内的值太小了。还是把这几个任务的代码都贴出来吧。这样子才好分析问题
回复

使用道具 举报

22

主题

2254

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4486
金钱
4486
注册时间
2013-4-22
在线时间
337 小时
发表于 2014-9-25 12:01:34 | 显示全部楼层
最好把各个任务的代码粘出来,只看你创建和启动任务太片面了
回复

使用道具 举报

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2012-3-6
在线时间
5 小时
 楼主| 发表于 2014-9-25 13:41:42 | 显示全部楼层
回复【2楼】TinyBoy:
---------------------------------
还真是...因为最开始是裸写的 .后来加入的ucos  然后基本用的定时器做标志位调用的函数.,没有用延时的地方尽量没用,所以导致这个优先级最高的任务一直在运行.我这对ucosii还是太不了解了.这基本东西都不知道.
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复

使用道具 举报

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2012-3-6
在线时间
5 小时
 楼主| 发表于 2014-9-25 13:42:03 | 显示全部楼层
回复【4楼】augustedward:
---------------------------------
多谢了.!真是...因为最开始是裸写的 .后来加入的ucos  然后基本用的定时器做标志位调用的函数.,没有用延时的地方尽量没用,所以导致这个优先级最高的任务一直在运行.我这对ucosii还是太不了解了.这基本东西都不知道.
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-25 13:47:54 | 显示全部楼层
回复【5楼】a4615800:
---------------------------------

你应该用它UCOS的延时函数,具有延时和调度功能的那2个函数。
回复

使用道具 举报

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2012-3-6
在线时间
5 小时
 楼主| 发表于 2014-9-25 14:04:14 | 显示全部楼层
回复【7楼】TinyBoy:
---------------------------------
void  OSTimeDly (INT32U ticks) 这个吗?
与下面那个效果是不是一样的?
看下.
我用的原子的 那种方法.定义了.ucosIi自然就调用的是系统的延时不知道这个是不是.
   
#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
//延时nus
//--------------------------------------------------------------------------------
//nus为要延时的us数.
void delay_us(u32 nus)
{
     u32 ticks;
     u32 told,tnow,tcnt=0;
     u32 reload=SysTick->LOAD; //LOAD的值       
     ticks=nus*fac_us;  //需要的节拍数     
     tcnt=0;
     OSSchedLock(); //阻止ucos调度,防止打断us延时
     told=SysTick->VAL;         //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{     
if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了.
else tcnt+=reload-tnow+told;     
told=tnow;
if(tcnt>=ticks)break;//时间超过/等于要延迟的时间,则退出.
}  
};
OSSchedUnlock(); //开启ucos调度      
}
//----------------------------------------------------------------------------------------------------------------
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{
    if(OSRunning==TRUE)//如果os已经在跑了     
    {   
    if(nms>=fac_ms)//延时的时间大于ucos的最少时间周期 
   {
           OSTimeDly(nms/fac_ms);//ucos延时
    }
    nms%=fac_ms; //ucos已经无法提供这么小的延时了,采用普通方式延时    
}
delay_us((u32)(nms*1000)); //普通方式延时          这里有点不理解....上面延时以后出来以后,这里不又延时一次吗 是不是过了 OSTimeDly(nms/fac_ms);这里以后就跳出去了不会执行这个函数了?
}
ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-25 14:54:39 | 显示全部楼层
回复【8楼】a4615800:
---------------------------------
 一般情况下用OSTimeDly()就行了,但是有些情况,比如一个节拍是5ms的,但是你延时的不是节拍的整数倍,比如101ms,你额外要加个1ms,这样的情况才用自己写的delay函数,当然,一个节拍是1ms也行,但是这样UCOS内核开销比较大,建议用5MS的节拍比较合适。
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2014-9-25 15:21:03 | 显示全部楼层
手动进行任务切换 试一下
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 02:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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