Приведенный выше код с двумя циклами при условии, что оба счетчика изначально установлены на ноль, занимает 197119 циклов (вместо 196392), верно?
Я имею в виду код:
- Delay_0 decfsz COUNT1
- перейти к Delay_0
- COUNT2
- перейти к Delay_0
Причина в том, что внутренний цикл, связанный с count1, будет повторяться 255 раз, что означает {255 раз по 3 цикла команд} плюс окончательный decfsz занимает 2 дополнительных цикла. Таким образом, в самый ПЕРВЫЙ раз, когда проходит этот внутренний цикл, соответствующая задержка (d1F) будет равна d1F = 255*3 + 2 = 767 циклов. Все это происходит еще до того, как мы доберемся до decfsz для count2. Затем остальная часть активности происходит, когда мы достигаем decfsz count2; который начинается с decfsz count2, за которым следует goto Delay_0, где 'goto' вызовет другую задержку внутреннего цикла (равную d1F). Таким образом, эта тройная комбинация, состоящая из decfsz count2, goto Delay_0 и d1F, будет связана со значением индекса count2, равным 255. Затем мы продолжаем получать тройные комбинации... с индексом 254, затем с индексом 253... вплоть до count2 index of 1. Это означает, что мы получаем 255 тройных комбинаций. И, наконец, мы заканчиваем с окончательным decfsz count2 (с индексом 0). Окончательная «инструкция» decfsz count2 занимает 2 цикла вместо 1. Таким образом, вторая часть задержки тогда равна (d1F+3)*255 + 2. «3» (циклы инструкции) обусловлены инструкциями decfsz плюс goto во время нормального режима работы. зацикливание.
Поэтому, когда мы сложим первую и вторую части задержки вместе, мы получим:
- d2F = d1F + (d1F+3)x255 + 2 = 767 + (767+3)x255 + 2 = 197119
Теперь, если у нас есть несколько циклов, мы можем использовать уравнения:
- d(n)_F = d(n-1)_F + {d(n-1)_F + 3}x255 + 2 = 256xd(n-1)_F + 767
а также
- d(n)_C = d(n-1)_C + {d(n-1)_F + 3}x{count_n - 1} + 2
где «F» в d(n)_F или d(n-1)_F обозначает состояние, при котором все счетчики инициализируются НУЛЕВЫМ значением. И «C» в d(n)_C обозначает условие, при котором счетчик для n-го цикла инициализируется любым значением, которое мы изначально выбрали. А «n» связан с n-м циклом. А «n-1» связан с (n-1)-м циклом.
Итак, если у нас есть 2 цикла, то d(1)_F — это задержка из-за цикла №1 с «полным» количеством циклов (т. е. counter1 изначально равен НУЛЮ или 256); а d(2)_F — задержка из-за цикла № 1 И цикла № 2 для случая, когда и счетчик 1, и счетчик 2 изначально равны НУЛЮ или 256.
- d(1)_C — это задержка из-за цикла №1 для случая, когда count1 инициализируется любым значением, которое мы изначально выбрали.
- d(2)_C — это задержка из-за цикла №1 И цикла №2 для случая, когда count2 инициализируется любым значением, которое мы изначально выбрали.
Обратите внимание, что count_n — это НАЧАЛЬНОЕ значение счетчика для n-го цикла. Кроме того, если конкретный счетчик изначально инициализирован НУЛЕВЫМ значением, часто бывает удобно рассматривать это значение как «256». Это, конечно, для ВОСЕМЬ битного счетчика. Например, если count1 = 0, удобно рассматривать его как count1 = 256 (вместо 0).
- Мы также можем определить: d(0)_F = 0 и d(0)_C = 0.
Таким образом, для трехконтурной системы с count1 = 1, count2 = 4 и count3 = 2,
d(1)_F = 256xd(0)_F + 767 = 256x0 + 767 = 767
d(1)_C = 0 + {0 + 3}x{1 - 1} + 2 = 2
d(2)_F = 256xd(1)_F + 767 = 256x767 + 767 = 197119
d(2)_C = d(1)_C + {d(1)_F + 3}x{4 - 1} + 2 = 2 + {767+3}x3 + 2 = 2314
d(3)_F = 256xd(2)_F + 767 = 256x197119 + 767 = 50463231
d(3)_C = d(2)_C + {d(2)_F + 3}x{2 - 1} + 2 = 199438
Система из 3 петель выглядит так:
- Delay_0 счетчик decfsz1
- перейти к Delay_0
- decfsz count2
- перейти к Delay_0
- decfsz count3
- перейти к Delay_0
Кенни Леонг
person
user2473445
schedule
13.06.2013