面试的一个问题
今天面试,面试官问我一个问题串口中断里来了一帧数据,没来得及处理,又来了一帧数据。
应该怎么处理?
我不知道怎么回答,胡乱说。
把前一帧覆盖掉,或者转存到其他变量里,先处理完后来的,再
处理前面一帧。
请高手指教该如何回答?谢谢!
数据都是放在队列里的,主循环不断从队列里取数据再处理,只要队列不爆,是没问题的,只是有些延迟而已 不可能先处理后来的,得按顺序来。
楼上所说的循环队列(或叫环形队列、FIFO)是可行的,DMA的循环模式也是可以的。 谢谢各位!我明白了
这TMD那个面试官问的面试题,都说了"没来得及及处理"了,还问怎么处理
把接收缓冲区变大,打开帧接收中断,在代码中去处理。
你又去面试了啊? 开个队列,用FIFO就好,慢慢的处理,不需要着急。 full_stack 发表于 2021-11-12 15:15
把接收缓冲区变大,打开帧接收中断,在代码中去处理。
你又去面试了啊? ...
是啊 不同MCU对接收数据溢出处理方式应该不一样。
对51来说,前面接收的数据还取走的话,后面来的数据会自动丢掉。
正确的处理方式是把后面的数据也丢弃,然后MCU引爆外置某装置来提醒overflow了。
通过蘑菇云提醒楼主,这里有bug需要master降低发送波特率。
降低波特率后,系统再也不会发生这种现象了,然后达到了0 bug的宇航级要求。
还有,如果前一个中断标志还没清掉,根本就不知道有新的数据过来。 经常遇到的情况,一般是缓存一下,挤出间隙处理 重新设计通信协议吧。
一方发数据,另一方处理不过来,肯定不是好的协议。 先来后到, 什么叫“串口终端来了一帧数据”?
如果是接收缓冲区非空中断,那么它每接收到一字节中断一次,它并不知道一帧数据有没有结束,需要其他辅助手段才能处理。
如果是空闲中断,那么它在接收至少一字节后,若持续一段时间没有接收新的字节时触发中断,可以认为是一帧数据结束。合理的设计是触发空闲中断后,立即唤醒等待线程进行处理。
假设空闲中断刚触发,又有数据进来。假设是115200的波特率,传输一个字节也大概需要100us。
也就是说,极端情况下,也至少有100us来处理上一帧的接收数据。
如果这也来不及,那只能说,这个程序写得嘿嘿了。。。
pattywu 发表于 2021-11-12 22:09
重新设计通信协议吧。
一方发数据,另一方处理不过来,肯定不是好的协议。 ...
无应答通信啊,qq的udp协议,管你收不收到。我发了! lyjian 发表于 2021-11-12 19:42
还有,如果前一个中断标志还没清掉,根本就不知道有新的数据过来。
可以中断嵌套的。 循环队列 elife 发表于 2021-11-13 20:20
可以中断嵌套的。
你想多了。
同一个中断只有一个硬件中断触发标志位,怎么嵌套? 做个简单的二级缓存就好了,数据接受完了,直接放到二级缓存里面,主循环里面什么时候有时间了,就什么时候去捞数据,不影响你接受第二帧数据,我这边亲测,高波特率测试半个小时无压力,不丢数据
页:
[1]
2