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