OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2072|回复: 3

关于同一个中断,本次中断还没执行完,下一个中断又发生了的问题

[复制链接]

8

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-6-10
在线时间
22 小时
发表于 2018-10-23 00:24:26 | 显示全部楼层 |阅读模式
/*************************************************************************
                                   这是一条关于STM的问题
*****************************************************************************/

这个问题,其实是一个老生常谈的问题,早在以前学51单片机的时候,老师就教我们,中断服务里面尽量不要放太多执行代码,意思就是中断里面不能执行太多操作。
最近在实际项目开发中,公司要求用Freescale做一个项目(PS:用惯了STM,真心觉得Freescale好原始。。。),我在写Bootloader 的BOOT程序里面的CAN接收中断,针对不同ID做了不少判断,显得一整个中断里面代码量很大,我同事就说我中断写太复杂,要改,尽量做标志位就好,然后执行函数放在Main函数里。。。
我也理解他的用意,但是自从我学了STM,我就有意的留意到原子大神也是在中断服务函数里面写执行函数,我也管不了以前老师说的那么多了,我也跟着在中断函数里面写执行函数,并且已经习惯了这么写!!!而且非常舒服,目前也还没发生什么异常的错误。
但是,怀揣着一颗做产品研发,稳定,可靠的心态......
就拿CAN通讯来说,CAN的通讯速度是可以设置到非常快的,甚至可以上1M Kbp,我就担心,会不会CAN的通讯速度快到,当我这条报文在中断里面还没处理完,下一条报文又过来了,照理说,这个时候CAN接收中断是不会响应的,那么不就眼睁睁看着报文丢失。。。
希望各位大神能给出点见解。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2018-10-23 10:37:52 | 显示全部楼层
    首先CAN的帧溢出是有可能发生的,但是没有你想的那么容易,因为CAN底层硬件基本都有不同深度的接收FIFO(如STM32F1就有2*3支持缓存完整的六条报文),除非CAN传输速度很快,且上层逻辑很复杂,一般来说都是足够,至少1Mbtyes我觉得问题不大,当然这都要配合实践调试才能清楚,如果产品长时间测试稳定可靠,就不要担心,因为这是很难量化的问题。另外如果中断里处理较短,实时性要求高,放在里面,如果处理协议解析,时间还较长的话,还是尝试用中断读取到数据到缓存,在由主循环处理好些,这个也要分情况的,并不是处理放在中断里面不好。
回复 支持 反对

使用道具 举报

8

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2018-6-10
在线时间
22 小时
 楼主| 发表于 2018-10-23 12:41:15 | 显示全部楼层
zc123 发表于 2018-10-23 10:37
首先CAN的帧溢出是有可能发生的,但是没有你想的那么容易,因为CAN底层硬件基本都有不同深度的接收FIFO ...

这么说,我心里也踏实多了,我也有想到FIFO邮箱的问题,但是我当时考虑到如果CAN报文的速度比中断处理速度快,只要时间足够长,FIFO也是会溢出。好在,PC端CAN的上位机也是我自己写的,通讯机制上,我每包数据里面有16帧CAN报文,等下位机16帧CAN报文全部处理+校验完毕后,再发送返回给上位机一帧完成指令,然后上位机再发送下一包数据,这样理论上是大大减小了FIFO邮箱溢出的可能性。。谢谢指导~~~
回复 支持 反对

使用道具 举报

0

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2018-5-9
在线时间
164 小时
发表于 2018-10-23 16:22:04 | 显示全部楼层
cortex-m都有pend机制,中断之间的关系不用程序来操心,注意功能实现就可以

就标题的情况来说,同一个中断连续被触发,在上一轮任务执行结束前,后面的中断请求都是被pending(挂起)的,直到执行结束才会找时间重新触发(这部分的操作是被NVIC完全托管的)。当然要是触发中断的时间间隔小于中断的执行时长,那这种设计就是毫无意义的,也无法实现功能了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 10:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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