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.

[参考译文] CC1310:RFQueue:缓冲区溢出的可能性?

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1499799/cc1310-rfqueue-possibility-of-buffer-overflow

器件型号:CC1310

工具/软件:

你好!

设置信息:

  • CC1310F32微控制器
  • NoRTOS 应用程序
  • 射频单模
  • 专有 RX 和 TX
  • SDK 4.20.02.07
  • CCS 12.8.1

我想了解在罕见/异常情况下是否会出现 RFQeue 缓冲区溢出? 以下是相关的代码片段、其中显示了如何设置 RFQueue 以及专有 RX cmd (RF_cmdPropRx):

#include DeviceFamily_constructPath(driverlib/rf_prop_mailbox.h)
#include "RFQueue.h"

/* Packet RX Configuration */
#define DATA_ENTRY_HEADER_SIZE 8   /* Constant header size of a Generic Data Entry */
#define MAX_LENGTH             100 /* Max length byte the radio will accept */
#define NUM_DATA_ENTRIES       2   /* NOTE: Only two data entries supported at the moment */
#define NUM_APPENDED_BYTES     3   /* The Data Entries data field will contain:
                                    * 1 Header byte (RF_cmdPropRx.rxConf.bIncludeHdr = 0x1)
                                    * Max 100 payload bytes
                                    * 1 RSSI byte (RF_cmdPropRx.rxConf.bAppendRssi = 1)
                                    * 1 status byte (RF_cmdPropRx.rxConf.bAppendStatus = 0x1)
                                    */

#pragma DATA_ALIGN(rxDataEntryBuffer, 4)
uint8_t rxDataEntryBuffer[RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES, MAX_LENGTH, NUM_APPENDED_BYTES)];

// CMD_PROP_RX
// Proprietary Mode Receive Command
rfc_CMD_PROP_RX_t RF_cmdPropRx =
{
    .commandNo = 0x3802,
    .status = 0x0000,
    .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
    .startTime = 0x00000000,
    .startTrigger.triggerType = 0x0,
    .startTrigger.bEnaCmd = 0x0,
    .startTrigger.triggerNo = 0x0,
    .startTrigger.pastTrig = 0x0,
    .condition.rule = 0x1,
    .condition.nSkip = 0x0,
    .pktConf.bFsOff = 0x0,
    .pktConf.bRepeatOk = 0x0,
    .pktConf.bRepeatNok = 0x0,
    .pktConf.bUseCrc = 0x1,
    .pktConf.bVarLen = 0x1,
    .pktConf.bChkAddress = 0x0,
    .pktConf.endType = 0x0,
    .pktConf.filterOp = 0x0,
    .rxConf.bAutoFlushIgnored = 0x0,
    .rxConf.bAutoFlushCrcErr = 0x0,
    .rxConf.bIncludeHdr = 0x1,
    .rxConf.bIncludeCrc = 0x0,
    .rxConf.bAppendRssi = 0x1,
    .rxConf.bAppendTimestamp = 0x0,
    .rxConf.bAppendStatus = 0x1,
    .syncWord = 0x930B51DE,
    .maxPktLen = 0x64,
    .address0 = 0xAA,
    .address1 = 0xBB,
    .endTrigger.triggerType = 0x1,
    .endTrigger.bEnaCmd = 0x0,
    .endTrigger.triggerNo = 0x0,
    .endTrigger.pastTrig = 0x0,
    .endTime = 0x00000000,
    .pQueue = 0, // INSERT APPLICABLE POINTER: (dataQueue_t*)&xxx
    .pOutput = 0 // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
};

static dataQueue_t dataQueue;

void *mainThread(void *arg0)
{
    RFQueue_defineQueue(&dataQueue,
                        rxDataEntryBuffer,
                        sizeof(rxDataEntryBuffer),
                        NUM_DATA_ENTRIES,
                        MAX_LENGTH + NUM_APPENDED_BYTES));
}

您将看到附加了长度字节(标头)以及 RSSI 和状态字节(#NUM_SUPPTED_Bytes = 3)。 接受的最大长度为100个字节(#MAX_LENGTH = 100且 RF_cmdPropRx.maxPktLen = 0x64)。

我执行了测试、其中绘制了的数据内容 rxDataEntryBuffer 使用幻值(0xCC)、接收到最大长度数据包、但未观察到缓冲区溢出。 大于100字节的射频数据包会被拒绝。 尽管如此、在极少数情况下、我们怀疑可能会发生缓冲区溢出。

在代码片段中、您将看到 RF_cmdPropRx.bIncludeCrc = 0且 RF_cmdPropRx.bAppendTimestamp = 0。 是否存在附加此或其他元数据的射频数据包错误条件(即使不应附加此数据或其他元数据)?

#MAX_LENGTH = 100。 如果元数据附加在的末尾之后、是否存在4字节对齐要求 rxDataEntryBuffer

提前感谢、

压电执行器

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

    您好、Pieter:

    1.您使用的是哪个版本的 SimpleLink SDK?

    2.当你说你怀疑缓冲区溢出,你能告诉我什么症状?

    3.是确实有4字节分配要求,每个队列条目都需要与4字节边界对齐。  

    https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_8_30_01_01/docs/proprietary-rf/proprietary-rf-users-guide/rf-core/data-queues.html 

    谢谢、

    Marie H

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

    尊敬的 Marie:

    我使用的是 Simplelink CC13x0 SDK 4.20.02.07。 如果我错了、但这是最新的、请告诉我。

    2、这是一个在黑暗中的射门。 问题一直是非常难以重现,到目前为止,我一直无法调试器件在这种坏状态。 在 RFQueue 数据缓冲区"rf_modem_rx_data_entry_bubley"之后分配了一个8位状态变量"net_dev_state"、症状与其损坏一致:

    3、我已经检查了、0x200004A0以及0x20000510位于4字节边界上。

    此致、

    压电执行器

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

    您的设置应该不可能出现缓冲区溢出。 据我所见、您对默认示例所做的唯一更改是添加 RSSI 状态、并关闭重复模式和滤波。

    如果是溢出、则对讲机设置的最大长度(100字节)的所有数据包都会发生这种情况。 您还已确认、如果您将长度字节设置为101、对讲机本身将过滤掉长度字节大于100的数据包。

    Siri

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

    尊敬的 Siri:

    好吧,谢谢检查:)这是一个镜头在黑暗中,我只是检查每一个可能性。

    此致、

    压电执行器