打印
[国产单片机]

面试的一个问题

[复制链接]
2156|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
比神乐|  楼主 | 2021-11-12 11:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
今天面试,面试官问我一个问题
串口中断里来了一帧数据,没来得及处理,又来了一帧数据。
应该怎么处理?
我不知道怎么回答,胡乱说。
把前一帧覆盖掉,或者转存到其他变量里,先处理完后来的,再
处理前面一帧。
请高手指教该如何回答?谢谢!

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2021-11-12 11:36 | 只看该作者
数据都是放在队列里的,主循环不断从队列里取数据再处理,只要队列不爆,是没问题的,只是有些延迟而已

使用特权

评论回复
板凳
LcwSwust| | 2021-11-12 11:51 | 只看该作者
不可能先处理后来的,得按顺序来。
楼上所说的循环队列(或叫环形队列、FIFO)是可行的,DMA的循环模式也是可以的。

使用特权

评论回复
地板
比神乐|  楼主 | 2021-11-12 12:40 | 只看该作者
谢谢各位!我明白了

使用特权

评论回复
5
通宵敲代码| | 2021-11-12 14:51 | 只看该作者

这TMD那个面试官问的面试题,都说了"没来得及及处理"了,还问怎么处理

使用特权

评论回复
评论
通宵敲代码 2021-11-17 15:29 回复TA
@xyz549040622 :理论都懂,我是说这个面试官问的不严谨,不管是缓存还是说丢弃,对这次通信来说,这都是“来得及处理”,而“来不及处理”的意思是,处理器啥都干不了 
xyz549040622 2021-11-12 16:19 回复TA
就是因为没有来得及,所以才需要弥补。 
6
full_stack| | 2021-11-12 15:15 | 只看该作者
把接收缓冲区变大,打开帧接收中断,在代码中去处理。
你又去面试了啊?

使用特权

评论回复
7
xyz549040622| | 2021-11-12 16:20 | 只看该作者
开个队列,用FIFO就好,慢慢的处理,不需要着急。

使用特权

评论回复
8
比神乐|  楼主 | 2021-11-12 16:24 | 只看该作者
full_stack 发表于 2021-11-12 15:15
把接收缓冲区变大,打开帧接收中断,在代码中去处理。
你又去面试了啊? ...

是啊

使用特权

评论回复
9
lyjian| | 2021-11-12 18:56 | 只看该作者
不同MCU对接收数据溢出处理方式应该不一样。
对51来说,前面接收的数据还取走话,后面来的数据会自动丢掉。




使用特权

评论回复
10
William1994| | 2021-11-12 19:09 | 只看该作者
正确的处理方式是把后面的数据也丢弃,然后MCU引爆外置某装置来提醒overflow了。
通过蘑菇云提醒楼主,这里有bug需要master降低发送波特率。
降低波特率后,系统再也不会发生这种现象了,然后达到了0 bug的宇航级要求。

使用特权

评论回复
11
lyjian| | 2021-11-12 19:42 | 只看该作者
还有,如果前一个中断标志还没清掉,根本就不知道有新的数据过来。

使用特权

评论回复
12
kingTek| | 2021-11-12 21:44 | 只看该作者
经常遇到的情况,一般是缓存一下,挤出间隙处理

使用特权

评论回复
13
pattywu| | 2021-11-12 22:09 | 只看该作者
重新设计通信协议吧。
一方发数据,另一方处理不过来,肯定不是好的协议。

使用特权

评论回复
14
ghost110| | 2021-11-13 09:32 | 只看该作者
先来后到,

使用特权

评论回复
15
diweo| | 2021-11-13 10:33 | 只看该作者
什么叫“串口终端来了一帧数据”?
如果是接收缓冲区非空中断,那么它每接收到一字节中断一次,它并不知道一帧数据有没有结束,需要其他辅助手段才能处理。
如果是空闲中断,那么它在接收至少一字节后,若持续一段时间没有接收新的字节时触发中断,可以认为是一帧数据结束。合理的设计是触发空闲中断后,立即唤醒等待线程进行处理。
假设空闲中断刚触发,又有数据进来。假设是115200的波特率,传输一个字节也大概需要100us。
也就是说,极端情况下,也至少有100us来处理上一帧的接收数据。
如果这也来不及,那只能说,这个程序写得嘿嘿了。。。

使用特权

评论回复
16
njshenxian| | 2021-11-13 19:50 | 只看该作者
pattywu 发表于 2021-11-12 22:09
重新设计通信协议吧。
一方发数据,另一方处理不过来,肯定不是好的协议。 ...

无应答通信啊,qq的udp协议,管你收不收到。我发了!

使用特权

评论回复
17
elife| | 2021-11-13 20:20 | 只看该作者
lyjian 发表于 2021-11-12 19:42
还有,如果前一个中断标志还没清掉,根本就不知道有新的数据过来。

可以中断嵌套的。

使用特权

评论回复
18
干掉9527| | 2021-11-13 21:06 | 只看该作者
循环队列

使用特权

评论回复
19
lyjian| | 2021-11-13 21:33 | 只看该作者
elife 发表于 2021-11-13 20:20
可以中断嵌套的。

你想多了。
同一个中断只有一个硬件中断触发标志位,怎么嵌套?

使用特权

评论回复
20
sundea| | 2021-11-16 08:53 | 只看该作者
做个简单的二级缓存就好了,数据接受完了,直接放到二级缓存里面,主循环里面什么时候有时间了,就什么时候去捞数据,不影响你接受第二帧数据,我这边亲测,高波特率测试半个小时无压力,不丢数据

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

347

主题

3092

帖子

7

粉丝