OpenEdv-开源电子网

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

关于ucosIII时间戳的一点疑惑

[复制链接]

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
发表于 2015-9-16 16:12:37 | 显示全部楼层 |阅读模式
5金钱
一。假如任务在提前等待一个信号量:当信号量到来时,任务记录下此时间戳;当任务返回时,再记下当前时间戳。两时间戳之差,就是该任务等待该信号量的时间。两时间戳之差的意义是:该任务受其他任务及中断的影响有多大?从而确定任务优先级是否合理。

任务在提前等待一个信号量的源码片段:
uC/OS-III   Version : V3.03.00
OS_SEM_CTR  OSSemPend (OS_SEM   *p_sem,
                       OS_TICK   timeout,
                       OS_OPT    opt,
                       CPU_TS   *p_ts,       //时间戳
                       OS_ERR   *p_err)
{
      。。。
    OSSched();                 /* 任务级调度:运行下一个最高优先级的就绪任务    */

    CPU_CRITICAL_ENTER();
    switch (OSTCBCurPtr->endStatus) {
        case OS_STATUS_PEND_OK:            /* 得到信号量  */
             if (p_ts != (CPU_TS *)0) {
                *p_ts  =  OSTCBCurPtr->TS;         //  发给信号量的时间戳,已记录在该任务的控制块中
             }
            *p_err = OS_ERR_NONE;
             break;
        。。。
    }
    ctr = p_sem->Ctr;
    CPU_CRITICAL_EXIT();
    return (ctr);
}



二。假如信号量已经提前准备好:信号量中已经保存了当时的时间戳。任务接收到信号量并立刻返回,当前时间戳与信号量中保存的时间戳之差,是指该信号量从发送到接收的时间。但是两时间戳之差,并不是该任务等待该信号量的时间

信号量已经提前准备好的源码片段:
uC/OS-III   Version : V3.03.00
OS_SEM_CTR  OSSemPend (OS_SEM   *p_sem,
                       OS_TICK   timeout,
                       OS_OPT    opt,
                       CPU_TS   *p_ts,       //时间戳
                       OS_ERR   *p_err)
{
      。。。
      if (p_sem->Ctr > (OS_SEM_CTR)0) {                       /* 信号量已经提前准备好?                                    */
        p_sem->Ctr--;                                       /* 信号量计数器减一                                */
        if (p_ts != (CPU_TS *)0) {
           *p_ts  = p_sem->TS;                              /*      获得最后发给信号量的时间戳                        */
        }
        。。。
        return (ctr);
      }
      。。。
}


三。根据程序源码及UCOSIII原著所述,OSSemPend()返回的*p_ts时间戳,是指信号量被释放(OSSemPost())的确切时刻。 
如果按照UCOSIII时间戳的概念,比如某些时候,该信号量可能已经被提前发送了,只是很长时间内没有任务去读他,任务获得信号量的时间戳之差的时间会很长。但这并不意味着该任务等待该型号量的时间会很长。



请教一下各位,怎样去理解uC/OS-III时间戳的实用意义和价值?



最佳答案

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

原文匹配你说的,但程序是这样的: 1、信号量可用,返回SEM时间戳。Line 415:*p_ts = p_sem->TS; 2、信号量不可用,返回的TCB时间戳,因而无从得出响应延时。Line 472:*p_ts = OSTCBCurPtr->TS;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2015-9-16 16:12:38 | 显示全部楼层
原文匹配你说的,但程序是这样的:

1、信号量可用,返回SEM时间戳。Line 415:*p_ts = p_sem->TS;
2、信号量不可用,返回的TCB时间戳,因而无从得出响应延时。Line 472:*p_ts = OSTCBCurPtr->TS;
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-16 23:21:19 | 显示全部楼层
楼主问题格式清晰悦目,无奈没测试个ucos实验,帮不到楼主,帮顶一下.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2015-9-17 09:28:53 | 显示全部楼层
Timestamp可以用来计算事件产生到响应的延时,产生时刻由信号量本身自带,
Pend调用记录是返回的时刻,可能是成功/超时/取消等。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-9-17 10:25:44 | 显示全部楼层
回复【3楼】emWin:
---------------------------------
谢谢关注。  根据程序源码及UCOSIII原著所述,OSSemPend()返回的*p_ts时间戳,是指信号量被释放(OSSemPost())的确切时刻。
按照UCOSIII时间戳的概念,某些时候,任务获得信号量的时间戳之差会很长,但这并不意味着该任务等待该型号量的时间会很长。因为该信号量可能已经被提前发送了,只是很长时间没有任务去读他。
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-9-17 10:36:06 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
谢谢关注!
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2015-9-17 10:58:12 | 显示全部楼层
回复【4楼】jnfxt95:
---------------------------------
如你不嫌麻烦,不妨指明你的第1句的依据,楼主位源码与你的理解是有悖的。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-9-17 11:15:49 | 显示全部楼层
回复【6楼】emWin:
---------------------------------
《嵌入式实时操作系统uc/os-III》原著(邵贝贝审校)第165页:OSSemPend(&MySem,0,OS_OPT_PEND_BLOCKING,&ts,&err)--L13-6(4)  当信号量释放时,uc/os-III会记录一个时间戳,并在OSSemPend()返回时返回该时间戳。这个功能使用户程序能够知道请求的信号量释放的确切时刻。在OSSemPend()返回后,可以通过读取OS_TS_GET()来获得当前时间戳,用户可以自行计算两个时间戳的差来获得等待的时间。
 (邵贝贝 )译者注:该等待时间是指,从信号量被释放到真正任务能执行所等待的时间。
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2015-9-18 17:15:52 | 显示全部楼层
修正:

从Post源码中看出,楼上提到的TCB的时间戳,也是SEM发送时间,楼主是正确的。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-9-21 21:58:55 | 显示全部楼层
回复【9楼】emWin:
---------------------------------
3天没来这里了,谢谢关注!
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2015-9-24 09:57:53 | 显示全部楼层
回复【4楼】jnfxt95:
---------------------------------
总起来说,任务使用信号量有两种情况:一是任务提前等待信号量;二是信号量已经提前发布。
今天的一点认识:uC/OS-III 只是给编程者提供了这么一个时间戳,至于这个时间戳到底是哪种情况的时间,需要编程者根据程序结构,自己去把握。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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