OpenEdv-开源电子网

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

中断里调用子函数比较好还是置位标识符比较好

[复制链接]

23

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2014-9-30
在线时间
49 小时
发表于 2017-3-15 09:53:36 | 显示全部楼层 |阅读模式
4金钱
在中断程序比较长的情况下,是直接调用子函数比较好好,还是置位标识符,后面再查询操作比较好?中断里调用的子函数还是算在中断里吗?中断函数过长会发生中断冲突,置标识符再查询又会丢失数据,怎么处理比较好?

最佳答案

查看完整内容[请看2#楼]

这是硬伤,两次中断时间间隔如果定下来,那么事情肯定要在这段时间内完成,否则必定丢数据,不管用那种方法都一样。 在中断里调用函数肯定算中断,最好用inline把函数嵌入,节约点调用函数的时间。如果是在外面查询标识符,不但运算量多了,且事情会更复杂,必须考虑外面执行了一半时又中断会发生什么影响,保证两者不互相干扰。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-12
在线时间
13 小时
发表于 2017-3-15 09:53:37 | 显示全部楼层
这是硬伤,两次中断时间间隔如果定下来,那么事情肯定要在这段时间内完成,否则必定丢数据,不管用那种方法都一样。
在中断里调用函数肯定算中断,最好用inline把函数嵌入,节约点调用函数的时间。如果是在外面查询标识符,不但运算量多了,且事情会更复杂,必须考虑外面执行了一半时又中断会发生什么影响,保证两者不互相干扰。
回复

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-12
在线时间
13 小时
发表于 2017-3-15 12:56:12 | 显示全部楼层
本帖最后由 hh312 于 2017-3-15 13:02 编辑

对了,我有个特殊例子,楼主可以参考一下。比如串口通讯,每个数据要中断一下,但是我需要接收一个数据包然后才一次性分析处理,而处理过程仅仅发生在最后一个数据接收完成时,也就是说,中断很多次的时间内才需要处理一次,但是那一次的时间很长,不能拖过一次中断时间,我是这么处理的:定义一个时钟,中断发生频率为最快,抢占优先级比串口低,然后关了时钟,当发生最后一次接收中断时,触发时钟中断(因为频率设定为最快,所以几乎串口中断退出时就发生时钟中断),且因时钟中断优先级比串口低,这样,既能保证信号处理的及时性,又不妨碍串口继续接收数据。
当然不一定要时钟中断源,只要能通过代码立即触发的中断都是可以的,只是我也不知道还有什么办法可以使用代码立即触发中断,所以选择了时钟。同时,因为处理的过程是对一个数据包进行处理的,这个数据包和串口中断中接收数据用的数据包是分开的(开始分析数据时用memcpy函数把数据包复制出来),所以两个中断可以互不干扰。
回复

使用道具 举报

9

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-1-6
在线时间
32 小时
发表于 2017-3-15 14:43:00 | 显示全部楼层
标识符定义成全局变量也会丢失数据吗
回复

使用道具 举报

23

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2014-9-30
在线时间
49 小时
 楼主| 发表于 2017-3-15 15:27:24 来自手机 | 显示全部楼层
hh312 发表于 2017-3-15 12:56
对了,我有个特殊例子,楼主可以参考一下。比如串口通讯,每个数据要中断一下,但是我需要接收一个数据包然 ...

受教了,这就试试
回复

使用道具 举报

23

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2014-9-30
在线时间
49 小时
 楼主| 发表于 2017-3-15 15:30:58 来自手机 | 显示全部楼层
爱娟娟 发表于 2017-3-15 14:43
标识符定义成全局变量也会丢失数据吗

会的,主程序里要做的事情太多的话,等到检查标识符时,串口可能已经收了好几次数据了,那前几次的就只有覆盖掉了
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-15 18:03:04 | 显示全部楼层
越短越好,其实驱动程序几种设计模式,中断响应只是其中之一,很多驱动采用polling状态标识的方式,比如以太网,我的建议是中断里面只需要设置标识就退出吧,至于响应交给其他代码响应
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-3-15 18:03:05 | 显示全部楼层
越短越好,其实驱动程序几种设计模式,中断响应只是其中之一,很多驱动采用polling状态标识的方式,比如以太网,我的建议是中断里面只需要设置标识就退出吧,至于响应交给其他代码响应
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 17:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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