OpenEdv-开源电子网

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

串口中断数据丢失

[复制链接]

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-9-22
在线时间
0 小时
发表于 2013-9-22 15:28:09 | 显示全部楼层 |阅读模式
各位好,我是新手,碰到了一个问题,简述如下:

我有一块别人做的板子,ARM用的是富士通mb9bf50的片子(基于cm3内核), 现在想与PC进行通信,目前测试了PC通过串口发送数据到板子的过程,发现串口接收时发生了数据丢失
然后分析定位,发现可能原因是定时器中断引起的,因为我在系统初始化时,开了一个定时器,用于获取I2C总线数据,我发现如果我在定时器里面什么事情都不干的话,串口中断在接受PC发送的数据时,没有丢失。如果在定时器里面读取I2C,则串口中断会丢失数据。
我想丢失的原因可能有2个:
1 定时器中断打断了串口中断,导致串口中断数据丢失
2 定时器中断操作比较耗时且无法被其它中断打断,当串口有数据到来时,无法进入串口中断,所以数据丢失


针对这2个原因,我又发现:
1 根据中断向量表的序号,我发现串口中断比我开的这个定时器中断优先级高,理论上串口中断不会被定时器中断打断
2 定时器中断里面我只是通过I2C读取数据,I2C的读写速率是200K,理论上不会是比较耗时的操作

所以,上面我的2个疑点都貌似不太可能发生,唉,只能求助各位大神了,小弟在此谢过!











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

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-9-22 15:54:18 | 显示全部楼层
这种情况 唯一的可能就是 你 中断里面 处理的时间过长, 导致后面中断阻塞 进不来才丢失。 

一定要减小中断的时间开销!! 所有浪费时间的东西都提到主进程处理。
回复 支持 反对

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2013-9-22 16:22:17 | 显示全部楼层
回复【2楼】aleda303:
---------------------------------
我把定时器中断里面的代码精简成只有这样一句了:
stateGyro = HALGYRO_IIC_Read(L3GD20_Add, STATUS_REG);
这个时间应该够短吧?

串口中断的代码其实也很短,是这样的:
RcvedChar = FM3_MFS0_UART->RDR;

gUartRxBuf[gUartRXBufEnd++] = RcvedChar;//不分析数据,直接放到全局buffer
if(gUartRXBufEnd >= UARTRXBUFSIZE){
      gUartRXBufEnd = 0;
}
这个时间也够短吧?

所以应该不是你说的这样。我现在好像找到了解决办法:把串口中断的优先级设定为高于定时器优先级。改了以后就没有数据丢失了。我一直以为,中断向量表里面的顺序决定了缺省的优先级顺序,其实不然,这个是需要人为设定的,不知道我理解的对不对?
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-9-22 17:00:30 | 显示全部楼层
你算了下 IIC读取字节的时间了吗。 
IIC很慢的 ,不信你把它注释掉。定时器什么都不执行试下。
回复 支持 反对

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2013-9-22 17:12:45 | 显示全部楼层
回复【4楼】aleda303:
---------------------------------
谢谢回答。针对我的情况,你一般怎么处理,才能保证串口数据不丢失?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-22 20:50:26 | 显示全部楼层
回复【5楼】lovewubo:
---------------------------------
做协议。
发一批数据,等待正确应答,再发下一批数据....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-9-23 10:34:54 | 显示全部楼层
回复【5楼】lovewubo:
---------------------------------
定时器里面 做一个标志,标志置位, 
主程序判断这个标志的时候, 再读取IIC,同时清除标志。

这样 定时器 操作时间就很短, 不影响任何其他响应
回复 支持 反对

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2013-9-23 11:37:53 | 显示全部楼层
多谢@正点原子 @aleda303
问题暂时已经解决,我更改了定时器中断和串口中断的优先级。这样串口数据没有丢失了,但不晓得定时器优先级降低以后,是否能完整的采集传感器的数据,有待验证。
回复 支持 反对

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2013-9-23 11:39:38 | 显示全部楼层
回复【7楼】aleda303:

回复【5楼】lovewubo:
---------------------------------
定时器里面 做一个标志,标志置位, 
主程序判断这个标志的时候, 再读取IIC,同时清除标志。
这样 定时器 操作时间就很短, 不影响任何其他响应

---------------------------------
恩,不错的办法!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 09:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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