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