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/LAUNCHXL-CC1310:两个任务共享 I2C 时死锁? (带有可疑的错误原因和潜在解决方案)

Guru**** 2611705 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/583143/rtos-launchxl-cc1310-deadlock-when-two-tasks-share-i2c-with-suspected-bug-cause-and-potential-solutions

器件型号:LAUNCHXL-CC1310

工具/软件:TI-RTOS

您好!


在 i2c_close 中、我的任务处于死锁状态、这是一个问题。

我目前有 TI-RTOS v2.21.00.06。

我有两个任务交替尝试与同一 I2C 总线上的器件进行通信。 在每个任务中、我尝试打开、如果打开失败、则在重试之前尝试打开。 任务结束通话后、它会在从 i2c_open 接收到的句柄上调用 i2c_close。

出现的情况是,当第二个任务调用 i2c_open 时,handle->object->hPin 被 PIN_open [*1]的 NULL 结果覆盖,因为该引脚正在使用中。 这会导致第一个任务在 i2c_close 中死锁、因为引脚句柄现在为 NULL、而 PIN_close 显然会在传递空句柄时死锁、因为它不检查 NULL [*2]。

* 1:I2CCC26XX.c:1030:
   object->hPin = PIN_open (&object->pinState、i2cPinTable);
   if (!object->hPin){
       返回 I2C_STATUS_ERROR;
   }

*2:PINCC26XX.c:448:
   //无需对 PIN_CLOSE ()的访问进行排序
   //用于端口位掩码中的每个引脚
   while (handle->bmPort){
       //查找最低索引引脚
       i = PIN_ctz (handle->bmPort);
       //取消分配引脚
       PIN_REMOVE (Handle、I);
   }


在我看来、使用 I2CCC26XX.c:1030处的临时变量而不是直接写入(可能已经打开) i2c 对象、可以解决此问题。

或者、检查引脚句柄是否为非空、如果是、则返回错误、而不使用失败的 PIN_open 的 NULL 结果覆盖有效的句柄。

此外、PIN_CLOSE 应该检查空指针并做出相应的响应。

我没有尝试过这些解决方案、因为 CCS 显然不允许我编辑相关文件。 它们被标记为只读、将其权限更改为读写和应用适当的编辑似乎没有任何效果、只是混淆了调试器。 我尝试按照修改我的构建配置  、但这也没有明显的效果。 如何使 CCS 尝试我的更改后的文件?

与此同时、我可以使用信标来解决这个错误。

   //无需对 PIN_CLOSE ()的访问进行排序
   //用于端口位掩码中的每个引脚
   while (handle->bmPort){
       //查找最低索引引脚
       i = PIN_ctz (handle->bmPort);
       //取消分配引脚
       PIN_REMOVE (Handle、I);
   }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kevin:
    我不确定如何发生死锁,因为关闭 I2C (调用 PIN_REMOVE)的任务仅在对象取消初始化后将 object->isOpen 设置为 false。 只要 object->isOpen 为 true,对 I2C_open()的任何其他调用都将返回 NULL。
    要测试您对 CCS 中驱动程序代码的更改、请将文件(例如 I2CCC26XX.c)复制到您的项目中。 然后、您将从复制的文件中链接代码、而不必重建驱动程序库。
    此致、
    Janet