Цитата:
Сообщение от Admin
Если использовать например D_High(2); то будет быстрее, а D_High(19); будет самым медленно выполняемым, так как в цикле он последний
|
Эксперименты показывают что это не совсем верно. Нужна помощь в анализе результатов теста. Итак -в качестве исходного родной язык Ардуино. Потом на библиотеке digitalWriteFast.h с явным указанием пина и с переменной в качестве номера пина. К CyberLib написал 4 функции переключения с переменной в качестве пина и с переменными на пин и значение, причем в двух вариантах
PHP код:
//**************Прямое управление с переменной порта**********************
void D_High(uint16_t Pin)
{
(((Pin) == 0 ) ? PORTD|=B00000100 : \
(((Pin) == 1 ) ? PORTD|=B00001000 : \
(((Pin) == 2 ) ? PORTD|=B00000010 : \
(((Pin) == 3 ) ? PORTD|=B00000001 : \
(((Pin) == 4 ) ? PORTD|=B00010000 : \
(((Pin) == 5 ) ? PORTC|=B01000000 : \
(((Pin) == 6 ) ? PORTD|=B10000000 : \
(((Pin) == 7 ) ? PORTE|=B01000000 : \
(((Pin) == 8 ) ? PORTB|=B00010000 : \
(((Pin) == 9 ) ? PORTB|=B00100000 : \
(((Pin) == 10 ) ? PORTB|=B01000000 : \
(((Pin) == 11 ) ? PORTB|=B10000000 : \
(((Pin) == 12 ) ? PORTD|=B01000000 : \
(((Pin) == 13 ) ? PORTC|=B10000000 : \
(((Pin) == 14 ) ? PORTF|=B10000000 : \
(((Pin) == 15 ) ? PORTF|=B01000000 : \
(((Pin) == 16 ) ? PORTF|=B00100000 : \
(((Pin) == 17 ) ? PORTF|=B00010000 : \
(((Pin) == 18 ) ? PORTF|=B00000010 : PORTF |=B00000001)))))))))))))))))));
}
void D_Low(uint16_t Pin)
{
(((Pin) == 0 ) ? PORTD&=B11111011 : \
(((Pin) == 1 ) ? PORTD&=B11110111 : \
(((Pin) == 2 ) ? PORTD&=B11111101 : \
(((Pin) == 3 ) ? PORTD&=B11111110 : \
(((Pin) == 4 ) ? PORTD&=B11101111 : \
(((Pin) == 5 ) ? PORTC&=B10111111 : \
(((Pin) == 6 ) ? PORTD&=B01111111 : \
(((Pin) == 7 ) ? PORTE&=B10111111 : \
(((Pin) == 8 ) ? PORTB&=B11101111 : \
(((Pin) == 9 ) ? PORTB&=B11011111 : \
(((Pin) == 10 ) ? PORTB&=B10111111 : \
(((Pin) == 11 ) ? PORTB&=B01111111 : \
(((Pin) == 12 ) ? PORTD&=B10111111 : \
(((Pin) == 13 ) ? PORTC&=B01111111 : \
(((Pin) == 14 ) ? PORTF&=B01111111 : \
(((Pin) == 15 ) ? PORTF&=B10111111 : \
(((Pin) == 16 ) ? PORTF&=B11011111 : \
(((Pin) == 17 ) ? PORTF&=B11101111 : \
(((Pin) == 18 ) ? PORTF&=B11111101 : PORTF&=B11111110)))))))))))))))))));
}
void D_High2(uint16_t Pin)
{switch (Pin) {
case 0:PORTD |=B00000100; break;
case 1:PORTD |=B00001000; break;
case 2:PORTD |=B00000010; break;
case 3:PORTD |=B00000001; break;
case 4:PORTD |=B00010000; break;
case 5:PORTC |=B01000000; break;
case 6:PORTD |=B10000000; break;
case 7:PORTE |=B01000000; break;
case 8:PORTB |=B00010000; break;
case 9:PORTB |=B00100000; break;
case 10:PORTB |=B01000000; break;
case 11:PORTB |=B10000000; break;
case 12:PORTD |=B01000000; break;
case 13:PORTC |=B10000000; break;
case 14:PORTF |=B10000000; break;
case 15:PORTF |=B01000000; break;
case 16:PORTF |=B00100000; break;
case 17:PORTF |=B00010000; break;
case 18:PORTF |=B00000010; break;
case 19:PORTF |=B00000001; break;}
};
void D_Low2(uint16_t Pin)
{switch (Pin)
{
case 0:PORTD &=B11111011; break;
case 1:PORTD &=B11110111; break;
case 2:PORTD &=B11111101; break;
case 3:PORTD &=B11111110; break;
case 4:PORTD &=B11101111; break;
case 5:PORTC &=B10111111; break;
case 6:PORTD &=B01111111; break;
case 7:PORTE &=B10111111; break;
case 8:PORTB &=B11101111; break;
case 9:PORTB &=B11011111; break;
case 11:PORTB &=B01111111; break;
case 12:PORTD &=B10111111; break;
case 13:PORTC &=B01111111; break;
case 14:PORTF &=B01111111; break;
case 15:PORTF &=B10111111; break;
case 16:PORTF &=B11011111; break;
case 17:PORTF &=B11101111; break;
case 18:PORTF &=B11111101; break;
case 19:PORTF &=B11111110; break;}
};
void D_Pin2(uint16_t Pin, uint16_t Status)
{if(Status==0){D_Low2(Pin);} else {D_High2(Pin);};
};
void D_Pin(uint16_t Pin, uint16_t Status)
{if(Status==0){D_Low(Pin);} else {D_High(Pin);};
};
написал вот такой скетч для проверки скорости
PHP код:
#include <digitalIOPerformance.h>
#include "CyberLib.h"
uint16_t led=19;
unsigned long Time;
uint16_t Sig1=0;
uint16_t Sig2=1;
void setup()
{
Serial.begin(57600);
pinMode(led, OUTPUT); //Настраиваем пин на выход
}
void loop()
{
delay(10000);
Serial.print("*********Port Nomer - "); Serial.println(led,DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{digitalWrite(led, HIGH); digitalWrite(led, LOW);};
Serial.print("1 Standart arduino - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{digitalWriteFast(19, 1); digitalWriteFast(19, 0);};
Serial.print("2 digitalIOPerformance port constanta - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{digitalWriteFast(led, 1); digitalWriteFast(led, 0);};
Serial.print("3 digitalIOPerformance port peremennaya - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{D19_Inv; D19_Inv;};
Serial.print("4 CyberLib from Dx_Inv - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{D19_High; D19_Low;};
Serial.print("5 CyberLib from Dx_High and Low - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{D_High(led); D_Low(led);};
Serial.print("6 CyberLib port peremennaya variant 1 - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{D_High2(led); D_Low2(led);};
Serial.print("7 CyberLib port peremennaya variant 2 - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{D_Pin(led, Sig1); D_Pin(led, Sig2);};
Serial.print("8 CyberLib port i znachenie peremennaya variant 1 - ");
Serial.println((millis()-Time),DEC);
Time=millis();
for (long i=0; i <= 1000000; i++)
{D_Pin2(led, Sig1); D_Pin2(led, Sig2);};
Serial.print("8 CyberLib port i znachenie peremennaya variant 2 - ");
Serial.println((millis()-Time),DEC);
}
Попробовал на разных портах и получил такие результаты
PHP код:
*********Port Nomer - 0
1 Standart arduino - 10449
2 digitalIOPerformance port constanta - 1077
3 digitalIOPerformance port peremennaya - 10450
4 CyberLib from Dx_Inv - 1204
5 CyberLib from Dx_High and Low - 1077
6 CyberLib port peremennaya variant 1 - 3104
7 CyberLib port peremennaya variant 2 - 4876
8 CyberLib port i znachenie peremennaya variant 1 - 4941
8 CyberLib port i znachenie peremennaya variant 2 - 6713
*********Port Nomer - 9
1 Standart arduino - 13868
2 digitalIOPerformance port constanta - 1077
3 digitalIOPerformance port peremennaya - 13868
4 CyberLib from Dx_Inv - 1205
5 CyberLib from Dx_High and Low - 1077
6 CyberLib port peremennaya variant 1 - 7662
7 CyberLib port peremennaya variant 2 - 4877
8 CyberLib port i znachenie peremennaya variant 1 - 9499
8 CyberLib port i znachenie peremennaya variant 2 - 6714
*********Port Nomer - 19
1 Standart arduino - 10448
2 digitalIOPerformance port constanta - 1078
3 digitalIOPerformance port peremennaya - 10448
4 CyberLib from Dx_Inv - 1205
5 CyberLib from Dx_High and Low - 1077
6 CyberLib port peremennaya variant 1 - 12349
7 CyberLib port peremennaya variant 2 - 4877
8 CyberLib port i znachenie peremennaya variant 1 - 14185
8 CyberLib port i znachenie peremennaya variant 2 - 6712