2
AVR中断服务例程的执行速度未达到预期的速度(指令开销?)
我正在开发一个具有7个输入的小型逻辑分析仪。我的目标设备是ATmega168时钟频率为20MHz的设备。为了检测逻辑更改,我使用了引脚更改中断。现在,我试图找出可以检测到这些引脚变化的最低采样率。我确定的最小值为5.6 µs(178.5 kHz)。低于此速率的每个信号我都无法正确捕获。 我的代码是用C(avr-gcc)编写的。我的例程如下所示: ISR() { pinc = PINC; // char timestamp_ll = TCNT1L; // char timestamp_lh = TCNT1H; // char timestamp_h = timerh; // 2 byte integer stack_counter++; } 我捕获的信号变化位于pinc。为了对其进行本地化,我有一个4字节长的时间戳值。 在数据表中,我读到了中断服务程序需要5个时钟周期才能进入,而5个时钟周期则可以返回主程序。我假设我的每个命令ISR()要花1个时钟来执行;因此总而言之,应该有5 + 5 + 5 = 15时钟的开销。一个时钟的持续时间应根据20MHz的时钟速率而定1/20000000 = 0.00000005 = 50 ns。那么,以秒为单位的总开销应为:15 * 50 ns = 750 ns = …