单片机/MCU论坛
直播中

刘杰

7年用户 1219经验值
私信 关注

psoc6发送通知时CY_BLE_ERROR_MEMORY_ALLOCATION_FAILED和CM4出现故障怎么解决?

我在 PSOC6 上有一个应用程序,FreeRTOS 在双核模式下运行 BLE。 它通过一连串的大型通知(512 ATT MTU 大小,495 字节的有效载荷)快速卸载数据。 该项目以 " ce223508_psoc6_ble_multislave_RTOS 为例,"用于设置能够处理多个从站(BLE 连接)的 BLE 任务,以及 ce222046_throughput_measuring 的卸载/通知参数以实现最大吞吐量。" "
所有通知均通过此方法发送,在调用 API 之前,将检查连接状态、忙碌状态和通知启用状态:

uint8_t i;/* Send notification top all the connected device */for(i = 0; i < CY_BLE_CONN_COUNT; i++){    /* Confirm that the BLE stack is ready */    if (Cy_BLE_GATT_GetBusyStatus(appConnHandle.attId) == CY_BLE_STACK_STATE_FREE)    {        /* Check if the client/slave is both connected and subscribed to this notification */        if((Cy_BLE_GetConnectionState(appConnHandle) ==  CY_BLE_CONN_STATE_CONNECTED )              Cy_BLE_GATTS_IsNotificationEnabled( appConnHandle, handleValuePair.attrHandle))        {            /* Send BLE notification */            cy_stc_ble_gatts_handle_value_ntf_t param =             {                /* Fill all fields of the Write request structure ... */                .connHandle    = appConnHandle,                .handleValPair = handleValuePair,            };                        bleApiResult = Cy_BLE_GATTS_Notification( param);                        /* Check if the operation has been successful */            if(bleApiResult == CY_BLE_SUCCESS)            {                DebugPrintf("Info     : BLE - Sent notification. rn");            }            else            {                DebugPrintf("Failure! : BLE - Sending notification. Error Code: %d rn", bleApiResult);            }        }    }    else    {        /* Stack is busy, the current notification data will be dropped */         Task_DebugPrintf("Error    : BLE - Stack busy to send notification", 0u);    }}

当 BLE 组件中的 BLE 连接"的最大数量设置"为 1 时,应用程序可以正常运行。 但是,如果 BLE 连接"的最大数目设置"为 2,则在快速发送通知时,我开始收到来自 cy_BLE_Gatts_Notification(或 " cy_BLE_Gatts_sendNotification)方法的 CY_BLE_ERROR_MEMORY_ALLOCATION_FAILED " 错误响应,这最终会导致 CM4 故障。 无需连接第二个 BLE 设备即可导致此问题,仅仅允许一秒钟似乎就会导致此问题。 在呼叫发送通知期间,我从未看到 STACK_BUSY 事件。 我在发送通知之前和之后都调用 cy_ble_processEvents ()。
我试过从各个角度调试这个问题,更改 BLE 消息有效载荷的大小,更改 CM0 和 CM4 的分配内存,但无法解决问题。
                                                                                                                                                                                                                                                                                                                                                                                                        
                                                        

回帖(1)

哈哈哈

2024-1-26 17:12:15
如果在PSOC6上运行BLE应用程序时遇到CY_BLE_ERROR_MEMORY_ALLOCATION_FAILED和CM4出现故障的问题,可以考虑以下解决方法:

1. 内存分配失败:CY_BLE_ERROR_MEMORY_ALLOCATION_FAILED 表示内存分配失败,可能是由于可用内存不足引起的。可以尝试使用动态内存分配器(如malloc)来分配所需的内存,确保在使用动态内存时必要的内存管理策略,并避免内存泄漏和内存碎片。

2. CM4故障:如果CM4出现故障,可能是由于程序逻辑错误或不正确的代码导致的。建议检查代码逻辑,确保所有的指针和内存访问操作都是有效的,并且没有空指针引用或越界内存访问。还可以通过使用断点调试功能来跟踪代码执行的情况,以帮助确定故障的原因。

3. 调试和优化:可以使用调试工具和性能分析工具来识别性能瓶颈和内存使用情况。可以使用FreeRTOS的性能分析器来监视任务的CPU利用率和内存使用情况。还可以使用HeapAnalyzer等工具来检查内存分配和释放的情况,以确保内存管理的正确性。

4. 优化BLE通知:如果发送大型通知导致问题,可以考虑优化BLE通知的方式。可以尝试减小通知的大小,或者使用更小的ATT MTU来发送通知。还可以优化发送通知的算法和方式,例如使用缓冲区或DMA进行数据传输,以提高效率和吞吐量。

综上所述,解决PSOC6发送通知时遇到的问题需要综合考虑内存管理、代码逻辑、调试和优化等方面的因素,并根据具体情况采取相应的解决方法。
举报

更多回帖

×
20
完善资料,
赚取积分