TI中文支持网
TI专业的中文技术问题搜集分享网站

为什么循环发射267个包后系统就停止了?CC1310

用smartrf 接收267个包后就停止了,请问问题出在哪里呢?代码如下:

void echoTxDoneCb(EasyLink_Status status)
{
if (status == EasyLink_Status_Success)
{
/* Toggle LED1 to indicate TX */
PIN_setOutputValue(ledPinHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
/* Turn LED2 off, in case there was a prior error */
PIN_setOutputValue(ledPinHandle, Board_PIN_LED2, 0);
}
else
{
/* Set both LED1 and LED2 to indicate error */
PIN_setOutputValue(ledPinHandle, Board_PIN_LED1, !PIN_getOutputValue(Board_PIN_LED1));
PIN_setOutputValue(ledPinHandle, Board_PIN_LED2, 1);
}

Semaphore_post(echoDoneSem);
}



static void concentratorRadioTaskFunction(UArg arg0, UArg arg1) {/* Create a semaphore for Async */Semaphore_Params params;Error_Blockeb;/* Init params */Semaphore_Params_init(&params);Error_init(&eb);/* Create semaphore instance */echoDoneSem = Semaphore_create(0, &params, &eb);if(echoDoneSem == NULL){System_abort("Semaphore creation failed");}/* Initialize EasyLink */ EasyLink_Params easyLink_params;EasyLink_Params_init(&easyLink_params); easyLink_params.ui32ModType = RADIO_EASYLINK_MODULATION; if(EasyLink_init(&easyLink_params) != EasyLink_Status_Success){ System_abort("EasyLink_init failed"); } EasyLink_getAbsTime(&absTime);while (1) {/* Create packet with incrementing sequence number and random payload */txPacket.payload[0] = (uint8_t)(seqNumber >> 8);txPacket.payload[1] = (uint8_t)(seqNumber++);uint8_t i;for (i = 2; i < RFEASYLINKECHO_PAYLOAD_LENGTH; i++){txPacket.payload[i] = rand();}txPacket.len = RFEASYLINKECHO_PAYLOAD_LENGTH;txPacket.dstAddr[0] = 0xaa;txPacket.absTime = absTime + EasyLink_ms_To_RadioTime(1000);EasyLink_transmitAsync(&txPacket, echoTxDoneCb);/* Wait for Tx to complete. A Successful TX will cause the echoTxDoneCb* to be called and the echoDoneSem to be released, so we must* consume the echoDoneSem*/Semaphore_pend(echoDoneSem, BIOS_WAIT_FOREVER);/* Switch to Receiver */EasyLink_receiveAsync(echoRxDoneCb, 0);/* Wait 1000ms for Rx */if(Semaphore_pend(echoDoneSem, (1000000 / Clock_tickPeriod)) == FALSE){/* RX timed out abort */if(EasyLink_abort() == EasyLink_Status_Success){/* Wait for the abort */Semaphore_pend(echoDoneSem, BIOS_WAIT_FOREVER);}}} }

Loops:

你好。你是否可以使用TI SDK里面的PacketTX例程测试。另外你说的停止系统其它功能正常响应吗?

Xu Jeff:

回复 Loops:

把if(Semaphore_pend(echoDoneSem, (1000000 / Clock_tickPeriod)) == FALSE)
改成if(Semaphore_pend(echoDoneSem, (500000 / Clock_tickPeriod))就ok了

是 txPacket.absTime = absTime + EasyLink_ms_To_RadioTime(1000);的absTime出问题吗?

da qin zheng sheng:

你的程序包含发送和接收,如果只有接收应该能正常工作吧!

Felix ZF:

回复 Xu Jeff:

首先,从你的代码看,txPacket.absTime和absTime 都是保持了第一次的赋值后,一直没有更新了。因此,其实你的数据包并没有按照期望的每1000ms发送一包,而出除了第一包数据是在指定的abstime时间后发送的之外,其后的数据包都是立即发送出去的。因为你设置的abstime一直是那个比较早的时间,因为EasyLink_cmdPropTx.startTrigger.pastTrig = 1;,所以数据会立即发出去。数据包的发送间隔实际受 if(Semaphore_pend(echoDoneSem, (1000000 / Clock_tickPeriod)) == FALSE)语句中设定的时间控制。你可以试试把这里面的1000000改大或改小,从LED的闪烁频率就可以看出数据包的发送间隔。
其次,你说的停止发送的原因,应该是程序卡在Semaphore_pend(echoDoneSem, BIOS_WAIT_FOREVER);里一直等不到semphore而被block了 。

Xu Jeff:

回复 Felix ZF:

非常感谢答复啊您提到的 block了我表示不理解,EasyLink_abort() 无论结果如何,是肯定能call到echoTxDoneCb这个回调函数吗? 如果是,那怎么会block呢?
/* RX timed out abort */if(EasyLink_abort() == EasyLink_Status_Success)程序肯定能走到这一步的吧?{/* Wait for the abort */Semaphore_pend(echoDoneSem, BIOS_WAIT_FOREVER);}

Felix ZF:

回复 Xu Jeff:

你的echoRxDoneCb里面执行了哪些动作?

赞(0)
未经允许不得转载:TI中文支持网 » 为什么循环发射267个包后系统就停止了?CC1310
分享到: 更多 (0)