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.

[参考译文] CC2640R2F:SDK_5_30_00_03 blestack multi_role 项目、默认自旋锁导致8个子原因85

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1168715/cc2640r2f-sdk_5_30_00_03-blestack-multi_role-project-default-spinlock-cause-8-subcause-85

器件型号:CC2640R2F
主题中讨论的其他器件: LAUNCHXL-CC2640R2

我有一个基于 multi_role 示例的项目、在该示例中、我获得了原因8和85子条款的默认自旋锁错误。

当我只有一个基于外设的简单 BLE 器件连接到 multi_role 时、就会发生这种情况、在几分钟到一小时的连接后、它会随机发生。

查看 HAL_ASSERT 定义会将原因8定义为 HAL_ASSERT_CAUSE_hardware_error。 我找不到详细的第85款。

如果您对85V 的子原因以及从何处开始查找问题提出任何建议、我们将不胜感激。

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

    尊敬的 David:

    您能否澄清一下此行为是在 LaunchPad 上还是在定制板上发生? 如果在定制板上发生、那么您是否可以尝试复制 LaunchPad 上的行为? 通过查看 multi_role 项目中存在的 hal_assert.h 文件、子原因85 (0x85和85)似乎在项目定义的子原因范围内。 您能否分享对 multi_role 项目所做的一些修改?

    此致、

    1月

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

    你(们)好、Jan

    感谢您的快速响应。

    我将定制 PCB 与主机微控制器配合使用、CC2640R2位于具有天线、稳压器等的现成模块上(Innocomm BM15_AN R2)。

    我没有创建自定义的 multi_role 项目、原始开发人员退出、我正在尝试对其进行整理、因此您对子原因的评价很有趣。 我已将 hal_assert.h 中的注释解释为子原因85 (即十进制85)将是 multi_role 示例项目的一部分、而不是我们自定义的一部分、在这些自定义中、我从未看到过提到 hal_dassert。

    此外、我刚刚搜索了项目中的"assertSubcause"和"HAL_assert_set_SUBCAUSE"、根据 halAssertHandlerExt (assertCaserCause)函数、在调用前将设置该函数、并且在自定义代码中不会使用这些函数、甚至在 multi_role 代码中也不会使用这些函数。

    您希望我分享什么代码?

    我曾尝试通过 Launchpad XDS110进行调试、但还不需要处理它。

    此致

    David

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

    尊敬的 David:

    据我所知、子原因的这些值范围由应用程序定义(由程序员添加其他自定义设置或由添加这些设置的默认示例定义)。 但是、这些定义应该在项目中的某个位置可见、因此很奇怪、它们似乎不存在。 您提到您有 LaunchPad。 这是 CC2640RF LaunchPad 吗? 如果是、那么您能否尝试将项目刷写到 LaunchPad 上并尝试重现问题? 这将有助于排除任何硬件问题。

    在要共享的代码方面、如果项目已被广泛修改、那么对更改的高级描述将非常有帮助。

    此致、

    1月

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

    你(们)好、Jan

    我有 CC2640R2 Launchpad、但很难从我们的定制 PCB 上运行该项目、因为它需要主机微控制器来完成配对并在连接时监控 BLE 外设数据。 此外、该模块使用与 Launchpad 不同的 CC2640R2F 芯片版本、因此需要进行一些 IO 重新定义。 我很可能明天(英国时间)会尝试这个想法。

    今天、我一直使用 Launchpad 并将基本 blestack multi_role 示例项目连接到简单外设、该项目已长时间连接、而没有多角色提供自旋锁。

    我们对基本 multi_role 项目所做的修改:

    主机控制器通过 UART 在两个方向与 CC2640R2F 进行通信、以相同的 UART 格式115200波特、代替终端和2个按钮。

    CC2640R2F 会根据要求将配对的外设存储在闪存中、以便将来无需主机输入即可自动连接。

    可用作具有多达3个外设的中央设备、也可在另一个时间关闭任何外设连接、用作手机应用程序的外设。 使用手机应用程序的外设操作运行良好、没有发出错误陷阱。 正如我在自旋锁发生之前所说的、当只有1个外设已配对和连接时、尽管在测试期间、我可以看到可能扫描了15个器件。

    我们有一个使用 MSPI 的调试端口、TX 仅在1MHz 频率下、但我已将其修整、因此除了自旋锁错误外不发送任何消息。

    项目正在使用'cache as RAM'配置。

    您对如何搜索代码以查看自旋锁调用的起源有什么看法吗?

    此致

    David

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

    尊敬的 David:

    明白。 在 LP 上运行软件将是消除任何可能的硬件问题的最简单方法。 关于可能的调试途径、您能否尝试在遇到自旋锁定并共享调用堆栈时暂停执行? 我还会尝试检查内存分配、以确保这不是内存分配问题。

    此致、

    1月

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

    您好、Jan、

    我正在尝试按照您的建议在 Launchpad XL 上运行代码、为此、我将只需几根导线即可用于控制 PCB 和 Launch XL 之间的 UART 和调试 SPI。

    现在、为了简化连接、我必须从我知道是可能的原始 LaunchXL 位置重新分配 SPI IO。

    为此、我修改了 SDK 应用手册中指定的 SDK/SOURCE /ti/boards/CC2640R2_LAUNCHXL/CC2640R2_LAUNCHXL.h、以设置 PCB。

    /* SPI Board */
    #define CC2640R2_LAUNCHXL_SPI0_MISO             PIN_UNASSIGNED
    #define CC2640R2_LAUNCHXL_SPI0_MOSI             IOID_8
    #define CC2640R2_LAUNCHXL_SPI0_CLK              IOID_9
    #define CC2640R2_LAUNCHXL_SPI0_CSN              IOID_11
    // Old LAUNCHXL assignments
    // #define CC2640R2_LAUNCHXL_SPI0_MISO             IOID_8          /* RF1.20 */
    // #define CC2640R2_LAUNCHXL_SPI0_MOSI             IOID_9          /* RF1.18 */
    // #define CC2640R2_LAUNCHXL_SPI0_CLK              IOID_10         /* RF1.16 */
    // #define CC2640R2_LAUNCHXL_SPI0_CSN              IOID_11

    但是、当我清理和编译然后运行时、我发现 SPI 调试仍然使用旧的引脚分配。

    我注意到 SDK/source/ti/blestack/boards/CC2640R2_LAUNCHXL_CC2640R2_LAUNCHXL.h 中还有一个链接的文件 这似乎是另一个 CC2640R2_LAUNCHXL.h 的副本、但我当然没有对其进行修改。 这是否覆盖了引脚?为什么有两个版本?

    这些事情会减慢开发速度。

    此致

    David

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

    尊敬的 David:

    对于这可能造成的任何延误、我深表歉意。 我知道、当开发受阻时、这会非常令人沮丧。 要更改板级配置文件、我建议参考 用户指南中 TI 提供的板级配置文件一章。 "创建定制板级配置文件 "部分也可能很有用。 我建议您创建自己的定制板级配置文件、以免修改 SDK 文件、因为这会影响 SDK 上运行的所有项目。 我将按照创建定制板级配置文件部分中详细介绍的步骤操作、由于项目将在 LaunchPad 上运行、因此我预计只需进行极少的更改、因为基本文件是用于 LaunchPad 的文件。

    此致、

    1月

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

    你好 Jan

    我现在已在 CC2640R2 LaunchpadXL 上运行该项目。

    我仍然遇到同样的问题、AssertCaser8的自旋锁、assertSubcause 85。

    我已经尝试使用调试和 RTOV、但我不知道要查找什么。

    下面的链接是我从 RTOV 获得的内容的屏幕截图:

    我还根据 SDK 调试的建议、在 multi-role.c 代码中添加了一些其他行、下面的第75-78行。

    /*********************************************************************
     * @fn      multi_role_processStackMsg
     *
     * @brief   Process an incoming stack message.
     *
     * @param   pMsg - message to process
     *
     * @return  TRUE if safe to deallocate incoming message, FALSE otherwise.
     */
    static uint8_t multi_role_processStackMsg (ICall_Hdr *pMsg)
    {
    	uint8_t safeToDealloc = TRUE;
    	//printMSPI("EVENT: %xb\n",pMsg->event);
    	switch (pMsg->event)
    	{
    		case GATT_MSG_EVENT:
    			// Process GATT message
    			safeToDealloc = multi_role_processGATTMsg ((gattMsgEvent_t *) pMsg);
    			break;
    
    		case HCI_GAP_EVENT_EVENT:
    		{
    			// Process HCI message
    			switch(pMsg->status)
    			{
    				case HCI_COMMAND_COMPLETE_EVENT_CODE:
    					// Process HCI Command Complete Event
    				{
    #if !defined (USE_LL_CONN_PARAM_UPDATE)
    
    					// This code will disable the use of the LL_CONNECTION_PARAM_REQ
    					// control procedure (for connection parameter updates, the
    					// L2CAP Connection Parameter Update procedure will be used
    					// instead). To re-enable the LL_CONNECTION_PARAM_REQ control
    					// procedures, define the symbol USE_LL_CONN_PARAM_UPDATE
    
    					// Parse Command Complete Event for opcode and status
    					hciEvt_CmdComplete_t* command_complete = (hciEvt_CmdComplete_t*) pMsg;
    					uint8_t   pktStatus = command_complete->pReturnParam[0];
    
    					//find which command this command complete is for
    					switch (command_complete->cmdOpcode)
    					{
    						case HCI_LE_READ_LOCAL_SUPPORTED_FEATURES:
    						{
    							if (pktStatus == SUCCESS)
    							{
    								uint8_t featSet[8];
    
    								// get current feature set from received event (bits 1-9 of
    								// the returned data
    								memcpy ( featSet, &command_complete->pReturnParam[1], 8 );
    
    								// Clear bit 1 of byte 0 of feature set to disable LL
    								// Connection Parameter Updates
    								CLR_FEATURE_FLAG ( featSet[0], LL_FEATURE_CONN_PARAMS_REQ );
    
    								// Update controller with modified features
    								HCI_EXT_SetLocalSupportedFeaturesCmd ( featSet );
    							}
    						}
    							break;
    
    						default:
    							//do nothing
    							break;
    					}
    #endif // !defined (USE_LL_CONN_PARAM_UPDATE)
    
    				}
    					break;
    
    				case HCI_BLE_HARDWARE_ERROR_EVENT_CODE:
    				{
    			        printMSPI ("MR: Hardware Error Event\n");
    				    hciEvt_HardwareError_t *hardCode =(hciEvt_HardwareError_t*)pMsg; // added DTJ as per SDK debugging
    				    AssertHandler(HAL_ASSERT_CAUSE_HARDWARE_ERROR, hardCode->hardwareCode); // added DTJ as per SDK debugging
    					// AssertHandler (HAL_ASSERT_CAUSE_HARDWARE_ERROR, 0); // original
    					break;
    				}
    
    				default:
    					break;
    			}
    		}
    			break;
    
    		case GAP_MSG_EVENT:
    			multi_role_processRoleEvent ((gapMultiRoleEvent_t *) pMsg);
    			break;
    
    
    		default:
    			// Do nothing
    			break;
    	}
    
    	return (safeToDealloc);
    }
    
    

    在测试时、我在这些段中放置了一个断点、它确认代码在发生自旋锁错误时达到此点。

    因此、我们可以看到、assertCusal 错误是'HAL_assert_cause_hardware_error'

    assertSubcause 为'hardwareCode' 0x85 (不是我之前说的85十进制)。

    现在浏览#include 文件、我看到错误0x85在 ll_common.h 中定义为硬件故障:

    "#define HW_FAIL_Unexpected RF_STATUS                  0x85"

    我不知道会导致这种情况的原因是什么以及如何解决它。

    谢谢

    David

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

    尊敬的 David:

    我很高兴听到您能够迁移到 LaunchPad。 这一点非常有用、因为这样可以将电路板设计本身排除为问题的可能原因。  HW_FAIL_Unexpected 射频状态错误提醒我此问题: https://sir.ext.ti.com/jira/browse/EXT_EP-10440

    您是否在使用 IAR?  您能否验证在 ble_Release, xscfg 中使用的 HEAPMGR_CONFIG 值?

    此致、

    1月

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

    你好 Jan

    我正在使用 CCS 9.3开发平台、因此我认为这不是问题所在。

    我没有真正解释我在做什么、这可能有一些影响:

    我的系统是来自传感器的数据记录、然后在会话结束时上传数据。

    这些传感器是 BLE 外设、它们连接到多角色、然后每隔一秒左右发送一小包数据。 虽然这种情况正在发生、但多角色不会作为外设进行广播。

    会话结束时、多角色会断开与所有传感器的连接、并作为外设进行广播、以连接到手机应用程序以上传会话数据。

    当多角色从传感器收集数据时、它仍在扫描其他传感器、这些传感器可能会在晚些时候启动、甚至永远不会出现。

    我今天已经做了进一步的测试、以下是我的更新:

    我尝试将最常导致自旋锁的传感器连接到加载到 CC2640R2 LaunchpadXL 的示例多角色项目。 连接后、两个设备都能正常运行数小时。 我偶尔做了"扫描"、但在大型计划中没有太多。

    相比之下、我的项目会持续扫描传感器(BLE 外设)、除非它达到3个器件的连接限制。 实际上、它每14秒扫描一次(4秒多角色项目扫描、10秒不扫描)。

    3.我很确定,扫描完成后,自旋锁就会出现,第一次测试时自旋锁在扫描结束后的4ms 出现。 当然、由于我使用 Launchpad LED 和示波器作为标记并作为 RTOS 系统、因此很难精确测量、因此我不确定事件何时发生。

    谢谢

    David

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

    尊敬的 David:

    感谢您提供更多详细信息! 这非常有帮助! 您能否说明您如何处理扫描报告? 它是否与 multi_role 项目默认执行的操作类似?

    此致、

    1月

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

    你好 Jan

    我可以确认、自旋锁在扫描结束后约4ms 发生是可重复的。 我的意思是从'GAP_DEVICE_DISCOVERING_EVENT'开始扫描停止到'AssertHandler()'开始时。

    关于我们在扫描结束时所做的事情、这是一件奇怪的事情、我们不做任何事情、只需返回等待传感器的更新即可。 显然、这与保存器件列表的多角色示例不同。

    在扫描过程中、每次出现"GAP_DEVICE_INFO_EVENT"时、都会检查发现的设备是否有服务、以查看它是否是我们正在寻找的传感器、并在匹配时保存它。

    我在'gap_device_info_event'之后检查了发现的器件例程的时序、它似乎不会与自旋锁同时发生、它在 扫描结束时发生'gap_device_discovery_event'之前完成。

    在我的测试中、我仅在发生自旋锁时使用了一个兼容的传感器、因此在初始连接后、sevices 检查不会返回任何匹配结果。

    另一个需要注意的问题是、目前我有三个可能的传感器:第一个是标准第三方心率监护仪、另外两个是基于简单外设示例项目的定制器件。

    自旋锁似乎只在中央连接到基于简单外设的传感器而不是 HRM 器件时发生。

    谢谢

    David

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

    尊敬的 David:

    进一步研究此问题、根据您的应用、只有在您的设备连接到另一个设备或扫描时、您看到的错误才会发生。 我想进一步细化其中的哪一个方案。 是否可以在没有连接的情况下重现此问题? 您能否尝试实施积极的扫描用例(更频繁、更长时间地扫描)并查看问题是否表现出来?

    关于仅在连接到基于 SP 外设的器件时发生的问题、您能否共享基于简单外设的器件请求的连接参数以及 HRM 器件请求的参数? 我想尝试让它们使用相同的连接参数来查看是否有影响(假设它们已经不同)。

    当 multi_role 连接到(multi_role 位于外设连接中)时是否会发生此问题? 作为测试、您能否尝试忽略断言以查看发生了什么情况? 注释掉应该可以解决这个问题。 器件是否按预期继续工作?

    此致、

    1月

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

    你好 Jan

    我更改了参数、以便多角色中心扫描、然后等待1秒、然后再次扫描等、同时仍在执行数据收集。

    2.我在没有连接和没有目标传感器的情况下进行了测试,只需扫描即可。 我在没有发生自旋锁的情况下进行了2小时的测试。

    3.我将两个传感器配对,然后在没有传感器广播的情况下进行扫描。 再次在没有自旋锁的情况下进行2小时测试。

    4.我不能确切地确定您所指的连接参数以及如何从运行多角色中执行这些参数。 这就是我设法找到的内容:

    连接所有传感器外围设备(HRM 和 Simple Peripheral)时、连接角色为8、连接间隔为50、连接延迟为0、连接超时为2000。 但是 HRM 的 MTU 为23、SP 的 MTU 为246。

    SP 项目中的连接参数为:最小连接间隔100mS、最大连接间隔4s、最小从机延迟0、最大从机延迟500、GAP 角色任务优先级3。

    此外、使用手机上的 BLE 扫描仪应用扫描器件并查看 GAP 外设首选连接参数、我看到响应数组为:

    HRM [90、01、20、03、00、 00、58、02]

    SP [50、00、A0、00、00、 00、E8、03]

    我不知道如何将这些转换为更有用的内容。

    5.我禁用 assert_Handler 调用,只留下一条调试消息,以便我知道是否发生了这种情况。 到目前为止、发生了一个事件、多角色显然仍在继续、没有任何不良影响、并且中央设备未与传感器断开连接或丢失数据。 我已经离开了这段跑步时间、以了解在更长的时间内会发生什么。

    谢谢

    David

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

    尊敬的 David:

    明白。 感谢您提供更多信息! 关于连接参数、我认为您已获得我所需的一切。 您能否尝试更改 SP 项目上的连接参数以匹配 HRM? 具体而言、您能否在 SP 项目中更改最小和最大连接间隔、以匹配 HRM 也使用的50。 如果可能、我还会尝试更改 MTU 大小以匹配。

    您能否尝试这些修改并验证观察到的行为是否有任何影响?

    此致、

    1月

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

    你好 Jan

    1.我在实验中禁用了自旋锁,但在夜间运行。 我的 MR 中心连接了一个 SP 传感器。 当我今天返回时、SP 传感器和 MR 中心正在运行、并连接了将数据从传感器传输到中心。 然而奇怪的是 MR 扫描已停止。 拖网浏览我找到的调试数据:a)我们忽略了38个"锁定"事件、b)扫描在大约7小时后停止(大约5400次扫描)。

    2.在 SP 项目中,我将 MAX_PDU_SIZE 更改为27 (MTU 23),将 DEFAULT_RETOVE_MIN_CONN_INTERVAL 更改为 40 (50mS),然后重新测试。 这将导致从 MTU 的 MR 协商大小为23和连接间隔为50的消息报告进行调试。 我发现、通过这些更改、我仍然收到自旋锁事件、一次扫描再次停止、但这次仅在重新启动后10分钟后停止。 因为这不能帮助我将参数改回其原始值。

    此致

    David

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

    尊敬的 David:

    感谢您进行这些额外的测试! 扫描停止后设备是否挂起? 您是否也可以共享您的扫描参数?

    此致、

    1月

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

    你好 Jan

    1.扫描停止时,设备没有挂起,实际上它继续工作,并从连接的 SP 传感器接收更新的信息。

    2. Multi_role 的扫描参数为:

    /*********************************************************************
     * CONSTANTS
     */
    
    // NOTE: MTU size defined in ble_user_config.h file within the BLE stack as MAX_PDU_SIZE 69
    // Enable/Disable Unlimited Scanning Feature
    #define ENABLE_UNLIMITED_SCAN_RES             FALSE
    
    // Maximum number of scan responses
    // this can only be set to 15 because that is the maximum
    // amount of item actions the menu module supports
    #define DEFAULT_MAX_SCAN_RES                  15
    
    // CONNECTION INTERVAL RULE 12.5 + 5*n where n is number of connected device!
    
    // Advertising interval when device is discoverable (units of 625us, 160=100ms)
    #define DEFAULT_ADVERTISING_INTERVAL          160
    
    // Limited discoverable mode advertises for 30.72s, and then stops
    // General discoverable mode advertises indefinitely
    #define DEFAULT_DISCOVERABLE_MODE             GAP_ADTYPE_FLAGS_GENERAL
    //#define DEFAULT_DISCOVERABLE_MODE             GAP_ADTYPE_FLAGS_LIMITED
    
    // Connection parameters
    #define DEFAULT_CONN_INT                      50
    #define DEFAULT_CONN_TIMEOUT                  2000
    #define DEFAULT_CONN_LATENCY                  0
    
    // Default service discovery timer delay in ms
    #define DEFAULT_SVC_DISCOVERY_DELAY           1000
    
    // Scan parameters
    #define DEFAULT_SCAN_DURATION                 4000
    #define DEFAULT_SCAN_WIND                     80
    #define DEFAULT_SCAN_INT                      80
    
    // Discovery mode (limited, general, all)
    #define DEFAULT_DISCOVERY_MODE                DEVDISC_MODE_ALL
    
    // TRUE to use active scan
    #define DEFAULT_DISCOVERY_ACTIVE_SCAN         TRUE
    
    // Set desired policy to use during discovery (use values from GAP_Disc_Filter_Policies)
    #define DEFAULT_DISCOVERY_WHITE_LIST          GAP_DISC_FILTER_POLICY_ALL
    
    // TRUE to use high scan duty cycle when creating link
    #define DEFAULT_LINK_HIGH_DUTY_CYCLE          FALSE
    
    // TRUE to use white list when creating link
    #define DEFAULT_LINK_WHITE_LIST               FALSE

    3.做更多调查发现扫描停止的原因是因为多角色周期性事件时钟已停止。 在我的项目中、扫描会在定期更新期间重新启动。 我的代码中没有停止周期时钟的命令、因此我认为它来自堆栈中的某个位置。

    4.我添加了一条调试线路来检查每次接收到来自 SP 传感器的数据时周期时钟是否处于活动状态、因为这不会影响周期时钟、此时间间隔大约为2秒。 我的代码使用'Util_isActive (Clock_Struct* pClock)'函数。

    5.主时钟是否可能超时但不会被激活,从而无法重新启动时钟? 它是否会显示为时钟未激活。

    此致

    David

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

    尊敬的 David:

    感谢您提供更多详细信息! 您继续进行的调试工作对我们更好地了解可能发生的情况非常有帮助。 由于某种原因、周期性事件可能不会因某种原因重新启动。 您能否尝试向代码中添加一些检查时钟是否处于活动状态的附加逻辑、以便在时钟未处于活动状态时重新启动它?

    此致、

    1月

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

    你好 Jan

    我已经在考虑添加一个周期性时钟停止测试、以便我可以尝试"随意"重新启动它。

    2.我不能完全确定在哪里进行这样的测试。

    3.目前我正在运行一个实验,以查看在周期性时钟停止时,'ulti_role_taskFxn()'函数是否仍然被调用。 我已经为这个添加了一些 LED 输出、用于示波器监控。

    4.每当 MR Central 从 SP 传感器接收数据时,我会在'multi_role_processGATTMsg()函数中测试'Util_isActive (Clock_Struct* pClock)'函数的结果。 如果发生 Clock_isActive = false、则发送到调试。 但是、即使工程正在运行、我也会看到这种情况发生、因此我猜测在时钟超时 和事件通知我的应用之间、RTOS 中存在一些相位问题或时序延迟。 因此、我需要添加更智能的内容来检测问题。

    5.当我确定如何进行第4轮比赛时。 在上面、我将尝试自动重新启动周期性时钟。 这种情况将持续到明天(星期五)。

    此致

    David

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

    尊敬的 David:

    我建议研究定期回顾事件、以确保在所有情况下重新启用时钟。 要检查时钟对象是否仍处于活动状态、您可以将其添加到周期性事件回调中、也可以添加其他周期性事件(用于调试目的)以检查周期性事件的状态。

    此致、

    1月

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

    你好 Jan

    感谢您的想法。 我一定会尝试使用第二个周期时钟的"周期时钟看门狗"。 我想、如果我们持续忽略这些错误、我们将尝试找出发生了什么情况。

    同时、您能否围绕周期性时钟来建议代码、正如我之前可能说过的、我没有编写此代码、而是从不再在项目中的开发人员那里继承该代码。

    周期时钟的操作如下:

    在函数中:'ulti_role_init()'使用'Util_constructClock()'和'clockHandler'的回调创建周期性时钟。 周期时钟使用'Util_startClock()'启动。

    2.在'clockHandler'中,一个事件被布置到带有'Event_post ()'的堆栈中。 这是回调中的唯一过程。

    3.在函数'ulti_role_taskFxn()'中,处理时钟事件并 调用函数'periodHandler()'。

    4.在函数'periodHandler()' 中,使用'Util_restartClock()'重新启动周期性时钟。

    我立即想到的是为什么定期时钟会间接地重新启动、而不是在回调中重新启动。 我知道'periodHandler()'中的其他进程由于处理时间不应处于回调状态。

    时钟处理程序事件是否可能由于其他事件(例如导致自旋锁的任何事件)而被堆栈"丢失"、从而导致周期性时钟丢失?

    谢谢

    David

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

    尊敬的 David:

    您所描述的周期性时钟设置听起来正确。 simple_peripheral 项目也实现了周期性时钟事件、所使用的设置与您所描述的非常相似。 回调函数应包含可能的最小代码量、这可能是在回调之外重新启动时钟的原因。 但是, Util 的 RestartClock()被用于 Util_startClock()的原因是否具体? 当您也想更改时钟的超时时时时,通常也会使用 Util_restartClock()。

    这可能会导致自旋锁导致重新启动事件被正确处理。 添加"周期时钟看门狗"可以帮助我们了解这种情况是否发生、以及忽略自旋锁的长期影响是什么。 这可能进一步帮助我们缩小可能在这里发生的情况。

    此致、

    1月

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

    你好 Jan

    为您提供最新信息。

    1、代码使用 Util_restartClock()的原因,当发生某些高优先级事件时,定期时钟被重新安排,Util_restartClock()将其设置回正常周期。

    2.为了避免 Util_restartClock,我已将高优先级事件移至它们自己的例程,并在 multi_role_taskFxn()中发布独立的事件。 这应该意味着函数会更及时地扩展。 然后我更改为使用 Util_startClock()。

    3.我已经用一个看门狗测试了修订后的代码用于周期定时器并且忽略自旋锁一段时间了,现在两个事件都发送了调试消息。

    从星期一下午12点到星期二上午8点、我没有发生自旋锁事件、只有1个周期时钟看门狗事件、代码在连接两个传感器的情况下继续运行、没有问题。 因此、尽管结果看起来更好、但周期性时钟仍然停止一次、这是没有明显原因的。

    5.从星期二上午8点到星期二下午5点,我有0个周期时钟看门狗事件,但有7个自旋锁错误事件。

    不过、测试环境是一个小型工厂、星期一的 BLE 活动很少、扫描的器件数量通常为3到6个。 星期二、工厂忙碌、我看到每次扫描都扫描14或15台(最大)设备。 我有一种直觉、即扫描的设备越多、就越有可能出现自旋锁问题。

    6.我不得不说,我不理解'GAP_DEVICE_DISCOVERY'中的'Device Scanned'编号。 当我测试时、我在与多角色项目类似的时间使用我的手机与 BLE Scanner 应用进行扫描、而在多角色报告5或6个设备时、我通常从手机应用中获得3个设备的结果。 可能已连接的设备已"封装"、它们未出现在我的手机应用程序中

    谢谢

    David

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

    尊敬的 David:

    感谢您的更新! 在发生旋转锁定事件后、您是否看到任何意外行为? 您的手机可能会过滤掉某些扫描设备、这会导致扫描结果金额出现这种差异。 您可以尝试在拥挤的 BLE 环境中执行测试吗? 办公室往往拥有数十种 BLE 器件、因此这可能是一个很好的测试场所。

    此致、

    1月

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

    你好 Jan

    multi_role 项目通过"#define DEFAULT_MAX_SCAN_RES 15"设置为最多扫描15个器件、因此它在拥挤的 BLE 环境中如何过滤要扫描的器件、从而查找我们感兴趣的器件?

    我将在不同的环境中执行更多有关使用自旋锁忽略和定期计时器看门狗进行测试的工作、并将在几天内更新。

    谢谢

    David

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

    尊敬的 David:

    明白了。 我期待您的测试结果!

    DEFAULT_MAX_SCAN_RES 控制可从单个扫描实例生成和存储的最大扫描结果量。 要在单次扫描中获得更多器件、您可以增加  DEFAULT_MAX_SCAN_RES 、也可以尝试启用 无限制扫描 功能。

    此致、

    1月

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

    你好 Jan

    我在连接3个传感器的情况下连续测试了 multi_role 项目约60小时、将 DEFAULT_MAX_SCAN_RES 保留为15。

    在此期间、我发生了24次硬件自旋锁错误、我忽略了这些错误。

    我还发生了19次周期性时钟停止、这些时钟被看门狗捕获并重新启动。

    最重要 的是、在任何情况下、与3个传感器的连接都不会丢失或重置、而是在接收数据后大约每1到2秒进行一次。

    值得注意的是、当扫描的器件数量较高、达到或接近15个限值时、会发生硬件自旋锁错误。

    周期性时钟误差更加随机、看起来与硬件自旋锁误差没有直接关联。

    因此、我倾向于使用这些添加内容继续进行项目、除非您认为可能存在硬件压力导致的可靠性不高、监管问题(例如无线电操作超出正确参数或类似参数)等问题。

    你怎么看?

    谢谢

    David

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

    尊敬的 David:

    我很高兴听到这个项目能够在您的扩展测试中按您的预期运行! 如果您要继续执行当前的解决方法、那么我强烈建议您进行一些严格的长期测试、以确保项目的长期稳定性。

    我发现、当扫描设备的数量接近  DEFAULT_MAX_SCAN_RES 的最大值时、自旋锁频率会增加。 是否可以尝试更改此值(较低和较高)以查看是否仍然看到效果?  

    此致、

    1月

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

    你好 Jan

    我一直在研究项目的另一个领域、将 BLE 模块用作连接到智能手机应用的外设

    在此过程中、我发现有时发布到多角色堆栈的事件会"丢失"、这就是周期性时钟停止的原因、因为它依赖于事件处理来重新启动、

    我之所以发现这一点、是因为我还在发布 UART 事件、 例如、接收消息、尽管通过调试和示波器跟踪、我可以看到、尽管消息到达且事件已发布、但事件处理程序有时并未调用用于使用它的应用程序代码。

    此外、我发现使用 SDK 5.30.0.03比使用 SDK 版本3.40.0.10更普遍、以至于我不得不恢复到旧的 SDK 以继续工作。

    此致

    David

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

    尊敬的 David:

    感谢您的更新! 我很高兴听到您在此期间能够继续在您的项目的其他领域取得进展。 在较旧的 SDK 版本中、行为的频率似乎会降低、这一点很奇怪。 您之前提到过、您能够再现 LAUNCHXL-CC2640R2上的行为。 您是否仍在使用 LaunchPad 进行调试或使用定制板? 使用 launchpad 或定制板观察到的3.40中的频率是否降低?

    我想、可能有一个更高优先级的任务阻止了这些事件的发送。 您能否分享您在应用中使用的任务以及每个任务的优先级?

    此致、

    1月

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

    你好 Jan

    我仍在使用 LAUNCHX 平台。

    我不确定您需要什么、下面是 config.h 中定义的事件列表

    // Internal Events for RTOS application, copied from multi_role.c as added new items
    #define MR_ICALL_EVT                    ICALL_MSG_EVENT_ID // Event_Id_31
    #define MR_QUEUE_EVT                    UTIL_QUEUE_EVENT_ID // Event_Id_30
    #define MR_STATE_CHANGE_EVT             Event_Id_00
    #define MR_CHAR_CHANGE_EVT              Event_Id_01
    #define MR_CONN_EVT_END_EVT             Event_Id_02
    #define MR_KEY_CHANGE_EVT               Event_Id_03
    #define MR_PAIRING_STATE_EVT            Event_Id_04
    #define MR_PASSCODE_NEEDED_EVT          Event_Id_05
    #define MR_PERIODIC_EVT                 Event_Id_06
    #define MR_PERI_DATA_READY_EVT          Event_Id_07
    #define MR_UART_EVT                     Event_Id_08
    #define MR_UART_CMD_READY_EVT           Event_Id_09
    #define MR_PCWATCHDOG_EVT               Event_Id_10
    
    #define MR_ALL_EVENTS                        (MR_ICALL_EVT           | \
                                                 MR_QUEUE_EVT            | \
                                                 MR_STATE_CHANGE_EVT     | \
                                                 MR_CHAR_CHANGE_EVT      | \
                                                 MR_CONN_EVT_END_EVT     | \
                                                 MR_KEY_CHANGE_EVT       | \
                                                 MR_PAIRING_STATE_EVT    | \
                                                 MR_PASSCODE_NEEDED_EVT  | \
                                                 MR_PERIODIC_EVT         | \
                                                 MR_PERI_DATA_READY_EVT  | \
                                                 MR_UART_EVT             | \
                                                 MR_UART_CMD_READY_EVT   | \
                                                 MR_PCWATCHDOG_EVT)

    这是 multi_role.c 中的任务优先级

    // Task configuration
    #define MR_TASK_PRIORITY                     1
    #ifndef MR_TASK_STACK_SIZE
    #define MR_TASK_STACK_SIZE                   610
    #endif
    

    这是 multi.c 中的任务优先级

    // Task configuration
    #define GAPROLE_TASK_PRIORITY         3
    #ifndef GAPROLE_TASK_STACK_SIZE
    #define GAPROLE_TASK_STACK_SIZE       540
    #endif
    

    下面是 multi_role.c 中的'multi_role_taskFxn'函数

    /*********************************************************************
     * @fn      multi_role_taskFxn
     *
     * @brief   Application task entry point for the multi_role.
     *
     * @param   a0, a1 - not used.
     *
     * @return  None.
     */
    static void multi_role_taskFxn (UArg a0, UArg a1)
    {
    	// Initialize application
    	multi_role_init ();
    
    	// Application main loop
    	for (; ; )
    	{
    		uint32_t events;
    
    		// Waits for an event to be posted associated with the calling thread.
    		// Note that an event associated with a thread is posted when a
    		// message is queued to the message receive queue of the thread
    		events = Event_pend (syncEvent,
    		                     Event_Id_NONE,
    		                     MR_ALL_EVENTS,
    		                     ICALL_TIMEOUT_FOREVER);
    
    		if (events)
    		{
    			ICall_EntityID dest;
    			ICall_ServiceEnum src;
    			ICall_HciExtEvt *pMsg = NULL;
    
    			if (ICall_fetchServiceMsg (&src, &dest,
    				(void **) &pMsg) == ICALL_ERRNO_SUCCESS)
    			{
    				uint8_t safeToDealloc = TRUE;
    
    				if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity))
    				{
    					ICall_Stack_Event *pEvt = (ICall_Stack_Event *) pMsg;
    
    					if (pEvt->signature != 0xffff)
    					{
    						// Process inter-task message
    						safeToDealloc = multi_role_processStackMsg ((ICall_Hdr *) pMsg);
    					}
    				}
    
    				if (pMsg && safeToDealloc)
    				{
    					ICall_freeMsg (pMsg);
    				}
    			}
    
    			// If RTOS queue is not empty, process app message.
    			if (events & MR_QUEUE_EVT)
    			{
    				while (!Queue_empty (appMsgQueue))
    				{
    					mrEvt_t *pMsg = (mrEvt_t *) Util_dequeueMsg (appMsgQueue);
    					if (pMsg)
    					{
    						// Process message
    						multi_role_processAppMsg (pMsg);
    
    						// Free the space from the message.
    						ICall_free (pMsg);
    					}
    				}
    			}
    
    /*
     *  NO LONGER USED, back to flag and periodic
                else if (events & MR_UART_CMD_READY_EVT)
                {
                    uartCmdReadyACODE();
                }
    */
    
                else if (events & MR_UART_EVT)
                {
                    uartEventUART();
                }
    
    /*
     *  NO LONGER USED, back to flag and periodic
                else if (events & MR_PERI_DATA_READY_EVT)
                {
                    periRxDataACODE();
                }
    */
    
    			else if (events & MR_PERIODIC_EVT)
    			{
    				periodHandlerACODE();
    			}
    
    #ifdef PC_WATCHDOG
    			// periodic watchdog timeout
                else if (events & MR_PCWATCHDOG_EVT)
                {
                    pcWatchdogACODE();
                }
    #endif
    
    		}
    	}
    }
    

    如果我错过了一些有用的信息、请告诉我。

    谢谢

    David

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

    你(们)好、Jan

    还有一件事:

    我看不到'multi_role_taskFxn'底部的事件被清除的位置、尽管就我所看到的那样、这个使用与示例 multi_role 项目没有什么不同。

    此致

    David

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

    尊敬的 David:

    这些任务优先级看起来不错。 您是在自己的任务中执行 UART、还是在多角色任务中执行 UART?

    此致、

    1月

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

    你好 Jan

    我不确定、但我认为 UART 是多角色任务的一部分、因为'inituart()'在'ulti_role_init()'期间被调用、'MR_UART_EVT'在'ulti_role_taskFxn()'下被处理

    UART 事件以及周期性时钟事件似乎也会丢失。

    我在 main.c 中更详细地查看任务问题、注意到以下内容:

    int main()
    {
      /* Register Application callback to trap asserts raised in the Stack */
      halAssertCback = AssertHandler;
    
    #ifdef CACHE_AS_RAM
      // retain cache during standby
      Power_setConstraint(PowerCC26XX_SB_VIMS_CACHE_RETAIN);
      Power_setConstraint(PowerCC26XX_NEED_FLASH_IN_IDLE);
    #else
      // Enable iCache prefetching
      VIMSConfigure(VIMS_BASE, TRUE, TRUE);
      // Enable cache
      VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);
    #endif //CACHE_AS_RAM
    
    #if defined( USE_FPGA )
      HWREG(PRCM_BASE + PRCM_O_PDCTL0) &= ~PRCM_PDCTL0_RFC_ON;
      HWREG(PRCM_BASE + PRCM_O_PDCTL1) &= ~PRCM_PDCTL1_RFC_ON;
    #endif // USE_FPGA
    
      /* Register Application callback to trap asserts raised in the Stack */
      RegisterAssertCback(AssertHandler);
    
      PIN_init(BoardGpioInitTable);
    
    #if defined( USE_FPGA )
      // set RFC mode to support BLE
      // Note: This must be done before the RF Core is released from reset!
      SET_RFC_BLE_MODE(RFC_MODE_BLE);
    #endif // USE_FPGA
    
    #if !defined( POWER_SAVING ) || defined( USE_FPGA )
      /* Set constraints for Standby, powerdown and idle mode */
      // PowerCC26XX_SB_DISALLOW may be redundant
      Power_setConstraint(PowerCC26XX_SB_DISALLOW);
      Power_setConstraint(PowerCC26XX_IDLE_PD_DISALLOW);
    #endif // POWER_SAVING | USE_FPGA
    
    #ifdef ICALL_JT
      /* Update User Configuration of the stack */
      user0Cfg.appServiceInfo->timerTickPeriod = Clock_tickPeriod;
      user0Cfg.appServiceInfo->timerMaxMillisecond  = ICall_getMaxMSecs();
    #endif  /* ICALL_JT */
    
      /* Initialize ICall module */
      ICall_init();
    
      /* Start tasks of external images - Priority 5 */
      ICall_createRemoteTasks();
    
      /* Kick off profile - Priority 3 */
      GAPRole_createTask();
    
      /* Kick off application - Priority 1 */
      multi_role_createTask();
    
      /* enable interrupts and start SYS/BIOS */
      BIOS_start();
    
      return 0;
    }

    因此、还有一个 iCall 任务、从 ical_addrs.h 开始、优先级为5:

    /**
     * Initializer for an array of thread priorities.
     * Each element of the array corresponds to TI-RTOS specific
     * thread priority value given to a thread to be created
     * per the entry function defined in @ref ICALL_ADDR_MAPS
     * initializer, in the same sequence.
     */
    #define ICALL_TASK_PRIORITIES { 5 }
    
    /**
     * Initializer for an array of thread stack sizes.
     * Each element of the array corresponds to stack depth
     * allocated to a thread to be created per the entry function
     * defined in @ref ICALL_ADDR_MAPS initializer, in the same sequence.
     */
    #define ICALL_TASK_STACK_SIZES { 1000 }
    

    此致

    David

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

    尊敬的 David:

    我仍在研究这一点。 我将在星期二的某个时候提供有关当前状态的更新。 给您带来的不便、我们深表歉意。

    此致、

    1月

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

    尊敬的 David:

    您之前提到过、早期 SDK 中的问题不会频繁发生。 早期 SDK 中使用的工程是否与最新 SDK 中使用的工程相同? 您能不能尝试监控堆使用情况、以查看观察到行为时是否正在运行堆用尽?

    此致、

    1月

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

    你(们)好、Jan

    很抱歉、回复速度慢、我一直在项目的其他方面工作、并"生活"了这个问题。

    我刚刚在调试中运行了项目、断点设置为在周期性时钟停止工作且看门狗启动时停止。

    以下是这次使用 ROV 时的堆栈电池状态:

    此致

    David

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

    尊敬的 David:

    不用担心! 您能否将图片附加到此邮件的回复? 我无法打开外部文件共享网站。

    此致、

    1月

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

    你(们)好、Jan

    好的、现在作为图片附加。

    此致

    David

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

    尊敬的 David:

    ROV 看上去一切正常。 您能否将 HeapCallback 和 HeapMem 模块添加到 ROV 中、以便在行为发生时查看它们的状态?

    此致、

    1月

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

    你(们)好、Jan

    请参见下面的

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

    尊敬的 David:

    我有另一种方法可以用来检查堆、这可能会提供一些更深入的见解。  用户指南的调试通用堆问题部分详细介绍了这种方法。 本质上、我们需要定义 HEAPMGR_METERS 预定义、这将使一些全局变量可见、从而为我们提供一些见解。 在 HEAPMGR_metrics 已经被预先定义并且项目已经被建立后、我们能够在运行期间观察到以下变量:

    HeapmgrBlkMax

    HeapmgrBlkCnt

    HeapmgrBlkFree

    HeapmgrMemUB

    HeapmgrMemAlo

    HeapmgrMemMax

    HeapmgrMemFail

    遇到行为时、您能否检查这些变量的值是多少? 我对 heapmgrMemFail 变量特别感兴趣。  heapmgrMemFail 会告诉我们内存分配是否失败。 链接部分还包含有用的调试策略、可能在此处引起注意。

    此致、

    1月

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

    你(们)好、Jan

    我在尝试此操作时没有看到您想要的答案。

    我在 Properties/CCS Build/ARM Compiler/Predefined Symbols 中添加了'HEAPMGR_Metrics'、然后重建堆栈库和项目。

    然后我运行调试、但当程序到达断点或我暂停 运行时、堆上没有额外的信息。

    我缺少什么?

    谢谢

    David

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

    尊敬的 David:

    我对任何混乱感到非常抱歉。 这些变量是全局变量、可以通过"Expressions"窗口观察到它们。 在调试模式下、可以通过转到 View -> Expression 来打开表达式窗口。 然后、您可以添加所有全局变量、并在代码执行期间以及执行暂停时看到它们、如下所示:

    您能否检查行为发生时看到的值?

    此致、

    1月

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

    你(们)好、Jan

    我尝试了您的要求、但在屏幕截图中、您将看到大多数指标都无法识别、即使我在预定义符号中设置了"HEAPMGR_METERINs"。

    屏幕截图没有出现故障、就在我暂停跑步时。

    此致

    David

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

    尊敬的 David:

    奇怪的是、它们没有出现。 您能否共享预定义窗口的屏幕截图? 您是否已将其添加到堆栈项目和应用项目中? 如果没有、那么我会这样做、然后清理并重建项目。

    此致、

    1月

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

    你(们)好、Jan

    我没有向堆栈项目添加'HEAPMGR_metrics'、但现在我已经添加了、结果是相同的。

    随附了两个项目预定义的屏幕截图。

    谢谢

    David

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

    尊敬的 David:

    这很奇怪。 我在多角色项目中进行了相同的修改、可以看到这些变量。 作为一个快速完整性测试、您是否可以采用一个未修改的多角色项目、添加预定义、构建和测试、是否可以在那里看到变量?

    此致、

    1月

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

    你好 Jan

    是的、非常奇怪和陌生的人、由于预定义在 LaunchXl 上运行的基本'multi-role_CC2640r2lp_app'中不起作用、我在指标上得到的'未找到标识符'结果完全相同。

    如果您看下面的屏幕截图,您将看到表达式窗口及其后面的 iCall.c 列表,该列表显示 HEAPMGR_METERINAIED 已识别,并且 iCall_getHeapMgrGetMetrics ()函数已启用。

    但是、当我对该函数进行引用搜索时、在项目中的任何位置都找不到它的用法。

    我很确定项目是未修改的、但我不想在此时在计算机上重新加载 SDK 等、以防它弄乱其他东西! 我必须在我今天不在的笔记本电脑上尝试一下。

    谢谢

    David