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.

[参考译文] CC2674R10:can_open()忽略 params->userArg

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1385190/cc2674r10-can_open-ignores-params--userarg

器件型号:CC2674R10

工具与软件:

大家好!

通过 SPI 使用 simplelink_cc13xx_cc26xx_sdk_7_40_00_77的 CAN 驱动程序来驱动 TCAN455X

can_open()被传递 CAN_PARAMS 结构:

typedef struct
{
    const CAN_MsgRAMConfig *msgRAMConfig;  /*!< Pointer to message RAM configuration */
    const CAN_BitRateTimingRaw *bitTiming; /*!< Pointer to raw bit timing values */
    CAN_EventCbk eventCbk;                 /*!< Pointer to event callback function */
    uint32_t eventMask;                    /*!< Mask of events to call event callback function for */
    void *userArg;                         /*!< User supplied arg for callback */
} CAN_Params;

观察:提供的'eventCbk'函数被调用为已配置,但其'userArg'参数始终为 NULL ,即 params->userArg,传递给 can_open()不会按预期传递到回调:

 *  @param[in]  userArg       A user supplied argument specified
 *                            in CAN_Params.
 */
typedef void (*CAN_EventCbk)(CAN_Handle handle, uint32_t event, uint32_t data, void *userArg);

can_open ()不会将成员'userArg'传输到 can_Object -下面是 source/TI/drivers/can.c 中 can_open ()的代码片段、其中有人预计他会发生:

"Params"也会传递到   source/TI/drivers/can/TCAN455X.c 中的 can_initDevice ()、但那里也忽略结构成员"userArg"。

 

这是一个已知限制、很快就会解决吗? 我想使用"userArg"、现在必须使用全局变量来解决该问题。

此致、

沃尔夫冈

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

    您好、Wolfgang、

    我明白您的意思。 在我看来、CAN_Params.userArg 实际上并没有被引用。

    权变措施可以是:

        /* Open CAN driver with default configuration */
        CAN_Params_init(&canParams);
        canParams.eventCbk  = eventCallback;
        canParams.eventMask = CAN_EVENT_MASK;
        canParams.userArg   = (void *) yourArg; // toby added
    
        canHandle = CAN_open(CONFIG_CAN_0, &canParams);
        if (canHandle == NULL)
        {
            /* CAN_open() failed */
            while (1) {}
        }
    
        // toby added
        canHandle->object->userArg = canParams.userArg;
        // end added

    我将与司机团队核实这是否是一个已知问题、但我怀疑这应该是一个问题。

    谢谢!
    Toby

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

    现已提交 TT 来解决此问题。

    感谢您的报告!

    我无法提供确切的时间表、但我最初的估计是第三季度或第四季度末。

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

    尊敬的 Toby:

    我还提出了这个权变措施、但应该注意的是、它具有在初始化期间在早期回调中仍然获得 userArg=NULL 的(非常小的)风险、具体取决于事件掩码和总线流量。 因此、应在回调中检查 userArg、而不是盲目取消引用(无论如何都是好的做法)。