Время исполнения кода.

alucard
Offline
Зарегистрирован: 08.04.2013

Есть кусок кода. 

PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
delayMicroseconds(3);NOP;NOP;NOP;NOP;NOP;NOP;NOP;NOP;
PORTD = something;
NOP;NOP;NOP;NOP;

NOP - то же самое, что и asm("nop"); - задержка на 62.5ns. (на Ардуино 16MHz)

Собственно говоря, какое количество времени займет исполнение этого кода на Arduino Duemilanove либо Uno? Пробовал измерять время с помощью Micros(), но там низкая точность - мне нужно узнать время в микросекундах с точностью до десятых.

__Alexander
Offline
Зарегистрирован: 24.10.2012

16.75 uS

хотя в ардуине там еще таймера тикают.

alucard
Offline
Зарегистрирован: 08.04.2013

__Alexander пишет:

16.75 uS

Если не секрет, то как это считается? :)

__Alexander
Offline
Зарегистрирован: 24.10.2012

ну вы же как-то посчитали что "nop" это 62.5ns.

а вобще в отладчиках такое считается. например, в том же avrstudio.

alucard
Offline
Зарегистрирован: 08.04.2013

А запись в порт сколько занимает?

alucard
Offline
Зарегистрирован: 08.04.2013

alucard пишет:

А запись в порт сколько занимает?

Произвел рассчет в AtmelStudio 6.0: Atmega168, 16MHz - заняло 0,06мкс. Это хорошо, я думал, что писать в порт - долго. :)

tsostik
Offline
Зарегистрирован: 28.02.2013

Чистая запись значение в порт - два такта:

    DDRB = 0x0F;
000000FE  LDI R24,0x0F        Load immediate
000000FF  OUT 0x18,R24        Out to I/O location

Однако, как верно заметили выше, еще есть таймеры, которые внутри прерывания натикивают сколько-то тактов.

alucard пишет:

Пробовал измерять время с помощью Micros(), но там низкая точность - мне нужно узнать время в микросекундах с точностью до десятых.

Если время одного события слишком мало для того, чтобы его замерить - естественный способ - замерить суммарное время N событий и разделить его на N.