OpenEdv-开源电子网

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

怎么才能知道UCOSII中一个任务运算时间?

[复制链接]

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-19
在线时间
0 小时
发表于 2015-6-2 10:41:42 | 显示全部楼层 |阅读模式
5金钱
我想精准到MS级别地测出一个函数跑完需要多久。
我试过用USMART来测试,但是每次一call那个函数就死机了。我也不知道为什么。。

最佳答案

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

测量任务运行时间请使用UCOS自带的OSTimeGet()函数,进入函数的时候调用一次OSTimeGet(),任务执行完以后在调用一次OSTimeGet(),两者相减就是任务运行时间,注意两者相减的结果的单位不是ms,而是时钟节拍数。如果要测量任务运行时间的话最好将OS_TICKS_PER_SEC设置为1000。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-6-2 10:41:43 | 显示全部楼层
测量任务运行时间请使用UCOS自带的OSTimeGet()函数,进入函数的时候调用一次OSTimeGet(),任务执行完以后在调用一次OSTimeGet(),两者相减就是任务运行时间,注意两者相减的结果的单位不是ms,而是时钟节拍数。如果要测量任务运行时间的话最好将OS_TICKS_PER_SEC设置为1000。
开往春天的手扶拖拉机
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-19
在线时间
0 小时
 楼主| 发表于 2015-6-2 11:31:33 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
非常感谢!可以用!
但是又出现一个问题。。
打印数据如下:
51
3
3
3
51
3
3
3
51

总是有个51出现。这个会不会是溢出导致的?还是他真的用了那么久?
代码如下:
timeUsed = OSTimeGet();
if(t==8)LED0=1; //LED0灭
if(t==100) //LED0亮
{
t=0;
LED0=0;
}

//short temp;
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
//temp=MPU_Get_Temperature(); //得到温度值
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据
#if defined MPU0_DEBUG
printf("\n%f,%f,%f\r\n",pitch,roll,yaw);
#endif
//if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
//if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));

//OSSemPost(sem_led1); //show it's working
}
timeUsed = OSTimeGet()-timeUsed;
printf("%d\n",timeUsed);
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-6-2 11:57:40 | 显示全部楼层
放心吧 ,溢出不了的,32位的数据长度,即使将OS_TICKS_PER_SEC设置为1000,也就是1ms加1,从你开机到溢出也需要1193个小时才能溢出。如果是51的话就说明用了51ms了啊
开往春天的手扶拖拉机
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-6-2 11:58:38 | 显示全部楼层
回复【4楼】zuozhongkai:
---------------------------------
51ms,数据更新率大概就是200HZ,可以了,正常范围
开往春天的手扶拖拉机
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-19
在线时间
0 小时
 楼主| 发表于 2015-6-2 12:23:06 | 显示全部楼层
回复【5楼】zuozhongkai:
---------------------------------
20吧?我在OS_TICKS_PER_SEC设的1000.
请问他为什么会跳变啊?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-6-2 12:35:38 | 显示全部楼层
回复【6楼】cxran2wms:
---------------------------------
是20,不好意思,说错了。
开往春天的手扶拖拉机
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-6-2 12:36:11 | 显示全部楼层
回复【7楼】zuozhongkai:
---------------------------------
至于为什么会跳变就不知道了,算法计算时间不同吧,还有就是你有没有调用临界段代码保护函数,那个是会关闭滴答定时器中断的,会对时间测量结果有影响的
开往春天的手扶拖拉机
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-19
在线时间
0 小时
 楼主| 发表于 2015-6-2 13:16:35 | 显示全部楼层
回复【8楼】zuozhongkai:
---------------------------------
恩恩多谢啦!
我没有写临界状态的函数。不知道是不是例程里有。。

我用runtime计时,这个函数需要1ms去完成。
printf("CPU_Usage:%d",OSCPUUsage);
是不是因为调用OSCPUUSage需要1ms?
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-19
在线时间
0 小时
 楼主| 发表于 2015-6-2 13:24:24 | 显示全部楼层
回复【8楼】zuozhongkai:
---------------------------------
打印函数:
51
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
51
我把函数周期改了。会不会USMART的中断打断了?然后占用时间很久?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-2-1
在线时间
10 小时
发表于 2021-5-8 22:05:10 | 显示全部楼层
cxran2wms 发表于 2015-6-2 13:24
回复【8楼】zuozhongkai:
---------------------------------
打印函数:
51
2
2
2
2
2
2
2
2
2
2
2
2
2
2
...

请问找到原因了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 08:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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