如下代码在中断中使用xQueueSendFromISR将消息加入消息队列会死机,经过三天检查都没有找到问题
void HAL_HSEM_FreeCallback(uint32_t SemMask)
{
HAL_GPIO_TogglePin(GATEWAY_B_LED_GPIO_Port, GATEWAY_B_LED_Pin);
// 先重新激活中断通知,确保不会丢失下一个中断
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_1));
// 如果M7核心尚未就绪,直接返回
if(g_M7ReadyFlag != 1) return;
// 检查是否是指定HSEM被释放 (HSEM_ID_1 for CM7 in dual-core mode)
if((SemMask & __HAL_HSEM_SEMID_TO_MASK(HSEM_ID_1)) != 0)
{
// 从共享内存读取消息复制到本地的临时变量 (不直接使用g_Message)
DualCoreMessage tempMsg;
memcpy(&tempMsg, &g_M4ToM7Packet, sizeof(DualCoreMessage));
// 如果队列已创建,则将消息发送到队列中
if (xDualCoreMessageQueue != NULL)
{
// 中断上下文中不能直接调用标准RTOS API
// 可以通过以下两种方法之一解决:
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
// FreeRTOS的中断安全API
if (xQueueSendFromISR(xDualCoreMessageQueue, &tempMsg, &xHigherPriorityTaskWoken) != pdPASS)
{
// 队列发送失败处理
}
// 如果有更高优先级任务被唤醒,请求上下文切换
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
}
最后发现要把 Cubemx中的Uses FreeRTOS function功能给勾上

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)