工具/软件: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);
}