|
|
本帖最后由 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] ++;的自加是有一定的滞后的
|
|