# AVR 中断过载导致循环队列丢字节

> 原文链接：https://robotics.hellobike.com/pitfalls/2015-02-16-robotics-se-99
> 频道：pitfalls | 更新日期：2015-02-16 | 标签：auto, stackexchange, microcontroller, avr, interrupts
> 核心摘要：AVR 在 USART/SPI/定时器中断负载下丢数据，应先定位丢字节原因，再缩短关中断时间或降低通信速率。

# AVR 中断过载导致循环队列丢字节

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[How to manage interrupts on an AVR?](https://robotics.stackexchange.com/questions/99/how-to-manage-interrupts-on-an-avr)（Robotics Stack Exchange #99）

**状态**：已解决

## 问题

AVR 上多个中断服务例程使用无边界检查的循环队列；过载或偶发负载升高时队列会丢失成块数据，即使平均处理器负载约 70% 也可能随机填满。

## 环境

Linux / ROS 机器人软件与控制通用开发环境

## 解决办法

1. 建立状态调试输出，至少用状态 LED 区分成功包和校验失败包，先确认丢字节的具体原因。
2. 对外部问题，用示波器夹到输入引脚，检查线噪声、接线瞬断或无线信号丢失。
3. 若因关中断过久导致端口新字节覆盖旧字节，确保最长关中断时间小于传输一个字符的时间。
4. 具体做法是减少关中断持续时间，或降低通信比特率以增加单字符传输时间，或两者同时做。

原问题作者：ronalchn；采纳答案作者：David Cary。原内容依 CC BY-SA 4.0 授权，本页摘要同样依 CC BY-SA 4.0 授权。
:::

## 原始参考来源 (Sources)

- [Robotics Stack Exchange #99：How to manage interrupts on an AVR?](https://robotics.stackexchange.com/questions/99/how-to-manage-interrupts-on-an-avr)