| 
 | 
 
使用平台: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这样的形式会更好。  
 |   
 
 
 
 |