Tinyos tutorial learning tips -- lesson 8

介绍了比较完整的一个数据采集程序SenseLightToLog,基础是SimpleCmd,增加了两条命令:一是让节点开始采集数据并存在EEPROM中,二是让节点将EEPROM中的数据通过无线发送器传到网络中。

SenseLightToLog

async event result_t ADC.dataReady(uint16_t this_data){

   atomic {

    int p = head;

    bufferPtr[currentBuffer][p] = this_data;

    head = (p+1);

    if (head == maxdata) head = 0; // Wrap around circular buffer

    if (head == 0) {

        post writeTask();

     }

    }

    return SUCCESS;

  }

  task void writeTask() {

    char* ptr;

    atomic {

      ptr = (char*)bufferPtr[currentBuffer];

      currentBuffer ^= 0x01; // Toggle between two buffers

    }

    call LoggerWrite.append(ptr);

  }

在上面的程序中,为什么不直接在ADC.dataReady函数末尾调用LoggerWrite.append来将采集到的数据加入发送队列呢?因为ADC.dataReady是异步(async)的,而LoggerWrite.append不是,所以不能在async函数里被调用,原因是异步函数是抢占式的,它的调用路线图中不可以出现非异步的函数。可行的方法是在async函数(ADC.dataReady)post一个任务,然后在任务处理函数中调用非async函数(LoggerWrite.append),这就是上面程序所采用的方法。

 

# Logger组件:读写EEPROM的内容,比EEPROMReadEEPROMWrite更加方便。

# ByteEEPROM组件:也是读写EEPROM内容的组件,供高速率读写时使用。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值