OpenEdv-开源电子网

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

STM32各种中断占用时间太长问题怎么解决?

[复制链接]

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
发表于 2021-3-2 16:48:59 | 显示全部楼层 |阅读模式
10金钱
虽然说中断要快进快出,可是对于一些串口接收中断,比如一个数据包30个字节,9600bps,串口中断接收这30个字节需要一定时间。
比如程序正在执行“串口发送函数”,同时收到发过来的串口数据,进入中断接收数据。那此时正在进行的“串口发送函数”不就被打断了吗?
也就是说本次串口发送函数,发送途中被中断了,是不是发送失败了呢?
或者说使用CAN发送,被串口接收中断了,发送失败?
或者串口中断接收时间太长,影响其他中断的执行?
上系统能不能解决这类问题??

最佳答案

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

那你完全可以用DMA方式来处理这些数据收发
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2019-7-8
在线时间
145 小时
发表于 2021-3-2 16:49:00 | 显示全部楼层
那你完全可以用DMA方式来处理这些数据收发
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2021-1-8
在线时间
24 小时
发表于 2021-3-2 17:07:46 | 显示全部楼层
上DMA?
回复

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-3-2 19:28:53 | 显示全部楼层
DHMrwang 发表于 2021-3-2 18:50
那你完全可以用DMA方式来处理这些数据收发

那CAN发送呢?
回复

使用道具 举报

3

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2019-7-8
在线时间
145 小时
发表于 2021-3-2 19:36:55 | 显示全部楼层
这样的话CAN发送就按照正常操作就行了,可以把CAN接收中断优先级设置高一点
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2021-3-2 19:48:53 | 显示全部楼层
很明显你的串口中断设计很不合理
回复

使用道具 举报

0

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2020-10-31
在线时间
137 小时
发表于 2021-3-3 11:21:01 | 显示全部楼层
1. 关于串口接收,可以每接收一个字节放到buf后就马上退出中断,一次中断只接收一个字节。
2. 发送可以采用空闲中断发送的,这样就不干涉咯。
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2021-3-3 15:03:30 | 显示全部楼层
串口接收是按照字节来的,是一个中断来一个字节,不是串口中断里面把30个字节全接收完……
快进快出一般是指中断里面只写buffer,主线程里面判断buffer是否到30字节。,主要目的就是为了在一个字节接收完之前CPU可以退出中断处理其他事情(比如can通信),这样子串口接收中断就不会干扰串口发送或者can通信的过程了
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2021-3-3 15:18:26 | 显示全部楼层
一脸懵逼的来  一脸懵逼的走
学无止境
回复

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-3-3 16:01:12 | 显示全部楼层
lcfmax 发表于 2021-3-3 11:21
1. 关于串口接收,可以每接收一个字节放到buf后就马上退出中断,一次中断只接收一个字节。
2. 发送可以采 ...

就怕CAN发送一半被中断打断
回复

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-3-3 16:02:38 | 显示全部楼层
cromarti 发表于 2021-3-3 15:03
串口接收是按照字节来的,是一个中断来一个字节,不是串口中断里面把30个字节全接收完……
快进快出一般是 ...

这我知道,但是接收数据时串口中断或CAN中断,会打断正在进行的串口或CAN发送
回复

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-3-3 16:02:59 | 显示全部楼层
jermy_z 发表于 2021-3-3 15:18
一脸懵逼的来  一脸懵逼的走

学着点
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2021-3-3 20:39:19 | 显示全部楼层

呵呵      
学无止境
回复

使用道具 举报

3

主题

62

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2019-7-8
在线时间
145 小时
发表于 2021-3-3 20:55:13 | 显示全部楼层
跟紧我 发表于 2021-3-3 16:01
就怕CAN发送一半被中断打断

那你这属实多虑了,既然优先级最高都能被打断,那么设置优先级还有什么意义
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2021-3-16 18:42:25 | 显示全部楼层
跟紧我 发表于 2021-3-3 16:02
这我知道,但是接收数据时串口中断或CAN中断,会打断正在进行的串口或CAN发送

怎么会呢,接收中断只会影响函数运行,又不会影响外设发送数据,只要别在接收中断里面费太久时间导致发送函数来不及写寄存器就行,所以才要求快进快出。
回复

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-3-23 10:08:12 | 显示全部楼层
cromarti 发表于 2021-3-16 18:42
怎么会呢,接收中断只会影响函数运行,又不会影响外设发送数据,只要别在接收中断里面费太久时间导致发送 ...

比如接收一个40字节的数据包,肯定会占用一些时间的
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2021-3-24 09:34:22 | 显示全部楼层
有些单片机有8个串口啊

串口接收内部是一个移位寄存器  接收完一个字节后才会触发中断
只要在下次接收中断完成触发前 去处理掉接收中断数据就不会被覆盖掉
接收中断一般处理就是 将接收数据存到数组或队列 接收数据量自加 结束处理
在main中处理 就是排队数据量是否达到 预想的个数  达到进行解析

让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2021-3-25 15:40:04 | 显示全部楼层
跟紧我 发表于 2021-3-23 10:08
比如接收一个40字节的数据包,肯定会占用一些时间的

外设正在发送和接收的数据在外设自己的缓冲区内,处理接收中断和发送中断也只会占用CPU时间,不会影响正在发送/接收的数据,因为外设和CPU在MCU内部是两个异步的处理器。
接收中断影响发送只可能是因为接收中断中处理了过多的内容,导致CPU来不及填充外设缓冲区才会有影响(比如串口9600,每字节发送时间差不多1ms,也就是CPU只需要每1ms之内都访问一次发送缓冲区就没问题,实际发送操作是外设在做,不需要CPU参与,接收也是一样的道理。)
回复

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
 楼主| 发表于 2021-4-16 10:31:25 | 显示全部楼层
DongInker 发表于 2021-3-24 09:34
有些单片机有8个串口啊

串口接收内部是一个移位寄存器  接收完一个字节后才会触发中断

1.基于成本等的考虑,板子不会给你开8个串口
2.开8个串口没必要,同样甚至更耗时且可被打断
3.串口接收缓存我也有做,是挺好,但是没有解决类似CAN发送/接收数据与串口接收冲突问题。也就是同时到来,必然有一个需要等待,等待过程中可能会错过接收个别字节数据
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 03:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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