Сообщение от ut1wpr
|
И чего только не придумают эти русские, чтобы дороги не ремонтировать! (с) Не мой .
|
Ага,
только они сами пишут, а не по форумам спрашивают готовенькое
))
Сообщение от Boba_spb
|
Хорошо отладили?
|
Каюсь, Исправил ваши замечания.
Просто я не проверял ФСЕ варианты расчётов - например с числами равными 0, (это защита от дурака),
я проверял только с нормальными числами для расчётов, наверное посему и пропустил ошибки.
Сообщение от tempora
|
Что-то не могу понять, для чего объявлены четыре совершенно одинаковых
|
Сообщение от ut1wpr
|
А что мешает создать общий тип и четыре разных переменных этого типа?
|
ну сырой и отладочный вариант был, причешу позже)))
Код:
|
typedef union union_64bit{
unchar b[8];
unint d[4];
unlong w[2];
};
union union_64bit a64;
union union_64bit b64;
union union_64bit s64;
union union_64bit v64;
union union_64bit t64; |
так лучше ? а ручками самому? ))))) или все только покритиковать )))
Сообщение от ut1wpr
|
У меня есть подозрение, что время вычислений можно сократить в разы. Да и размер кода тоже.
|
Не люблю голословных утверждений,
сделайте и покажите что быстрее и меньше...
Размер может быть вы и сократите, за счёт удаления двойных функций и вызовы их через указатели, а вот время при этом увеличится,
Двойные функции специально были написаны для уменьшения времени исполнения.
Ведь для передачи указателя в функцию и назад так же требуется и FLASH и время, как и для переменных.
Конечно с указателем меньше, чем с самими переменные,
но больше чем если их не передавать в функции а использовать глобальные.
Вот 6 разных вызовов одной функции,
видно, что при работе через глобальные переменные скорость максимальна.
Учитывалось не только время работы самой функции, но и время на её вызов.
Код:
|
union union_64bit v64;
#define v64_int0 v64.d[1]
#define v64_int1 v64.d[0]
#define v64_int2 v64.d[3]
#define v64_int3 v64.d[2]
#define v64_long0 v64.w[0]
#define v64_long1 v64.w[1]
union union_64bit *p0_64;//указатель на союз
#define p0_64_long0 p0_64-›w[0]
#define p0_64_long1 p0_64-›w[1]
#define p0_64_int0 p0_64-›d[1]
#define p0_64_int1 p0_64-›d[0]
#define p0_64_int2 p0_64-›d[3]
#define p0_64_int3 p0_64-›d[2]
unchar
num_bit,
temp,
*point_num_bit;//указатель на char
void bit0_clear64(void){//
if(num_bit‹16){v64_int0=(v64_int0 & (1‹‹(num_bit-00) ^ 0xffffffff));return;}
if(num_bit‹32){v64_int1=(v64_int1 & (1‹‹(num_bit-16) ^ 0xffffffff));return;}
if(num_bit‹48){v64_int2=(v64_int2 & (1‹‹(num_bit-32) ^ 0xffffffff));return;}
if(num_bit‹64){v64_int3=(v64_int3 & (1‹‹(num_bit-48) ^ 0xffffffff));return;}}
void bit1_clear64(unchar num_bit){//
if(num_bit‹16){v64_int0=(v64_int0 & (1‹‹(num_bit-00) ^ 0xffffffff));return;}
if(num_bit‹32){v64_int1=(v64_int1 & (1‹‹(num_bit-16) ^ 0xffffffff));return;}
if(num_bit‹48){v64_int2=(v64_int2 & (1‹‹(num_bit-32) ^ 0xffffffff));return;}
if(num_bit‹64){v64_int3=(v64_int3 & (1‹‹(num_bit-48) ^ 0xffffffff));return;}}
void bit2_clear64(unchar *point_num_bit){//
unchar num_bit;
num_bit=*point_num_bit;
if(num_bit‹16){v64_int0=(v64_int0 & (1‹‹(num_bit-00) ^ 0xffffffff));return;}
if(num_bit‹32){v64_int1=(v64_int1 & (1‹‹(num_bit-16) ^ 0xffffffff));return;}
if(num_bit‹48){v64_int2=(v64_int2 & (1‹‹(num_bit-32) ^ 0xffffffff));return;}
if(num_bit‹64){v64_int3=(v64_int3 & (1‹‹(num_bit-48) ^ 0xffffffff));return;}}
void bit3_clear64(union union_64bit *p0_64){//
if(num_bit‹16){p0_64_int0=(p0_64_int0 & (1‹‹(num_bit-00) ^ 0xffffffff));return;}
if(num_bit‹32){p0_64_int1=(p0_64_int1 & (1‹‹(num_bit-16) ^ 0xffffffff));return;}
if(num_bit‹48){p0_64_int2=(p0_64_int2 & (1‹‹(num_bit-32) ^ 0xffffffff));return;}
if(num_bit‹64){p0_64_int3=(p0_64_int3 & (1‹‹(num_bit-48) ^ 0xffffffff));return;}}
void bit4_clear64(union union_64bit *p0_64,unchar numbit){//
if(num_bit‹16){p0_64_int0=(p0_64_int0 & (1‹‹(num_bit-00) ^ 0xffffffff));return;}
if(num_bit‹32){p0_64_int1=(p0_64_int1 & (1‹‹(num_bit-16) ^ 0xffffffff));return;}
if(num_bit‹48){p0_64_int2=(p0_64_int2 & (1‹‹(num_bit-32) ^ 0xffffffff));return;}
if(num_bit‹64){p0_64_int3=(p0_64_int3 & (1‹‹(num_bit-48) ^ 0xffffffff));return;}}
void bit5_clear64(union union_64bit *p0_64,unchar *point_num_bit){//
unchar num_bit;
num_bit=*point_num_bit;
if(num_bit‹16){p0_64_int0=(p0_64_int0 & (1‹‹(num_bit-00) ^ 0xffffffff));return;}
if(num_bit‹32){p0_64_int1=(p0_64_int1 & (1‹‹(num_bit-16) ^ 0xffffffff));return;}
if(num_bit‹48){p0_64_int2=(p0_64_int2 & (1‹‹(num_bit-32) ^ 0xffffffff));return;}
if(num_bit‹64){p0_64_int3=(p0_64_int3 & (1‹‹(num_bit-48) ^ 0xffffffff));return;}}
num_bit=temp;
v64_long0=0xffffffff;
v64_long1=0xffffffff;
1 bit0_clear64();
v64_long0=0xffffffff;
v64_long1=0xffffffff;
num_bit=temp;
2 bit1_clear64(num_bit);
v64_long0=0xffffffff;
v64_long1=0xffffffff;
num_bit=temp;
point_num_bit=&num_bit;//присвоение адресса указателю point_num_bit на переменную num_bit
3 bit2_clear64(point_num_bit);
v64_long0=0xffffffff;
v64_long1=0xffffffff;
p0_64 = &v64; //присвоение адресса указателю p0_64 на союз v64
4 bit3_clear64(p0_64);
v64_long0=0xffffffff;
v64_long1=0xffffffff;
p0_64 = &v64; //присвоение адресса указателю p0_64 на союз v64
num_bit=temp;
5 bit4_clear64(p0_64,num_bit);
v64_long0=0xffffffff;
v64_long1=0xffffffff;
p0_64 = &v64; //присвоение адресса указателю p0_64 на союз v64
num_bit=temp;
point_num_bit=&num_bit;//присвоение адресса указателю point_num_bit на переменную num_bit
6 bit5_clear64(p0_64,point_num_bit);
temp++; |
результаты компиляции и работы:
1=FLASH . 2=ВРЕМЯ вызова и исполнения с одинаковыми числами (HITECH STD9.60 PL3 PIC16 20МГЦ).
1= 217byte 7 mksek только глобальные
2= 220byte 7.6 mksek один параметр CHAR в функцию
3= 226byte 8.8 mksec один указатель CHAR в функцию
4= 284byte 10.8 mksec один указатель 64bit в функцию
5= 288byte 11.6 mksec один указатель 64bit + параметр CHAR в функцию
6= 290byte 12 mksek один указатель 64bit + указатель CHAR в функцию
Или покажите как быстрее сделать с указателями чем с глобальными переменными?,
только плиз с примерами, и указанием времени исполнения.
Если кто то хочет, может сам написать лучше, исходник с которого я
собственно переписывал - в атаче.