Embedded 把计算放在哪里?内部中断处理程序还是主循环?(嵌入式实时应用程序)

Embedded 把计算放在哪里?内部中断处理程序还是主循环?(嵌入式实时应用程序),embedded,real-time,interrupt,adc,Embedded,Real Time,Interrupt,Adc,我正在开发一个用于电机控制的嵌入式应用程序,我对将ADC数值转换为有符号物理值(AMP)的一些计算有疑问 我应该在中断处理程序中进行计算,还是应该使用该处理程序设置一个全局标志,并在设置标志后在主循环中进行计算 提前感谢您。在中断处理程序中所做的工作越少越好。目前,这对您的应用程序来说可能不是什么大问题,但总有一天,您的系统负载会更高,您不想推迟其他优先级更高的任务来处理中断。您可能希望查看信号量和适当的多线程处理,而不仅仅是设置全局标志。这取决于您希望对ADC值执行什么操作,以及执行的速度。如

我正在开发一个用于电机控制的嵌入式应用程序,我对将ADC数值转换为有符号物理值(AMP)的一些计算有疑问

我应该在中断处理程序中进行计算,还是应该使用该处理程序设置一个全局标志,并在设置标志后在主循环中进行计算


提前感谢您。

在中断处理程序中所做的工作越少越好。目前,这对您的应用程序来说可能不是什么大问题,但总有一天,您的系统负载会更高,您不想推迟其他优先级更高的任务来处理中断。您可能希望查看信号量和适当的多线程处理,而不仅仅是设置全局标志。

这取决于您希望对ADC值执行什么操作,以及执行的速度。如果需要根据ADC值采取一些时间关键的措施,则应在中断中处理这些措施。然而,如果是这种情况,为了节省首先从ADC计数计算“真实”模拟值的费用,您应该仅根据ADC计数表示临界阈值

例如,如果您的ADC每伏输出8次计数,并且如果ADC报告的电压大于1.5伏,您需要触发紧急停止,则您可以编写中断代码,以在12次计数时触发紧急停止。然后,您仍然可以将ADC计数传递到主循环,以便转换为用户友好的单位,用于用户界面等目的


一般的原则是,为了保证您能够在截止日期前完成任务,您需要对应用程序和任何设置进行结构化,以使其尽可能容易地在截止日期前完成任务。如果某件事情没有一个严格的截止日期,请将其放在主循环中(一般来说也是如此)。

对于这个问题,没有一刀切的答案。这取决于您的时间要求、现有中断负载等

如果它是一个相当简单的乘法或其他什么,那么我会在中断中执行它,然后继续


只需确保您知道自己在做什么,不要在中断中花费过多的时间。

需要考虑的一件事是数据的一致性。如果您从ADC获得多个相关值(位置、电压、电流等),则可能需要采取措施确保使用一致的设置。这可能意味着后台更新优于ISR中的更新。即使对于给定的算法过程,单个读数的一致性也可能很重要。考虑这个背景代码。

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now

绝对地不过,在实现基本线程和信号量方面没有太多开销,而且可以大大简化编程过程。@Carl,也许你可以详细说明使用信号量和线程的想法,以及如何使编程更容易,因为我的应用程序已经相当复杂了,在这个阶段使rtos适应它似乎很可怕。如果你的应用程序很复杂,那么它是一个小型实时执行器的完美用途。例如,您可能有一个处理ADC数据的线程,该线程通常在信号量上被阻塞。然后,当你的中断触发时,你可以让中断处理器发出信号来唤醒ADC任务并让它完成它的工作。我同意Carl的观点,如果你的应用程序“相当复杂”,那可能意味着你从一开始就应该使用轻量操作系统。您可能想看看uCOS II(),它是免费/开源的,非常小且简单,但它提供了信号量、计时器和任务抢占等基本功能。uCOS II不是免费或开源的。从其网站“Micrium嵌入式组件以单个模块或捆绑解决方案的形式定价。请联系Micriµm以获取您特定需求的完整定价信息”