767|0

3741

帖子

0

资源

纯净的硅(中级)

Tinyos之使用Msp430Counter32khz获取系统时间 [复制链接]

使用平台:TelosB 操作系统:TinyOs 最近要为论文写实验数据,需要读取系统的时间,进行一些运算。 Tinyos有提供Msp430Counter32khz 组件,该组件提供接口 Counter . 该接口有如下命令和事件: 1、get()命令 调用该命令,会返回计数值。计数动作是从系统启动的时候就开始了。(如果操作系统配置为低功耗模式会停止计数) 2、isOverflowpending()命令 是否有溢出(true /false) 3、clearoverflow()命令 清除挂起状态 4、overflow()事件 给出当前系计数值已经溢出的信号量。 继续分析,得知该组件是有以下两个组件实现的:(关于Msp430TimerC这个组件以后再好好研究,这个组件提供了MSP430的所有时钟接口) component Msp430TimerC; component new Msp430Counter(T32khz) as Counter;//该组件使用uint16_t 进行计数 Msp430Counter32khz = counter ; Counter.Msp430Timer ->Msp430TimerC.TimerB; 现在,要实现读取系统运行时间的功能。由于组件使用T32Khz,也就是计数一次(Ticks),相当于系统运行1/32ms。 为了描述时间,定义了一个结构体,分为秒和毫秒级,秒采用4个字节,ms使用2字节(与组件匹配) typedef nx_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 通过以上分析,对获取系统运行时间的核心处理程序如下: [plain] view plain copy bool flag =1; nxSYS_Time_t* GetTime() { uint16_t temp; uint32_t tmp1; temp = call Msp430Counter32khz.get(); if ( temp>>15 &&flag) { atomic { SysClock.uiSeconds++; flag= 0; } } atomic { SysClock.usTicks = temp & 0x7fff; } return &SysClock; } async event void Msp430Counter32khz.overflow() { call Msp430Counter32khz.Clearoverflaow(); atomic { if(!flag) { SysClock.uiSeconds += 1; } else { SysClock.uiSeconds += 2; } flag =1; } }

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

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表