我先处理你描述的问题
正如我所解释的那样,您的目标是创建一个设备,该设备通过接收来自 USB 的命令,输出一些 GPIO,例如 LED、继电器等。对于这个简单的任务,您的方法似乎很好(如果 USB 层可以使用它充分)。
但是存在优先级问题,在这种情况下,如果您使 USB 端过载(使用来自电缆另一端的数据),并且处理中断的优先级高于由定时器触发的处理 GPIO, GPIO 端可能会错过滴答声(就像其他人解释的那样,中断不能排队)。
在您的情况下,这是关于可以考虑的内容。
一些一般性指导
对于“在中断处理程序中花费尽可能少的时间”,基本原理就是其他人所说的:操作系统可以实现队列等,但是硬件中断没有提供这样的概念。如果导致中断的事件发生,CPU 将进入您的处理程序。然后,直到您处理它的源(例如在 UART 的情况下读取接收保持寄存器),您将丢失该事件的任何进一步发生。在此之后,直到退出处理程序,您可能会收到事件是否发生,但不知道发生了多少次(如果事件在 CPU 仍在处理处理程序时再次发生,则关联的中断线再次激活,所以在您从处理程序,CPU 立即重新进入它,前提是没有更高的优先级在等待)。
上面我描述了可在 8 位处理器和 AVR 32 位上观察到的一般概念(我有这些经验)。
在设计这样的低级系统(无操作系统、一个“后台”任务和一些中断)时,了解每个优先级(如果您使用这些优先级)发生了什么是基本的。一般来说,您会将最实时的关键任务设置为最高优先级,最关心的是快速为这些任务提供服务,同时对较低优先级的级别更加放松。
另一方面,通常在设计阶段,可以计划系统应如何对丢失的中断做出反应,因为在有中断的地方,无论如何最终都会发生丢失的中断。通过通信线路的关键数据应该有足够的校验和,特别关键的计时器应该来自计数寄存器,而不是来自事件计数等。
中断的另一个令人讨厌的部分是它们的异步性质。如果您未能正确设计相关的锁,它们最终会破坏某些东西,让不得不调试它的可怜的灵魂做噩梦。“在中断处理程序中花费尽可能少的时间”语句还鼓励您保持中断代码合理短,这意味着也可以减少针对此问题考虑的代码。如果您还使用 RTOS 辅助的多任务处理,您应该知道这部分(但有一些区别:较高优先级的中断处理程序的代码不需要针对较低优先级的处理程序的保护)。
如果您可以针对必要的异步任务正确设计架构,那么在没有操作系统的情况下(从没有多任务处理方面)甚至可能被证明是一个更好的解决方案。它需要更多的思考来正确设计它,但是后来与锁定相关的问题要少得多。我完成了一些在单个后台“任务”上设计的中型安全关键项目,中断很少很少,与公司其他一些人相比,这些项目的经验和维护需求(尤其是跟踪错误)相当令人满意建立在多任务概念之上。