您好: 我使用例程rfWsnNode和rfWsnConcentrator进行通信,请问rfWsnNode这个例程是否没有休眠呢? 我目前去除了传感器控制器这部分,想单纯的用一个定时器,超时就发送一组包,发生完成就休眠,我使用的是NodeTask.c文件中已经配置好的定时器
/* setup timeout for fast report timeout Clock_setTimeout(fastReportTimeoutClockHandle,NODE_ADCTASK_REPORTINTERVAL_FAST_DURIATION_MS * 1000 / Clock_tickPeriod); /* Start fast report and timeout */ Clock_start(fastReportTimeoutClockHandle);
然后在回调中发生数据包,重置定时器
工程有两个进程:
NodeRadioTask_init(); NodeTask_init();
里面分别有一个while(1)循环,NodeRadioTask中是在等待数据发送和接收的事件,NodeTask的循环是在等待定时器超时改变标志位进入,讲数据发送事件抛出。
我阅读了该工程的代码,没有发现在哪里能进入休眠,请问我如何才能在发送完数据包后进入休眠,然后再用定时器唤醒呢?谢谢
Viki Shi:
如果程序中已经无其他任务,你可以调用 task_sleep进入睡眠;或者使用时钟定时,这部分可以参考SDK里的时钟example
user4820439:
回复 Viki Shi:
你好,我查看了时钟的例程,但发现里面没有使用到休眠和唤醒,貌似仅仅是定时,然后超时输出。主程代码如下:
int main() {/* Construct BIOS Objects */Clock_Params clkParams;/* Call driver init functions */Board_initGeneral();Clock_Params_init(&clkParams);clkParams.period = 5000/Clock_tickPeriod;clkParams.startFlag = TRUE;/* Construct a periodic Clock Instance */Clock_construct(&clk0Struct, (Clock_FuncPtr)clk0Fxn,5000/Clock_tickPeriod, &clkParams);clkParams.period = 0;clkParams.startFlag = FALSE;/* Construct a one-shot Clock Instance */Clock_construct(&clk1Struct, (Clock_FuncPtr)clk1Fxn,11000/Clock_tickPeriod, &clkParams);clk2Handle = Clock_handle(&clk1Struct);Clock_start(clk2Handle);BIOS_start();/* does not return */return(0); }/**======== clk0Fxn =======*/ Void clk0Fxn(UArg arg0) {UInt32 time;time = Clock_getTicks();System_printf("System time in clk0Fxn = %lu\n", (ULong)time); }/**======== clk1Fxn =======*/ Void clk1Fxn(UArg arg0) {UInt32 time;time = Clock_getTicks();System_printf("System time in clk1Fxn = %lu\n", (ULong)time);System_printf("Calling BIOS_exit() from clk1Fxn\n");BIOS_exit(0); }
user4820439:
回复 Felix ZF:
非常感谢,我刚才在阅读低功耗的文档,是否需要 在 主函数中调用Power_enablePolicy(); 这个函数来启动呢?还是直接如你说所直接pend即可?
user4820439:
回复 Felix ZF:
真的非常感谢,愿你身体健康,工作顺利~