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.

[参考译文] CC2745R10-Q1:关闭 CAN 后的 STACK_OVERFLE_ERROR。

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1604999/cc2745r10-q1-stack_overflow_error-after-closing-can

器件型号: CC2745R10-Q1

尊敬的 TI 团队:

我们面临着代码达到 HAL_assert_Cause_stack_overflow_error 的问题。

我们观察到当我们 使用 closeCANInterface () 函数关闭 CAN 时会发生这个问题。 下面、我附上了一个代码片段供您参考。

从故障屏幕截图(已附加)中可以看出、由于空闲任务栈溢出、系统正在进入 HAL_assert_Cause_stack_overflow_error。

CAN 通信正常工作、但当我尝试关闭 CAN 时、系统稍后进入堆栈溢出置为有效。

代码参考:
空维护 (void *ptr)

  iEHL_canInit();
  GPIO_WRITE (iEHL_CAN_Control_STB、GPIO_LOW);//启用 CAN 收发器
  closeCANInterface();
  vTaskDelay (PDMs_to_ticks (100));
}

void iEHL_canInit (void)

  if (can_handle == NULL)
  {
    can_init();
    CAN_PARAMS_INIT (&canParams);

    canParams.eventCbk = eventCallback;
    canParams.EventMask = can_event_RX_DATA_AVAIL |
               CAN_EVENT_ERR_PASSIVE |
               CAN_EVENT_BUS_OFF |
               CAN_EVENT_RX_FIFO_MSG_LOST |
               CAN_EVENT_RX_RING_BUFFER_FULL;

    canParams.msgRamConfig =&msgRamConfig;

    can_handle = can_open (config_can_0、&canParams);
    if (can_handle == NULL)
    {
      while (1);//失败:系统停止或错误记录
    }
  }
}

void closeCANInterface (void)

  if (can_handle!= NULL)
  {
    CAN_Close (can_handle);
    CAN_Handle = NULL;
  }
}
环境详细信息:

控制器:CC2745R10

SDK:simplelink_lowpower_f3_SDK_9_11_01_13

请帮助我了解此栈溢出问题的根本原因、并提供建议的正确方法来安全关闭 CAN 接口。

谢谢您、
Ratan。

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

    您好:

    您在什么情况下关闭 CAN 接口? 这是在 BLE 任务中发生的吗?

    系统上所有任务的任务堆栈大小是多少;系统上有多少任务?

    此外、我建议将您的 SDK 从 9.11.01.13 升级到最新 (9.14.xx.xx)、因为更高版本的 SDK 中引入了许多关键更改。

    此致、

    Nima Behmanesh

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

    你好、Nima、

    我们将在项目中使用以下三个任务:
    xTaskCreate (MatLabFunction、“Task1",“,512、512、NULL、tskIDLE_Priority + 2、&MatLabHandle);
    xTaskCreate (MainFunction、“Task2",“,256、256、NULL、tskIDLE_Priority + 1、 MainFunHandle (&M);
    xTaskCreate(身份验证,“Task3",“,256、256、NULL、tskIDLE_priority + 1、 AuthHandle);

    我已经提供了代码参考。 CAN 接口已在 MainFunction() 中关闭。 当 5 秒内没有需要执行的任务时、MCU 会关闭或禁用所有驱动器以节省电量。 此时、我们关闭 CAN 句柄、以便 CAN 引脚可用作外部硬件中断。 如果检测到任何外部 CAN 信号、MCU 会立即唤醒并恢复执行。

    我已经分享了一个屏幕截图、其中显示了空闲任务中发生的堆栈溢出。

    此致、
    Ratan。

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

    尊敬的 Ratan:

    我建议增加负责关闭 CAN 句柄的任务的栈大小。 请进行测试并告诉我结果是什么。

    此致、

    Nima Behmanesh

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

    嗨、Nima、

    增加负责关闭 CAN 句柄的任务的栈大小后、问题仍未解决。 但是、当我从系统配置中增加空闲任务的堆栈大小时、问题就会得到解决。

    我不确定增加空闲任务栈大小是一种好的方法还是推荐的方法、请给予指导。

    此致、
    Ratan。

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

    嗨、Nima、

    我有一个新的观察要分享。 实际上涉及两种不同的基本代码:

    TI 旧代码、其中使用 Python 运行信道探测。

    TI 嵌入式代码、由 TI 直接与我们共享(此代码未在 TI 网站上提供)。 这是我们当前运行应用程序的代码库。

    今天、我使用 car_node 示例测试了 TI 旧代码、并观察到在此设置中关闭 CAN 句柄时没有问题。

    使用的 SDK:simplelink_lowpower_f3_SDK_9_14_00_39
    示例代码:car_node

    基于此、似乎问题特定于我们使用的 TI 嵌入式基本代码。 您能否建议一个更好的解决方案或建议的方法来正确处理此问题?

    此致、
    Ratan

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

    尊敬的 Ratan:

    可以增加空闲任务大小。 我只会确保在反复关闭 CAN 后、内存不会溢出。  

    对于 TI 嵌入式代码、该代码是完全嵌入的、因此与旧代码不同。 我建议遵循上述步骤、在监测溢出的同时增加空闲任务的大小。

    此致、

    Nima Behmanesh