我的应用是让模块每隔一段时间,去接收一次,看空中有没有自己想要的数据。没有就处于休眠转态。
在测试功耗时。Semaphore_pend(echoDoneSem, (1000 / Clock_tickPeriod));
1.timeout从500ms -50ms -5ms -1ms都没有出现功耗上的问题。没有听到数据,经过xms的timeout之后,电流强度降下去了。
2.从1ms往下即us。没有听到数据,经过的不是xus,而是Task_sleep(10000000/Clock_tickPeriod);(10s)电流强度才降下去。修改Task_sleep()为20s.再次实验,电流过20s才降下去。
3.再把模块从xus往上1ms 50ms 500ms没有出现第二种情况。
以下是部分代码
void echoRxDoneCb(EasyLink_RxPacket * rxPacket, EasyLink_Status status)
{
if (status == EasyLink_Status_Success)
{
if(rxPacket->payload[0] == 0x03 && rxPacket->payload[1] == 0x85)
{
//将数据拷贝到配置结构体中
memcpy(&TX_Config,rxPacket->payload,sizeof(Config_Req));
CRC = crc16((uint8_t *)&TX_Config,sizeof(Config_Req) – 2);
if(TX_Config.Crc16 == CRC)
{
recv_flag = true; /* Permit echo transmission */
}
}
}
else if (status == EasyLink_Status_Aborted)
{
}else{
}
Semaphore_post(echoDoneSem);
}
while(1) {
EasyLink_receiveAsync(echoRxDoneCb, 0);
/* Wait 500ms for Rx */
if(Semaphore_pend(echoDoneSem, (5000 / Clock_tickPeriod)) == FALSE)
{
/* RX timed out abort */
if(EasyLink_abort() == EasyLink_Status_Success)
{
/* Wait for the abort */
Semaphore_pend(echoDoneSem, BIOS_WAIT_FOREVER);
}
}
if(recv_flag == true)
{
…
}
RF_yield(rfHandle);
Task_sleep(10000000/Clock_tickPeriod);
}
Viki Shi:
Semaphore_pend()
Wait for a semaphoreBool Semaphore_pend(Semaphore_Handle handle, UInt32 timeout);
ARGUMENTS
handle — handle of a previously-created Semaphore instance object
timeout — return after this many system time unitsRETURNS
TRUE if successful, FALSE if timeout
DETAILS
If the semaphore count is greater than zero (available), this function decrements the count and returns TRUE. If the semaphore count is zero (unavailable), this function suspends execution of the current task until post() is called or the timeout expires.
A timeout value of BIOS_WAIT_FOREVER causes the task to wait indefinitely for its semaphore to be posted.
A timeout value of BIOS_NO_WAIT causes Semaphore_pend to return immediately.CC1310的Clock.tickPeriod =10us
lin shi chang:
回复 Viki Shi:
抱歉,标题有点问题。也就是说Semaphore_pend()的范围是10us— xs。至少符合需求。超过自己设定的时间就超时。
然后,我在程序中设置超时为50us时。出现了上述问题。麻烦您帮忙看一下。
Viki Shi:
回复 lin shi chang:
“我试了好几种阻塞时间,发现在us级时出现的概率很大。其他的时间偶尔也会出现。我的应用是时间越短越好。” 具体是什么问题?
lin shi chang:
回复 Viki Shi:
就是功耗的问题。按照预想,应该在50us的时候(为了更好观察,我把时间调到了100ms),电流强度应该降下去的。但是模块一直处于接收状态的电流强度(大概是5.4ma),持续大概10s.之后才降下去。不知道为什么。
lin shi chang:
回复 Viki Shi:
您好,我刚刚又测试了一遍。Semaphore_pend(echoDoneSem, (1000 / Clock_tickPeriod));
1.timeout从500ms -50ms -5ms -1ms都没有出现功耗上的问题。没有听到数据,经过xms的timeout之后,电流强度降下去了。2.从1ms往下即us。没有听到数据,经过的不是xus,而是Task_sleep(10000000/Clock_tickPeriod);(10s)电流强度才降下去。修改Task_sleep()为20s.再次实验,电流过20s才降下去。
3.再把模块从xus往上1ms 50ms 500ms没有出现第二种情况。
您能实验一下吗?例程中,将while(1)循环改成我这样。只有在接收到自己想要的数据时,才去发送。否则一直处于接收状态。
实验时,可以不管发送的代码。注释掉也行。
Viki Shi:
回复 lin shi chang:
不知道你还修改了什么,rfEasyLinkEchoTx本身的设计逻辑是,先TX发送,然后进入RX,等待一段时间收不到数据,再从RX转到TX,一直循环
lin shi chang:
回复 Viki Shi:
其他的没有做什么修改,就是主循环里的逻辑变了,因为是电池供电,考虑到功耗。节点先RX(RX的时间很短,发送的命令很小,很快就可以收到)等待一段时间,没有收到命令,就休眠。收到命令,进入TX,之后再次进入RX。一直循环。
我把时间控制在ms应该不会有问题。
Viki Shi:
回复 lin shi chang:
把Task_sleep那行屏蔽掉试试
lin shi chang:
回复 Viki Shi:
这句不能删,周期性进入低功耗,还是要这个Task_sleep()的吧!ms级的没问题。