如下代码在中断中使用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功能给勾上

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