查看: 2305|回复: 0
打印 上一主题 下一主题

Tinyos之使用Msp430Counter32khz获取系统时间

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-17 19:40:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用平台:TelosB
操作系统:TinyOs
最近要为论文写实验数据,需要读取系统的时间,进行一些运算。
Tinyos有提供MSP430Counter32khz组件,该组件提供接口Counter<T32khz,uint16_t>.
该接口有如下命令和事件:
1、get()命令

调用该命令,会返回计数值。计数动作是从系统启动的时候就开始了。(如果操作系统配置为低功耗模式会停止计数)
2、isOverflowpending()命令

是否有溢出(true /false)
3、clearoverflow()命令

清除挂起状态
4、overflow()事件

给出当前系计数值已经溢出的信号量。
继续分析,得知该组件是有以下两个组件实现的:(关于Msp430TimerC这个组件以后再好好研究,这个组件提供了MSP430的所有时钟接口)
component  Msp430TimerC;
componentnew Msp430Counter(T32khz) as Counter;//该组件使用uint16_t 进行计数

Msp430Counter32khz= counter  ;
Counter.Msp430Timer->Msp430TimerC.TimerB;

现在,要实现读取系统运行时间的功能。由于组件使用T32Khz,也就是计数一次(Ticks),相当于系统运行1/32ms。
为了描述时间,定义了一个结构体,分为秒和毫秒级,秒采用4个字节,ms使用2字节(与组件匹配)
typedefnx_struct nxSYS_Time_t {
   nx_uint32_t uiSeconds;//转换的秒数

   nx_uint16_t usTicks;//滴答计数变量

}nxSYS_Time_t;
滴答计数变量转换为秒(S)的处理
一般情况,当计数溢出时,也就是计数65535,次数相当于系统运行65535/32/1000 = 2s,因此在signal事件里需要将
uiSecond值增加2;当滴答计数为65535/2=32678 且小于65535时,此时秒数增加1

但这里需要注意一个问题,就是用户获取时间是随意的,因此,滴答计数变量会遇到三种情况要处理:
1、当滴答值小于65535/2=32678 的时候,不加1

2、当滴答值大于32678且小于65535的时候,加1

3、当用户连续两次都在32678和65535获取get命令时,仅在第一次加1,第二次不能加1

通过以上分析,对获取系统运行时间的核心处理程序如下:
boolflag =1;  
nxSYS_Time_t*GetTime() {  
uint16_ttemp;  
uint32_ttmp1;  
temp =call Msp430Counter32khz.get();  
if (temp>>15 &&flag)   
{  
   atomic {  
            SysClock.uiSeconds++;   
           flag= 0;        
           }  
}  
atomic{  
           SysClock.usTicks = temp &0x7fff;  
       }  
return&SysClock;  
}  


asyncevent void Msp430Counter32khz.overflow()   
{  
  call Msp430Counter32khz.Clearoverflaow();  
  atomic   
  {  
   if(!flag)  
   {  
       SysClock.uiSeconds += 1;   
   }  
   else  
   {  
       SysClock.uiSeconds += 2;  
   }  

   flag =1;  
  }  
}
这里提供了一种获取系统时钟的思路,当然如果给出2012-09-12 14:14:14这样的形式会更好。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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