硬汉嵌入式论坛

 找回密码
 立即注册
查看: 87|回复: 1
收起左侧

[技术讨论] V4 请教一个关于Isr发送消息的异常问题

[复制链接]

30

主题

180

回帖

270

积分

高级会员

积分
270
发表于 昨天 09:59 | 显示全部楼层 |阅读模式
本帖最后由 mioc_hust 于 2026-1-8 10:41 编辑

我用外部IO端口模拟快速的中断发送消息。其中消息队列的长度设定为8


//初始化消息盒子,这个是一个宏定义
os_mbx_declare (mailbox, 8);


然后在中断处理程序里面,发送消息之前,应该是判定整个消息队列是否满了。
按道理应该是 if( isr_mbx_check(&mailbox) != 0) 就可以继续往消息队列里面发送消息
异常现象:当设定为判定非0时,快速触发中断往发送消息,会导致RTX系统进入os_err()

然后把消息预留空间长度判定留长一些,例如 if( isr_mbx_check(&mailbox) >= 5)
测试快速触发5000次中断,没有出现RTX系统异常

虽然这样做应该没什么问题,但是还是想定位到具体什么环节导致了os_err() 有什么定位手段不




//开始处理中断服务程序
void EXTI15_10_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line13) != RESET)   // 检查中断是否发生
    {
       if( isr_mbx_check(&mailbox) >= 5)
        {
            // 用户的中断处理逻辑
            isr_mbx_send (&mailbox,  &com_rx_msg[MSG_IO_IRQ]);
            com_msg_cnt[MSG_IO_IRQ] ++;
        }

        //处理完成,清空标志位
        EXTI_ClearITPendingBit(EXTI_Line13); // 清除中断标志位
    }
}


//消息处理函数  测试,就打印了一句话

while(1)
    {
        xResult = os_mbx_wait(&mailbox, (void *)&pMsg, usMaxBlockTime);

        switch (xResult)
        {
            case OS_R_OK:           /* 无需等待接受到消息邮箱数据 */
            case OS_R_MBX:          /* 刚开始消息队列为空,然后在超时时间内接收到消息 */
            {
                //这里ISR函数中,发送的是一个消息的地址,我这里也是地址,然后获取了地址的值
                //printf("pMsg的值是 %d\r\n",*pMsg);
                switch(*pMsg)
                {
                    case MSG_COM2_RX:
                    case MSG_COM3_RX:
                    case MSG_COM4_RX:
                    case MSG_COM5_RX:
                    {
                        COM_RX_timeOUT(*pMsg);
                        break;
                    }

                    case  MSG_IO_IRQ:
                    {
                        printf("检测到外部中断的消息事件 %d\r\n", get_msg_com_rx_cnt(MSG_IO_IRQ));
                        break;
                    }

                    default:
                    {
                        break;
                    }
                }

                break;
            }




日志信息:

检测到外部中断的消息事件 5680                                                   
检测到外部中断的消息事件 5680                                                   
检测到外部中断的消息事件 5680                                                   
检测到外部中断的消息事件 5680                                                   
检测到外部中断的消息事件 5682                                                   
检测到外部中断的消息事件 5684                                                   
检测到外部中断的消息事件 5684                                                   
检测到外部中断的消息事件 5684                                                   
检测到外部中断的消息事件 5684                                                   
检测到外部中断的消息事件 5685                                                   
检测到外部中断的消息事件 5686


通过日志可以看出来,其实中断已经触发了好几次,变量com_msg_cnt[MSG_IO_IRQ] ++;的自加是有一定的滞后的
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120427
QQ
发表于 昨天 13:11 | 显示全部楼层
中断速度多少,有个ISR FIFO大小,可以加大下看看。

34.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-9 16:44 , Processed in 0.056990 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表