Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Ответ
Опции темы
Непрочитано 22.11.2012, 19:59   #521
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от tempora Посмотреть сообщение
А вот это как раз и невозможно - так как у каждой из этих четырёх переменных свой тип, пришлось писать разные функции, выполняющие одно и то же...

______________________________
"А старушки всё падали и падали..."
А что мешает создать общий тип и четыре разных переменных этого типа?
Реклама:
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума   Ответить с цитированием
Непрочитано 22.11.2012, 20:14   #522
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: FAQ по STM8

Я этот вопрос уже задал автору... жду ответа.
__________________
There's always more than one way to skin a cat.
tempora вне форума   Ответить с цитированием
Непрочитано 22.11.2012, 21:02   #523
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от ut1wpr Посмотреть сообщение
... сложности ... при портировании с другой платформы.
Нет, тут дело в чём-то другом - на исходной платформе проверка на нуль тоже выполнялась побитным XOR'ом:
Код:
//-----------------------------------------------------------
unchar check_zero_64(unlong_long a){//проверка на 0 64 битного числа
unchar temp;
	if(((a.w[0]) ^ (a.w[1]))==0){
temp=TRUE;}
	else{
temp=FALSE;}
	return temp;
}
__________________
There's always more than one way to skin a cat.
tempora вне форума   Ответить с цитированием
Непрочитано 22.11.2012, 22:50   #524
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от tempora Посмотреть сообщение
Нет, тут дело в чём-то другом -
Тут таких дел ...

А вот этот кусочек как работает ?
unlong_long div_64 (unlong_long a,unlong_long b){//разность a=a+b
unlong_long temp;unchar num_bit,ctr;
if(check_zero_64(b)==TRUE){ //проверка на 0 64 битного числа
if(check_zero_64(b)==FALSE){ //проверка на 0 64 битного числа
//need maximum result
temp.w[0]=temp.w[1]=0xFFFFFFFF; //macro_set_64(temp);}
macro_clear_64(scratch64);
return temp;
}
// else{
macro_clear_64(temp);
macro_clear_64(scratch64); //macro_load_64(temp,0,1);//}
temp.b[0]=1;
return temp;
//return 1
}
Boba_spb вне форума   Ответить с цитированием
Непрочитано 23.11.2012, 12:11   #525
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от 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 в функцию

Или покажите как быстрее сделать с указателями чем с глобальными переменными?,
только плиз с примерами, и указанием времени исполнения.

Если кто то хочет, может сам написать лучше, исходник с которого я
собственно переписывал - в атаче.
Вложения:
Тип файла: rar 64bit_math_lib.rar (2.2 Кб, 46 просмотров)
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов

Последний раз редактировалось picavr; 23.11.2012 в 12:20.
picavr вне форума   Ответить с цитированием
Непрочитано 23.11.2012, 12:28   #526
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от picavr Посмотреть сообщение
Ага,
только они сами пишут, а не по форумам спрашивают готовенькое )
Не будем лукавить. Ведь в конце приведена ссылка, откуда это взято... Там тоже "сами писАли"?
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума   Ответить с цитированием
Непрочитано 23.11.2012, 15:02   #527
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: FAQ по STM8

То что скорость увеличить можно - это точно;

Алгоритмы то совсем от любителя, похоже.

Например очистка бита
const unsigned char tb_bitclr[]={~1,~2,~4,~8,~16,~32,~64,~128};
void clrbit(unsigned char*t,char n)
{
t[n››3]&=tb_bitclr[n&7];
return;
}

Вообще то - такие вещи пишутся на ASMе, осбливо для 8 битных процессоров. А для кроссплатформенности есть директивы условной трансляции.
Boba_spb вне форума   Ответить с цитированием
Непрочитано 23.11.2012, 23:07   #528
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от ut1wpr Посмотреть сообщение
Там тоже "сами писАли"?
Да шутю я, шутю )))
Сообщение от Boba_spb Посмотреть сообщение
То что скорость увеличить можно - это точно;
да сказать то можно, что угодно - результат увеличения скорости В СТУДИЮ!

Сообщение от Boba_spb Посмотреть сообщение
Вообще то - такие вещи пишутся на ASMе, осбливо для 8 битных процессоров.
они таки пишутся на асемблере - писателями компиляторов ))) а уж потому юзаются юзверями как бублитеки )))
а самому уже не охота ещё один асемблер учить )))))

Я вообще не претендую на то что мой вариант идеальный... человек попросил помощи (ut1wpr) - я выложил то что имел, хотя мне пришлось переписывать под другую платформу и компилятор, нежели то, что я использовал в своей задаче...
и замечу, больше никто не предложил...
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов

Последний раз редактировалось picavr; 23.11.2012 в 23:20.
picavr вне форума   Ответить с цитированием
Непрочитано 24.11.2012, 00:23   #529
tempora
Почётный гражданин KAZUS.RU
 
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
tempora на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от picavr Посмотреть сообщение
и замечу, больше никто не предложил...

Потому, что UT1WPR написал, что проблема снята (насколько я помню, он воспользовался Eclips'ом).
__________________
There's always more than one way to skin a cat.
tempora вне форума   Ответить с цитированием
Непрочитано 24.11.2012, 00:52   #530
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: FAQ по STM8

Сообщение от picavr Посмотреть сообщение
Да шутю я, шутю )))
да сказать то можно, что угодно - результат увеличения скорости В СТУДИЮ! :

Да проверьте сами !!

Пройдите в отладчике по шагам.

Посчитайте сколько раз F11 придется нажать.
А еже ли чего, то nn=63 там раз 90 придется приложиться - а в моем примере только 30


unsigned char tb_bitclr[]={~1,~2,~4,~8,~16,~32,~64,0x7f};
unsigned char m[4];
void clrbit(unsigned char *t,char n)
{
t[n››3]&=tb_bitclr[n&7];
return;
}
short v64_int0;
short v64_int1;
short v64_int2;
short v64_int3;
char nn=1;

void bit2_clear64(unsigned char *point_num_bit){//
unsigned char 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‹4{v64_int2=(v64_int2 & (1‹‹(num_bit-32) ^ 0xffffffff));return;}
if(num_bit‹64){v64_int3=(v64_int3 & (1‹‹(num_bit-4 ^ 0xffffffff));return;}}
//==============================
int main(void)
{

clrbit(m,15);
bit2_clear64(&nn);
}
Boba_spb вне форума   Ответить с цитированием
Ответ

Закладки

Метки
arm, cortex, stm32, stm8

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Импульсная зарядка для авто-аккумуляторов (новодел) Falconist Источники питания и свет 1915 14.03.2024 19:56
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
STM8(S/L), первые впечатления kison STM8 1423 19.05.2018 19:23
Вопросы и замечания по топику - FAQ по PROTEUS avr123-nm-ru Proteus 291 05.06.2015 20:49
FAQ Импульсный трансформатор alberio Источники питания и свет 87 13.11.2012 18:07


Часовой пояс GMT +4, время: 12:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot