This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC1310:Rx超时状态不一致

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/582882/rtos-cc1310-rx-timeout-status-inconsistent

部件号:CC1310

工具/软件:TI-RTOS

您好,

我需要在窗口中接收数据包。 我在IAR\CC1310DK_7xD\rfPacketErrorRate示例中修改了Rx.c,并在下面完整地包含了代码。 我的更改用Add_my_Changes宏标记。 本质上,我使用以下命令发布Rx命令:

RF_postCmd (rfHandle,(RF_Op*)&RF_cmdPropRx,RF_PriorityNormal,&Rx_callback,RF_EventRxEntryDone); 



设置这些参数时,命令会在50.5ms后超时,但通常每隔50ms会收到一个数据包(来自另一个运行TX.c的板)。 我观察返回的状态:

(((volatile RF_Op*)&RF_cmdProprx)->状态; 


我看到的行为是:
1)如果我启动主板,然后在没有接收到数据包的情况下运行Rx,则超时为92毫秒,状态= 1.3313万 (= 0x3401 = PROP_DON_RXTIMEOUT)
2)如果我打开另一个板发送数据包,则每隔50毫秒接收数据包,状态= 1.3312万 (= 0x3400 = PROP_DON_OK)
3)几乎完全没有时间后,数秒(时间可能不同),每50毫秒接收一次数据包,状态= 2
4)如果我随后停止Tx,超时为55.6毫秒,状态= 1

离开状态2后,主板将处于状态3 (Rx)或4 (NO Rx),并且不会返回到状态1或2。 我很高兴地看到这一点:



我正在使用IAR IDE和tirtos_cc13xx_cc26xx_2_21_00_06

有没有人对我为什么看到这种行为有任何想法?

/*
版权所有(c) 2016,Texas Instruments Incorporated
*保留所有权利。
*
**
允许以源代码和二进制格式重新发布和使用,无论是否进行*修改,只要
满足以下条件*:
*
****重新发布源代码必须保留上述版权
*声明,此条件列表和以下免责声明。
*
***以二进制格式重新分发时,必须在

随分发提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。
*
***

未经事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或促销由本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*,

不提供任何明示或暗示的担保,包括但不限于*对适销性和特定*用途适用性的暗示担保。 在任何情况下,版权所有者或
*贡献者均不对任何直接,间接,附带,特殊,
*示范, 或后果性损害(包括但不限于
*购买替代商品或服务;使用,数据或利润损失;
(*或业务中断),但根据任何责任理论
,*无论是合同,严格责任还是侵权行为(包括疏忽或
*其他),均因使用本软件而导致*
,即使已被告知此类损害的可能性。
*/

#define Add_my_Changes

/***** 包括***** /

/* XDCtools头文件*/
#include <XDC/runtime /asset.h>
#include <XDC/runtime /System.h>


#ifdef add_my_changes
/* BIOS模块头文件*/
#include <ti/SysSmartBIOS/KNL/semaphore.h>
#endif

/* TI-RTOS Add_my_Changes /* BIOS模块头文件#include <fsmart/RFh/






头/rfh>#f_h/f_h/fin #fin </f_h>



#include "SmartRF_settings/SmartRF_settings_predefined.h"

#if (defined __CC2650EM_7ID_H__)||(defined __CC2650_LAUNCH_SHL_)||(defined __CC1350_LAUNCH_CH_SH__)||(defined __CC1350_LAC_SENHL_SH_SH_SENO_SH_EN_SE_ENF_SE_SETT_EN_SE_EN_SE_SE_EN.f_ENSE_ENSETT_EN_SE_EN_EN_SE_SETTON_SE_SE_SEADIF_SETTON_SE_SE_SE_SETTING.f_SE_SE_SE_SE_SEA







定义***** /
#define data_entry_header_size 8/*常规数据条目的常量标头大小*/
#define MAX_length 125 /*对讲机将接受的最大长度字节*/
#define NUM_DATA_entries 2 /*注:目前仅支持两个数据条目*/
#define NUM_appended_bytes 2 /* RF_cmdRxHS.rxConf.bIncludeLen =1:包括接收的长度
存储数据包中的*字段(2个字节)*/

#ifdef Add_my_Changes
/*引脚驱动程序句柄*/
static PIN_handle ledPinHandle;
static PIN_State ledPinState;

/*
应用程序LED引脚配置表:
*-所有LED板LED指示灯熄灭。
*/
PIN_Config ledPinTable[]={
Board_LED0 | PIN_GPIO输出_EN | PIN_GPIO低| PIN_PushPull | PIN_DRVSTR_MAX,// LED 4.
Board_LED1 | PIN_GPIO输出_EN | PIN_GPIO低| PIN_PushPull | PIN_DRVSTR_MAX,// LED 1.
Board_LED2 | PIN_GPIO输出_EN | PIN_GPIO低| PIN_PushPull | PIN_DRVSTR_MAX,// LED 2.
Board_LED3 | PIN_GPIO输出_EN | PIN_GPIO低| PIN_PushPull | PIN_DRVSTR_MAX,// LED 3.
PIN_TERMINATE
};
#endif

/***** 原型***** /
静态void rx_callback (rf_handle h,rf_cmdHandle ch,rf_EventMask e);


/***** 变量声明***** /
static uint8_t packetReceived = false;
static uint16_t* crcok;
static INT8_t* RSSI;
#ifdef add_my_changes
static uint16_t ret, status =0;
#endif

static RF_Object rfObject;
static RF_handle;
static RF_CmdHandle rf/ rfmnle*命令增加rfemore/mphore/




semaphore_handle semHandle;
#endif

/*缓冲区,包含用于接收数据的所有数据条目。
*需要pragma以确保此缓冲区是4字节对齐的(RF内核的要求)*/
#if defined(__TI_Compiler_version__)
#pragma data_align (rxDataEntryBuffer, 4);
静态uint8_t rxDataEntryBuffer[RF_QUEUE_DATA_Entry_BUFFER_SIZE (NUM_DATA_entries,
max_length,
num_appended_bytes)];
#Elif defined (__IAR_systems_icc__)
#pragma data_alignment = 4
静态uint8_t rxDataEntryBuffer[RF_QUEUE_DATA_Entry_BUFFER_SIZE (NUM_DATA_entries,
max_length,
num_appended_bytes)];
#Elif已定义(__Gnudi__)
静态uint8_t rxDataEntryBuffer [RF_QUEUE_DATA_Entry_BUFFER_SIZE (NUM_DATA_entries,
max_length,NUM_appended_bytes)]__attribute__((已对齐(4)));
#else
错误不支持此编译器。
#endif


静态数据Queue_t数据队列; /* RF代码的接收队列以填充数据*/
RFC_dataEntryGeneral _t* currentDataEntry; /*常规数据输入结构(类型=0)*/

#IF!(已定义__CC2650EM_7ID_H__)&&!(已定义__CC2650_LAUNCHXL_Board_H__)
RFC_hsRxOutput_t rxStatistics_hs; /* CMD_HS_RX */
#endif

#if (已定义__CC2650EM_7ID_H__)||(已定义__CC2650_LARXHXL_Board_H__)||(已定义__CC1350_LAUNCCHLXL_Board_H__)||(已定义__CC1350_RXH_GenericstK_SSTK_Statist_SENT_)
/* RF_BLE_cmdBleGenericRx */
#endif

RFC_propRxOutput_t rxStatistics_prop的输出结构; /* CMD_PROP_RX */*的输出结构



运行测试应用程序的接收部分并返回结果。
*/
TestResult Rx_runRxTest(const ApplicationConfig* config)
{
#ifdef Add_my_Changes
semaphore_Params semParams;

/*构造信号对象,初始计数0 */
semaphore_Params_init(&semParams);
semParams.mode = semaphore_Mode_binary;
semaphore_construct (&semStruct,0,&semParams);

/*获取实例句柄*/
semHandle = semaphore_handle(&semStrut);

/* LED针脚开路*/
ledPinHandle = PIN_open(&ledPinState, ledPinTable);
IF (!ledPinHandle){
system_abort("初始化板LED针脚时出错\n");}

#endif
Assert _isTrue (config!= NULL,NULL);

RF_Params rfParams;
rf_params_init(&rfParams);

IF( RFQueue_DefineQueue(&dataQueue,
rxDataEntryBuffer,
sizeof(rxDataEntryBuffer),
num_data_entries,
max_length + NUM_appended_bytes))
{
/*无法为所有数据条目分配空间*/
while (true);
}

#ifndef Add_my_Changes
rf_cmdProprx.pQueue =数据队列;
rf_cmdProprx.pOutput =(uint8_t*)&rxStatistics_prop;
RF_cmdProprx.maxPktLen = MAX_LENGTH;
RF_cmdProprx.pktConf.bRepeatOk = 1;
RF_cmdProprx.pktConf.bRepeatNok = 1;
rf_cmdProprx.rxConf.bAutoFlushCrcErr =1;
rf_cmdProprx.rxConf.bAutoFlushIgnored = 1;
#else
rf_cmdProprx.pQueue =数据队列;
rf_cmdProprx.pOutput =(uint8_t*)&rxStatistics_prop;
RF_cmdProprx.maxPktLen = MAX_LENGTH;
RF_cmdProprx.pktConf.bRepeatOk = 0;
RF_cmdProprx.pktConf.bRepeatNok =0;
rf_cmdProprx.rxConf.bAutoFlushCrcErr =1;
rf_cmdProprx.rxConf.bAutoFlushIgnored = 1;

rf_cmdProprx.endTriggerType = trig_REL_start;
//RF_cmdProprx.endTrigger.bEnaCmd =;
//RF_cmdProprx.endTrigger.triggerNo =;
RF_cmdPropRx.endTrigger.PastTrig = 1;
RF_cmdPropRx.endTrigger.EndTime =(UINT32_t)(4*5.05万);// 50.5ms timeout
#endif

!(defined __CC2650EM_7ID_H__)&&!(defined __CC2650_LAUNCHXL_Board_H__)
rf_pCmdRxHS->pOutput =&rxStatistics_hs;
rf_pCmdRxHS->pQueue =数据队列;
rf_pCmdRxHS->maxPktLen = MAX_LENGTH;
rf_pCmdRxHS->pktConf.bRepeatOk = 1;
rf_pCmdRxHS->pktConf.bRepeatNok = 1;
rf_pCmdRxHS->rxConf.bAutoFlushCrcErr = 1;
#endif

#if (已定义__CC2650EM_7ID_H_)||(已定义__CCTAG_LAUNCHXL_Board_H_)||(已定义__CC2650EM_7ID_H_)|CC1350LASTK__
rf_ble pCmdbleGenericrx->pOutput =&rxStatistics_ble;
rf_ble pCmdbleGenericrx->pParams ->pRxQ =&dataQueue;
rf_ble_pCmdbleGenericrx->pParams->bRepeat=1;
rf_ble_pCmdbleGenericrx->pParams->rxConfig.bAutoFlushCrcErr =1;
rf_ble pCmdbleGenericrx->channel = 0xFF;
rf_ble_pCmdbleGenericrx->whitening.bOverride = 1;
rf_ble_pCmdbleGenericrx->whitening.init = config->frequencyTable[config->frequency].whening;

#endif


/*根据测试案例请求访问对讲机*/
交换机(config->rfSetup)
{

案例RfSetup_Custom:

rfHandle = RF_OPEN (&rfObject,&RF_prop,(RF_RadioSetup*)&RF_cmdPropRadioDivSetup,&rfParams);
中断;

案例RfSetup_FSK:
#if !(defined __CC2650EM_7ID_H__)&&!(defined __CC2650_LAUNCHXL_Board_H__)
rf_pCmdPropRadioDivSetup_FSK->centreFreq = config->frequencyTable[config->frequency].frequency;
rfHandle = RF_OPEN (&rfObject,RF_pProp_FSK,(RF_RadioSetup*)RF_pCmdPropRadioDivSetup_FSK,&rfParams);
#else
rfHandle = RF_OPEN (&rfObject,RF_pProp_2_4G_FSK,(RF_RadioSetup*)RF_pCmdPropRadioSetup_2_4G_FSK,&rfParams);
#endif
Break;
#IF!(已定义__CC2650EM_7ID_H__)&&!(已定义__CC2650_LAUNCHXL_Board_H__)
案例RfSetup_LRM:

rf_pCmdPropRadioDivSetup_LRM->centreFreq = config->frequencyTable[config->frequency].frequency;
rfHandle = RF_OPEN (&rfObject,RF_pProp_LRM,(RF_RadioSetup*)RF_pCmdPropRadioDivSetup_LRM,&rfParams);
中断;

案例参考Setup_ook:

rf_pCmdPropRadioDivSetup_ook->centreFreq = config->frequencyTable[config->frequency].frequency;
rfHandle = RF_OPEN (&rfObject,RF_pProp_ook,(RF_RadioSetup*)RF_pCmdPropRadioDivSetup_ook,&rfParams);
中断;

案例RfSetup_HSM:

rfHandle = RF_OPEN (&rfObject,RF_pProp_HSM,(RF_RadioSetup*)RF_pCmdRadioSetup_HSM,&rfParams);
中断;
#endif
#if (已定义__CC2650EM_7ID_H__)||(已定义__CC2650_LAUNCHXL_Board_H__)||(已定义__CC1350_LAUNCHXL_Board_H__)||(已定义__CC1350STK_SENTAG_Board_H__)
Case RfSetup_BLE:

rfHandle = RF_OPEN (&rfObject,RF_pModeBle,(RF_RadioSetup*)RF_ble_pCmdRadioSetup,&rfParams);
休息;
#endif
默认:
中断;
}

/*设置频率*/
IF (config->rfSetup == RfSetup_Custom)
{
//从SmartRF工作室导出的自定义设置应使用导出的频率
rf_runCmd (rfHandle,(RF_Op*)&RF_cmdfs,RF_PriorityNormal,NULL,0);
}
#IF (已定义__CC2650EM_7ID_H__)||(已定义__CC2650_LAUNCHXL_Board_H__)||(已定义__CC1350_LAUNCH_H__)||(已定义__CC1350STK_SENSORTAG_Board_H__)
否则,如果(config->rfSetup == RfSetup_BLE)
{
rf_ble_pCmdfs->frequency = config->frequencyTable[config->frequency].frequency;
rf_ble_pCmdfs->fractFreq = config->frequencyTable[config->frequency].fractFreq;
rf_runCmd (rfHandle,(RF_Op*)rf_ble_pCmdlf,rf_PriorityNormal,NULL,0);
}
#endif
否则
{
rf_pCmdfs_predef ->频率= config->frequencyTable[config->frequency].frequency;
rf_pCmdfs_predef ->fractFreq = config->frequencyTable[config->frequency].fractFreq;
rf_runCmd (rfHandle,(RF_Op*)RF_pCmdfs_predef,RF_PriorityNormal,NULL,0);
}

/*进入RX模式并永久保持RX */
交换机(config->rfSetup)
{
#if !(已定义__CC2650EM_7ID_H__)&&!(已定义__CC2650_LAUNCHXL_Board_H__)
案例RfSetup_HSM:

rxCmdHndl = RF_postCmd (rfHandle,(RF_Op*)RF_pCmdRxHS,RF_PriorityNormal,&Rx_callback,RF_EventRxEntryDone);
crcOk =&rxStatistics_hs.nRxOk;
RSSI =&rxStatistics_hs.lastRssi;
中断;
#endif
#if (已定义__CC2650EM_7ID_H__)||(已定义__CC2650_LAUNCHXL_Board_H__)||(已定义__CC1350_LAUNCHXL_Board_H__)||(已定义__CC1350STK_SENTAG_Board_H__)
Case RfSetup_BLE:

rxCmdHndl = RF_postCmd (rfHandle,(RF_Op*)RF_BLE_pCmdbleGenericRx,RF_PriorityNormal,&Rx_callback,RF_EventRxEntryDone);
crcOk =&rxStatistics_ble.nRxOk;
RSSI =&rxStatistics_ble.lastRssi;
休息;
#endif
默认值:
#ifndef Add_my_Changes
rxCmdHndl = RF_postCmd (rfHandle,(RF_Op*)&RF_cmdPropRx,RF_PriorityNormal,&Rx_callback,RF_EventRxEntryDone);
#endif
crcOk =&rxStatistics_prop.nRxOk;
RSSI =&rxStatistics_prop.lastRssi;
中断;
}

*crcOk = 0;
*RSSI =0;
while (true)(对)
{
#ifndef Add_my_Changes
IF(packetReceived)(如果已收到打包)
{
packetReceived =假;
menu_updateRxScreen(*crcOk,*RSSI);
}

如果(menu_isButtonPressed())
{
/*强制正常中止*/
rf_cancelCmd (rfHandle,rxCmdHndl,0);
RF_pendCmd (rfHandle,rxCmdHndl,RF_EventRxEntryDone);
RF_CLOSE (rfHandle);
返回TestResult_Aborted
;}
}
#否则
rxCmdHndl = RF_postCmd (rfHandle,(RF_Op*)&RF_cmdPropRx,RF_PriorityNormal,&Rx_callback,RF_EventRxEntryDone);
semaphore_pend (semHandle,BIOS_WAY_Forever);
RET =(((volatile RF_Op*)&RF_cmdProprx)->状态;
开关(RET)
{
案例PROP_DON_OK:
Pin_setOutputValue (ledPinHandle,Board_LED1,1);// LED打开
CPUdelay ((UINT32_t)(1.2万*1));/* 1ms */
Pin_setOutputValue (ledPinHandle,Board_LED1,0);// LED关闭
状态= RET;
中断;
Case PROP_DON_RXTIMEOUT:
Pin_setOutputValue (ledPinHandle,Board_LED2,1);// LED打开
CPUdelay ((UINT32_t)(1.2万*1));/* 1ms */
Pin_setOutputValue (ledPinHandle,Board_LED2,0);// LED关闭
状态= RET;
中断;
默认:
Pin_setOutputValue (ledPinHandle,Board_LED3,1);// LED打开
CPUdelay ((UINT32_t)(1.2万*1));/* 1ms */
Pin_setOutputValue (ledPinHandle,Board_LED3,0);// LED关闭
状态= RET;
中断;
}
menu_updateRxScreen(status,*RSSI);
}
#endif
}

void rx_callback(RF_handle h, RF_CmdHandle ch, RF_EventMask e)
{
IF (E和RF_EventRxEntryDone)
{
/*获取当前未处理的数据输入*/
currentDataEntry = RFQueue_getDataEntry ();

/*对于TC_HSM,数据包长度和指向有效负载第一个字节的指针可以如下所示:
*
* uint8_t packetLength =(*(uint8_t*)(&currentDataEntry ->数据+ 1))<8)|(*(uint8_t*)(&currentDataEntry ->数据));
* uint8_t* packetDataPointer =(uint8_t*)(&currentDataEntry ->数据+ 2);
*
*对于其他测试用例(TC_LRM,TC_OOK和TC_FSK),包长度和第一个有效负载字节可在此处找到:
*
* uint8_t packetLength =*(uint8_t*)(&currentDataEntry->data);
* uint8_t* packetDataPointer =(uint8_t*)(&currentDataEntry ->数据+ 1);
*/
packetReceived =真;
RFQueue_nextEntry();
}
#ifdef Add_my_Changes
semaphore_post(semHandle);
#endif
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    您是否可以使用rf_runCmd()代替rf_postCmd(),而不使用信号量来重复测试? 我只是想让100 % 确定命令确实已完成。 您是否还可以通过修改Rx_callback()函数来测试您是否收到另一个不需要的回调? 在这种情况下,信号量会更频繁地被张贴。  

    #include <Assert.h>
    
    void rx_callback (rf_handle h,rf_cmdHandle ch,rf_EventMask e)
    {
    IF (E和RF_EventRxEntryDone)
    {
    /*获取当前未处理的数据输入*/
    currentDataEntry = RFQueue_getDataEntry ();
    
    /*对于TC_HSM,数据包长度和指向有效负载第一个字节的指针可以如下所示:
    *
    * uint8_t packetLength =(*(uint8_t*)(&currentDataEntry ->数据+ 1))<8)|(*(uint8_t*)(&currentDataEntry ->数据));
    * uint8_t* packetDataPointer =(uint8_t*)(&currentDataEntry ->数据+ 2);
    *
    *对于其他测试用例(TC_LRM,TC_OOK和TC_FSK),包长度和第一个有效负载字节可在此处找到:
    *
    * uint8_t packetLength =*(uint8_t*)(&currentDataEntry->data);
    * uint8_t* packetDataPointer =(uint8_t*)(&currentDataEntry ->数据+ 1);
    */
    packetReceived =真;
    RFQueue_nextEntry();
    } 否则{ 
    //收到不需要的回叫事件时停止 断言(false); } #ifdef Add_my_Changes semaphore_post(semHandle); #endif }

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我已经完成了这些测试,并添加了一些代码,以在液晶屏上显示事件值!(e & RF_EventRxEntryDone)

    使用RF_runCmd ()而不是RF_postCmd ()重复测试,并且不使用信号量:

    Rx和超时均可正常工作,Rx周期为50ms,但超时为92ms。

    根据代码修改回调函数:

    (1)使用RF_runCmd()和:

      (a) Assert()到位:

        Rx -运行一小段时间,然后断言

        No Rx (无处方)-立即断言

      (B)将assert()更改为(a uint64_t类型)事件= e:

        'Othe' Rx回调值为2 (虽然前面可以有另一个值快速)

    (2)使用RF_postCmd()和:

      (a) Assert()到位:

        同上

      (B)将assert()更改为(a uint64_t类型)事件= e:

        如上所述,当从状态2变为3时,状态值在变为2之前会短暂变为1

    此致,

    David。