RT1176 CAN为什么要在中断处理函数中关闭邮箱中断呢

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

RT1176 CAN为什么要在中断处理函数中关闭邮箱中断呢

920件の閲覧回数
YueXia
Contributor I

我感觉很奇怪,为什么要关闭邮箱中断呢,在初始化中使能一次邮箱中断,不就可以一直等待控制器触发中断吗,我理解代码这样写是为了在当前邮箱没有处理完数据的时候先关闭中断,让下一包数据由另一个空闲邮箱接收,但在控制器自己的处理机制中,如果当前邮箱CODE为FULL状态,会有内部锁,锁住当前邮箱,再来数据会由另一个空闲态邮箱处理,当两个邮箱都是FULL状态时,会尝试去覆盖最后一个 使用的邮箱,但是邮箱处于锁定状态,数据会存储在SMB(隐式缓冲区,无法查看)中,此时查看CODE状态是溢出态

在我调试CAN驱动的时候发现,如果瞬时来了多包数据,这个关闭邮箱中断并清除中断标志位的操作有可能会出现异常,导致接收直接瘫痪,并且接收中断永远无法被触发了,我测试的现象是,多包数据到达时,邮箱1会处理不完,邮箱2去开始接收,等邮箱1处理完后,继续由邮箱1来接收数据,但某一次,邮箱1开始不接收任何数据,数据全部由邮箱2来接收,当邮箱2大量接收一阵数据后,邮箱2也不再接收数据,此时去查看寄存器对应的位,邮箱2的MASK位为0,但FLAG位为1,证明程序运行到了FLEXCAN_TransferFDAbortReceive函数来关闭了邮箱使能,但是不知道什么原因没有运行到FLEXCAN_ClearMbStatusFlags函数,后续排查很久没有找到问题出现的原因,希望能得到解答

我尝试注释掉中断处理中的disable MASK,并且在中断回调中也不再次enable MASK,我只在初始化中enable邮箱一次,后续测试发现,功能正常但我配置的两个接收邮箱,只有一个在一直接收,但是也没有丢包的情况出现

0 件の賞賛
返信
3 返答(返信)

882件の閲覧回数
Gavin_Jia
NXP TechSupport
NXP TechSupport

Thanks for providing the detailed description.

I have no thoughts on why this phenomenon occurs for now and have submitted it for internal discussion. I'll synchronize it here as soon as there are new developments.

Best regards,
Gavin

0 件の賞賛
返信

847件の閲覧回数
Gavin_Jia
NXP TechSupport
NXP TechSupport

Here I get the reply from experts. The reason of take interrupt enable or disable is to enable frame send or processing only on calling API( FLEXCAN_TransferSendNonBlocking() or  FLEXCAN_TransferReceiveNonBlocking()), when API is not calling, frames will only store in MB. But anyway, there has a limitation for application, if there don't call APIs times, will get frame lost in some case. So need users to note this.

Surely, you also can enable interrupt always, that means it will trigger interrupt when receive frames, this can response timely, but maybe get interrupt frequently as there is so many MBs supported.

Also users can enable MB FIFO.

 

0 件の賞賛
返信

738件の閲覧回数
YueXia
Contributor I

  @Gavin_Jia 感谢您的回复,我发现当我设置了多个邮箱的时候,正常程序运行时当数据量比较大时,会有邮箱0和邮箱1一起接收数据的情况,并且在数据量变小后,邮箱还会切换回邮箱0独自接收数据

  在我与其他板卡进行CAN通讯时,对方发送了两包几乎没有间隔的数据,有概率会发生丢包,我只能接收到其中一包数据,并且当我观察各邮箱的接收情况时,我发现邮箱0停止工作了,就像是处于溢出态,我尝试关闭了邮箱0的使能位再重新使能邮箱0,它依然是停止工作的状态,而邮箱1在不停的接收数据,偶尔会有邮箱2和邮箱1一起接收数据的情况,当再出现几乎没有间隔的两包数据到达时,又会有丢包的情况发生,并且邮箱1有可能停止工作,变成邮箱2作为主要接收数据

  请告诉我,是不能接收两包瞬时消息还是有什么其他的问题导致邮箱停止工作,并且当出现邮箱停止工作的情况后,我该如何恢复呢,希望能得到解答

0 件の賞賛
返信