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.

[参考译文] CC2340R5:系统堆栈溢出

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1459179/cc2340r5-system-stack-overflow

器件型号:CC2340R5
主题中讨论的其他器件:SysConfig

工具与软件:



我发现长时间运行 CC2340可能会导致崩溃。 我打开 Debug 模式来观察并发现系统堆栈溢出、但 CC2340仍正常运行。 如果出现系统堆栈溢出、CC2340不会立即进入函数(例如 faultISR)、这是否正常? 或者、如何使 CC2340在发生系统堆栈溢出时进入 faultISR? 我尝试将系统堆栈大小调整为1200、默认值为800、然后使用 ROV 观察同样的大小。 我发现、当我尝试连接时、堆栈峰值约为804、而当我使用 Notify 时、堆栈峰值达到936。

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

    您好!  

    感谢您联系我们。  

    听起来您已找到解决问题的方法-即增加堆栈大小。 干得不错。  

    问题- 如果出现系统堆栈溢出、CC2340不会立即进入函数、例如 faultISR、这是否正常? - 堆栈溢出 不会直接导致崩溃,因为它取决于系统写入数据的位置,以及什么被改变。 一般而言、 下次将使用通过堆栈溢出更改的数据时、系统将崩溃。 在本例中、数据似乎是在堆结束时写入的、因此系统实际上可能永远不会崩溃。  仍应解决此问题 -你找到的修复是正确的一个。  

    或者说如何在发生系统堆栈溢出时使 CC2340进入 faultISR?  - FreeRTOS 提供了一些用于此目的的机制-请参阅 https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/09-Memory-management/02-Stack-usage-and-stack-overflow-checking#stack-overflow-detection---method-1。 在 TI 工程中、可以通过 SysConfig > FreeRTOS > FreeRTOS > Stack Overflow Checking 来选择这些选项

    我希望这将有所帮助、  

    此致、  

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

    尊敬的 Cl é ment:
    首先,谢谢你的答复。 我仍然有一些问题、我想清楚地理解这些问题。

    1.当我的系统堆栈没有堆栈溢出时、也就是说、图片中将有一条从0x20008CE0开始的由0xA5组成的信息。 这是否意味着我尚未使用出现0xA5的区域?

    2.当我建立蓝牙连接并使用 Notify 时、我发现0x20008CE0之前的地址(例如0x20008C50到0x20008CDF)将从原来的0x00更改为写入数据。 这是否意味着系统堆栈溢出? 数据是向前写入的吗?

    3.在第一个问题之后、如果系统堆栈正在写入、我发现它将首先从地址底部写入、因此从0x20008CE0开始的一些字节在未使用时将显示为0xA5。 这种理解是正确的。 是的、那么当栈不需要太多使用时、数据是否会在释放后返回到0xA5?

    在 SysConfig > FreeRTOS > FreeRTOS > Stack Overflow 检查中进行"在任务切换时验证"会产生什么影响?  这与默认的16字节 Sentinel 模式之间有何区别? 我是否可以参考任何相关文档?

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

    您好、Ryan、  

    1. 当我的系统堆栈没有堆栈溢出时、也就是说、图片中将有一条由0x20008CE0开始的0xA5组成的信息。 这是否意味着我尚未使用出现0xA5的区域?

    "0xA5"值 通常是加那利语、旨在帮助开发人员(和工具) 检测栈溢出。 您可以假设填充了0xA5的区域没有被触摸-即使您无法100%确定是否 非常不幸、您也可能基本上将0xA5写入此区域(在实践中)。 我从未经历过这种情况)。  

    2. 当我建立蓝牙连接并使用 Notify 时、我发现0x20008CE0之前的地址(例如0x20008C50至0x20008CDF)将从原始的0x00更改为写入数据。 这是否意味着系统堆栈溢出? 数据是否向前写入?[/QUOT]

    我不确定。 您所描述的实际上可能会导致堆栈溢出。 这也可能是一些常规动态分配。 遇到此类问题或故障时、工具是否会报告此类问题或故障?
    如果增加堆栈大小、是否会有相同的体验? (如果是、则我认为这不是堆栈溢出)  

    3. 在第一个问题之后、如果系统堆栈正在写入、我发现它将首先从地址底部进行写入、因此从0x20008CE0开始的一些字节在未使用时将显示为0xA5。 这种理解是正确的。 是的、那么当堆栈不需要太多使用时、数据是否会在发布后返回到0xA5?[/QUOT]

    覆盖加那利线(0xA5)应该被认为是一个堆栈溢出-也就是说、你应该增加堆栈来避免这一情况。  
    加那利不会在被覆盖后恢复。 这可以确保即使在暂停程序执行后也可以检测到堆栈溢出。  

    4.在 SysConfig > FreeRTOS > FreeRTOS >堆栈溢出检查中执行"在任务时验证"切换会产生什么影响?  这与默认的16字节 Sentinel 模式之间有何区别? 我是否可以参考任何相关文档?
    [/quote]

    我建议参考 FreeRTOS 文档- https://www.freertos.org/Documentation/02-Kernel/02-Kernel-features/09-Memory-management/02-Stack-usage-and-stack-overflow-checking#stack-overflow-detection---method-1 

    此致、  

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

    尊敬的 Cl é ment:
    感谢您的答复。 我已经将系统堆栈增加到2048、但经过几天的测试、我发现 CC2340仍然崩溃。 我在10天内测试了50个 CC2340s、3个 CC2340s 崩溃。

    1.我想问一下 CC2340是否可以调用蓝牙功能来断开连接。 或者、在连接 CC2340并发出通知时、如果连接突然断开或发生其他中断、是否会导致崩溃?

    我想知道是否不建议在蓝牙框架中直接调用该函数、即使它可以在示例项目中的 app_peripheral.c 的 BLEAPPUTIL_ADV_START 情况下成功运行、如所附图片中所示、仍需要 BLEAppUtil_invokeFunctionNoData。

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

    您好!

    请问您使用的是哪一个 SDK 版本? 您还能否指定哪些  

    1. 我想问一下 CC2340是否可以调用蓝牙功能来断开未连接的连接。 或者、当 CC2340已连接并发出通知时、如果连接突然断开或发生其他中断、是否会导致崩溃?[/QUOT]

    在 突然断开连接的情况下、假设蓝牙连接状态尚未正确更新、则您所描述的场景可能存在导致崩溃的风险。  
    在这种情况下、启用看门狗(或在错误处理程序中触发复位)应允许在有限的副作用下恢复系统(因为仍然连接已丢失)。 如果您需要更多详细信息、请告诉我。

    2.我 想知道是否不建议直接在蓝牙框架中调用该函数、即使在示例项目中的 app_peripheral.c 的 BLEAPPUTIL_ADV_START 情况下该函数仍可成功运行、如所附图片中所示、BLEAppUtil_invokeFunctionNoData 仍是必需的。[/quothere]

    我不会向您推荐您选择的方法。 我建议在启用/禁用广播集时利用 BLEAppUtil 框架、即 BLEAppUtil_advStop()函数。  
    此外、由于  BLEAPPUTIL_ADV_START 事件是在任务上下文中传递的、因此不需要使用  BLEAppUtil_invokeFunctionNoData ()函数、您可以直接调用该函数。
    总的来说、建议基本上进行调用  BLEAppUtil_advStop (peripheralAdvHandle_1);

    我希望这将有所帮助、

    此致、  

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

    尊敬的 Cl é ment:
    感谢您的回答、我将进行更详细的测试。

    我还有一个问题。 在测试过程中、我发现、如果在使用蓝牙通知的情况下使用 UART2_WRITE 传输数据、CC2340将在两小时内崩溃。 如随附的图片所示、当我从情况更改为非阻塞时、UART2_writemode 似乎得到了改善。 我想问为什么?

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

    您好、Ryan、  

    在"UART blocking"主题中-这是预期的观察结果。  阻止呼叫会影响计时。 该蓝牙协议栈对时间非常敏感、因此我通常建议避免此类阻塞调用。  

    此致、   

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

    尊敬的 Cl é ment:
    很抱歉、我忽视了一个答案、我当前使用的是 SDK 的7.40.00.64版

    如果 UART2_readMode 是回调模式、则不使用阻塞回调。 我是对吗?


    2.但我在 UART2_READ()后添加了 sem_wait()。 这会影响蓝牙吗?

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

    您好、Ryan、  

    我当前使用的是版本7.40.00.64的 SDK

    我强烈建议迁移到最新的 SDK (截至今天为8.40)、因为已解决了几个错误。  

    [报价 userid="589790" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1459179/cc2340r5-system-stack-overflow/5617828 #5617828"]

    如果 UART2_readMode 是回调模式、则不使用阻塞回调。 我是对吗?


    2.但我在 UART2_READ()后添加了 sem_wait()。 这会影响蓝牙吗?

    [报价]

    1.正确!

    2.如果 sem_wait()影响连接蓝牙任务的任务的执行、那么您应该肯定地查看这些影响。 作为参考,在 UART2_READ()之后添加一个"sem_wait()",从技术上来说非常接近将 UART 设置为阻塞模式,因此行为可能不会改变。  

    此致、  

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

    尊敬的 Cl é ment:

    1.我想问一下、SDK 版本8.40.00.61中修复了哪些错误? 因为我查看了发行说明中的最新消息、所以似乎只有一些修复错误的描述、但没有更详细的修复信息、因此我无法确定它是否与我遇到的情况有关

    2.如果我不使用 SEM_WAIT()、我如何等待 Rx 接收数据?

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

    您好!  

    1. 我想提问、SDK 版本8.40.00.61中修复了哪些错误? 因为我查看了发行说明中的最新消息、所以似乎只有一些修复错误的描述、但没有更详细的修复信息、因此我无法确定它是否与我正在经历的情况有关

    有关详细信息、请参阅 BLEStack 版本说明。  
    您还可以参阅  SDK 8.40中已修复问题的完整列表-已修复问题、请参阅 TI BLE5-Stack 版本说明

    2. 如果我不使用 SEM_WAIT()、我如何等待 Rx 接收数据?

    数据在回调中传递。 然后、该解决方案将 从回调本身触发数据的处理-使用 BLEAppUtil_invokeFunction()或类似工具。  

    我希望这将有所帮助、

    此致、

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

    尊敬的 Cl é ment:

    我似乎已经发现了它卡在循环中的原因。 在今天的测试之后,我写了很多数据,并在蓝牙连接后启用了 Notify,然后突然失去了连接,这导致 SimpleGattProfile_SetParameter() App_Process 中的 GATT387CFG返回0x16。 即、该引脚当前处于挂起状态、然后进入循环。  

    1.我测试的 SDK 版本7.40和8.40都有这个问题。 但我检查了你提供的修复记录。 在 EXT_EP-11778和 EXT_EP-11752中、是否存在与我当前的情况类似的任何问题? 情况与这两个主题不同?

    2.最初的 SDK 增加了 while (1)、我想这是为了方便用户调试、所以如果移除它会影响蓝牙任务吗? 或者、如果未使用 while (1)、是否有更好的解决方案? 例如、如果响应不成功、请 App_Process 再次执行 GATT307Cfg。

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

    您好!

    1. 我测试了 SDK 版本7.40和8.40、两者都存在此问题。 但我检查了你提供的修复记录。 在 EXT_EP-11778和 EXT_EP-11752中、是否存在与我当前的情况类似的任何问题? 情况与这两个主题不同?
    [报价]

    我不相信所提到的门票是相关的。

    • EXT_EP-11778与发送大量通知时返回的"blePending "错误相关。 与连接丢失无关。  
    • EXT_EP-11752将在终止连接时产生存储器泄漏。  
    2. 最初的 SDK 添加 while (1)、我想这是为了方便用户调试、所以如果将其移除、它是否会影响蓝牙任务? 或者、如果未使用 while (1)、是否有更好的解决方案? 例如、如果响应不成功、请 App_Process 再次执行 GATT387Cfg。[/QUOTION]

    你所说的"while (1)"实际上-根据我个人的看法-是处理错误的一种糟糕的方式。 正如您所提到的、这使调试变得简单、但对于系统来说却是非常戏剧性的、因为系统基本上崩溃。  

    此致、   

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

    尊敬的 Cl é ment:

    感谢您的指导。 我将注释 while (1)、然后再次测试以查看是否有其他异常。
    我还想问两点

    1.我可以在工程中将 commom -> Profiles -> simple_GATT_profile.c 的路径设置为 simple_GATT_profile.c 吗? 我发现、即使我重置路径、它仍将在 SDK 中读取 simple_gatt_profile.c、而不是工程中的路径。

    2. SDK 8.40似乎具有新的 MCUBoot 特性。 这是否意味着在应用程序前面添加引导加载程序? 如果是、我可以使用 UART 更新应用程序区域中的程序(如 ROM 引导加载程序)吗?

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

    您好、Ryan、  

    您能否打开新主题以继续讨论?  

    我会离开办公室一段时间、无法跟进。  

    感谢您的理解、并感谢您目前为止的讨论质量。  

    此致、