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

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

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

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

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

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


 
Опции темы
Непрочитано 02.11.2010, 19:21  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от EugVor Посмотреть сообщение
И всего 22 такта. Рано я поторопился с выводами.
22 такта - на что? На все что приведено в https://kazus.ru/forums/showpost.php...&postcount=113 ??? Как компилятор может обогнать ассемблер? Или это только на сложение?
Кстати на пузырьке АВР обгоняет STM8. Впрочем может быть несовершенство компилятора, ведь самому STM8 года нет.
Проверялось так:
Код:
#define ARRAY_SIZE	100

int16_t array[ARRAY_SIZE];

void ArrayFill(void)
{
	uint8_t i;
	for(i = 0; i‹ ARRAY_SIZE; i++) array[i] = 99-i;
}


void Sort(void)
{
uint8_t v,i;
int16_t tmp;
v = 1;
while(v)
	{
	v = 0;
		for(i = 0; i ‹ (ARRAY_SIZE-1); i++)
			{
				if(array[i] ›= array[i+1])
					{
						tmp = array[i];
						array[i] = array[i+1];
						array[i+1] = tmp;
						v = 1;
					}
			}		
	}
}
Вообще интересно - если алгоритм более-менее длительный, и количество переменных влезает в регистры, то АВР на коне. На коротких же быстрее STM8.
Также STM8 быстрее в чистой математике, сказывается наличие аппаратного деления.
Ну и ногами он машет быстрее
Реклама:

Последний раз редактировалось Falconist; 13.04.2011 в 23:33.
kison вне форума  
Непрочитано 02.11.2010, 19:27  
EugVor
Временная регистрация
 
Регистрация: 15.03.2006
Сообщений: 80
Сказал спасибо: 3
Сказали Спасибо 83 раз(а) в 11 сообщении(ях)
EugVor на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Вот именно, что на всё -22 вместо 27, а код вырос с 43 до 46:
Код:
#include ‹iom16.h›
#include ‹inavr.h›
volatile char A;
volatile char B;
volatile char C;

void SubRout (void);

void main (void)
{
    DDRA=0xFF;      // Все быиты PORTA на выход.
    PORTA|=(1‹‹0);  // Установить PA.0.
    A=1; B=2;       // Инициализировать A, B.
    SubRout ();     // Переход на функцию.
    // Если PA.0 сброшен, установить его.        
    if(PINA&(1‹‹0)) PORTA&=~(1‹‹0);
}
void SubRout (void)
{
    C=A+B;          // Сложить A и B.
}
С отпимизацией по скорости:
Код:
     10          void main (void)
   \                     main:
     11          {
     12              DDRA=0xFF;      // Все быиты PORTA на выход.
   \   00000000   EF0F               LDI     R16, 255
   \   00000002   BB0A               OUT     0x1A, R16
     13              PORTA|=(1‹‹0);  // Установить PA.0.
   \   00000004   9AD8               SBI     0x1B, 0x00
     14              A=1; B=2;       // Инициализировать A, B.
   \   00000006   ....               LDI     R30, LOW(A)
   \   00000008   ....               LDI     R31, (A) ›› 8
   \   0000000A   E001               LDI     R16, 1
   \   0000000C   8300               ST      Z, R16
   \   0000000E   E002               LDI     R16, 2
   \   00000010   8301               STD     Z+1, R16
     15              SubRout ();     // Переход на функцию.
   \   00000012   8100               LD      R16, Z
   \   00000014   8111               LDD     R17, Z+1
   \   00000016   0F10               ADD     R17, R16
   \   00000018   8312               STD     Z+2, R17
     16              // Если PA.0 сброшен, установить его.        
     17              if(PINA&(1‹‹0)) PORTA&=~(1‹‹0);
   \   0000001A   99C8               SBIC    0x19, 0x00
   \   0000001C   98D8               CBI     0x1B, 0x00
     18          }
   \                     ??main_0:
   \   0000001E   9508               RET

   \                                 In segment CODE, align 2, keep-with-next
     19          void SubRout (void)
   \                     SubRout:
     20          {
     21              C=A+B;          // Сложить A и B.
   \   00000000   ....               LDI     R30, LOW(A)
   \   00000002   ....               LDI     R31, (A) ›› 8
   \   00000004   8100               LD      R16, Z
   \   00000006   8111               LDD     R17, Z+1
   \   00000008   0F10               ADD     R17, R16
   \   0000000A   8312               STD     Z+2, R17
     22          }
   \   0000000C   9508               RET
Без оптимизации:
Код:
     10          void main (void)
   \                     main:
     11          {
     12              DDRA=0xFF;      // Все быиты PORTA на выход.
   \   00000000   EF0F               LDI     R16, 255
   \   00000002   BB0A               OUT     0x1A, R16
     13              PORTA|=(1‹‹0);  // Установить PA.0.
   \   00000004   9AD8               SBI     0x1B, 0x00
     14              A=1; B=2;       // Инициализировать A, B.
   \   00000006   E001               LDI     R16, 1
   \   00000008   9300....           STS     A, R16
   \   0000000C   E002               LDI     R16, 2
   \   0000000E   9300....           STS     B, R16
     15              SubRout ();     // Переход на функцию.
   \   00000012   ....               RCALL   SubRout
     16              // Если PA.0 сброшен, установить его.        
     17              if(PINA&(1‹‹0)) PORTA&=~(1‹‹0);
   \   00000014   99C8               SBIC    0x19, 0x00
   \   00000016   98D8               CBI     0x1B, 0x00
     18          }
   \                     ??main_0:
   \   00000018   9508               RET

   \                                 In segment CODE, align 2, keep-with-next
     19          void SubRout (void)
   \                     SubRout:
     20          {
     21              C=A+B;          // Сложить A и B.
   \   00000000   9100....           LDS     R16, A
   \   00000004   9110....           LDS     R17, B
   \   00000008   0F10               ADD     R17, R16
   \   0000000A   9310....           STS     C, R17
     22          }
   \   0000000E   9508               RET

Сообщение от kison Посмотреть сообщение
22 такта - на что? На все что приведено в https://kazus.ru/forums/showpost.php...&postcount=113 ??? Как компилятор может обогнать ассемблер?
Я не применял косвенную адресацию в асме. IAR при low-оптимизации скорости (по дефолту) этого тоже не делает, а вот при hight уже да.

Последний раз редактировалось Falconist; 13.04.2011 в 23:34.
EugVor вне форума  
Непрочитано 02.11.2010, 19:40  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от EugVor Посмотреть сообщение
Я не применял косвенную адресацию в асме. IAR при low-оптимизации по скорости этого тоже не делает, а вот при hight уже да.
Только выигрыш то не от косвенной адресации, которая в АВР только тормозит, а всего лишь от инлайна функции. Нет call и ret. У STM8 при инлайне вообще 10 тактов выходит. Кстати 22 такта это даже много - исходный был 27, вычесть 7 (call 3 и ret 4) - должно быть 20 Эти два такта как раз косвенная адресация накинула. В общем незачет - существенные отличия от исходного варианта.
Сделайте немного по другому - вынесите SubRout в другой си файл. А в этом extern void SubRout(void); Тогда получится один в один.

Последний раз редактировалось Falconist; 13.04.2011 в 23:34.
kison вне форума  
Непрочитано 02.11.2010, 19:48  
EugVor
Временная регистрация
 
Регистрация: 15.03.2006
Сообщений: 80
Сказал спасибо: 3
Сказали Спасибо 83 раз(а) в 11 сообщении(ях)
EugVor на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Ага точно! Как много сюрпризов от оптимизации, даже не заметил, извиняюсь.
Сообщение от kison Посмотреть сообщение
Сделайте немного по другому - вынесите SubRout в другой си файл. А в этом extern void SubRout(void); Тогда получится один в один.
Да ладно уж итак всё ясно.
Зато в примере со сложением массивов косвенная адресация должна дать преимущества AVR-ке, но там она упорно не хочет учавствовать.

Последний раз редактировалось Falconist; 13.04.2011 в 23:35.
EugVor вне форума  
Непрочитано 02.11.2010, 20:12  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от EugVor Посмотреть сообщение
Зато в примере со сложением массивов косвенная адресация должна дать преимущества AVR-ке.
Должна и дает. У STM8 всего два индексных регистра. Впрочем можно и поскладывать.
Код:
#define ARRAY_SIZE	300

uint16_t array1[ARRAY_SIZE];
uint16_t array2[ARRAY_SIZE];
uint16_t array3[ARRAY_SIZE];


void SummArray(void)
{
uint16_t i = ARRAY_SIZE;
uint16_t *pDest = array3,*pSrc1 = array1, *pSrc2 = array2;

	while(i--) *pDest++ = *pSrc1++ + *pSrc2++;
}

int main(void)
{
SummArray();

while(1)
	{
	asm volatile ("nop");
	}

}
Под М32 соответственно - массивы большие. У меня под АВР вышло 5728 тактов на функцию SummArray.
А вот под STM8 эта фигня не собирается. Какие то странные вещи пишет - переполнение сегментов. Вроде 1800 байт должно в 2Кб влезать, а не лезут. Компилятор глючит что ли? Попробуйте в IAR собрать. Ну соответственно асм вставку в вечном цикле замените на что нибудь типа разрешения прерываний.
UPD: Собрал и сам, пришлось изменить секцию ubsct. По умолчанию ее размер всего 256 байт максимум, а туда идут все переменные инициализируемые 0. В общем это аналог bss, для тех кто с GCC знаком.
Действительно три указателя лучше двух - 9339 тактов у STM8. Впрочем не всегда у АВР три указателя - IAR использует один из них под указатель второго стека, так что там явно не 5700 тактов выйдет.

Последний раз редактировалось Falconist; 13.04.2011 в 23:35.
kison вне форума  
Непрочитано 02.11.2010, 23:04  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

kison, Давай я твои с EugVor состязания в другую ветку потом перекину?
Вытирать , так потом снова кто нибудь начнет. А так можно будет ткнуть в нее.
А здесь почищу . И если не влом будет, можешь обзор, или квикстарт накидать ...

ЗЫ . Получил сегодня и ST-LINK и Discovery . Discovery помучаю сначала сам потом другу отдам .
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 03.11.2010, 00:01  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от dosikus Посмотреть сообщение
kison, Давай я твои с EugVor состязания в другую ветку потом перекину?
Вытирать , так потом снова кто нибудь начнет. А так можно будет ткнуть в нее.
Начнут в любом случае. Мозг человека устроен так - мы познаем все новое через сравнение с уже известным. Ищем сходства и отличия. Если кто не верит, пусть попробует объяснить что такое троллейбус человеку, никогда его не видевшему. На 99,9% объяснение начнется так: это как автобус, но...
Ровно то же и с контроллерами - нужна точка отсчета.
А в этой ветке можно вообще оставить одно первое сообщение. Собственно все что нужно я в нем сказал. Остальное - рабочие моменты, я привыкал к новому для себя компилятору, он наверно ко мне Отсюда и сравнения. Ну и флуда накопилось, и моего в том числе. Так что я бы зачистил тему совсем - первого сообщения достаточно. Ну можно еще пару оставить типа 57,58. Дальше либо заинтересует это кого, и он сам сядет и напишет ту же мигалку светодиодом. Если не получится - задаст конкретный вопрос в отдельной, специально для этого созданной теме.
Здесь то и правда "винегрет" получился вплоть до замены деления умножением

Последний раз редактировалось Falconist; 13.04.2011 в 23:34.
kison вне форума  
Непрочитано 03.11.2010, 08:13  
RY723
Заблокирован
 
Регистрация: 08.08.2007
Сообщений: 2,843
Сказал спасибо: 378
Сказали Спасибо 1,368 раз(а) в 746 сообщении(ях)
RY723 на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Не надо ничего убирать. Рафинированный продукт всегда хуже нерафинированного, потому что убираются многие полезные вещества. Когда по теме кто-нибудь будет "проезжаться", то обратит внимание на нюансы. А "голое" первое сообщение - скользнёт взглядом - и безразлично перейдёт на следующую тему.
RY723 вне форума  
Непрочитано 03.11.2010, 11:27  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

А такие сравнения меня лично интересуют. Сколько ток на ножку, на порт, на кристалл.
SasaVitebsk вне форума  
Непрочитано 03.11.2010, 12:33  
Gnider
Почётный гражданин KAZUS.RU
 
Регистрация: 30.06.2005
Сообщений: 3,399
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
Gnider на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от kison Посмотреть сообщение
Должна и дает. У STM8 всего два индексных регистра. Впрочем можно и поскладывать.
Код:
#define ARRAY_SIZE	300

uint16_t array1[ARRAY_SIZE];
uint16_t array2[ARRAY_SIZE];
uint16_t array3[ARRAY_SIZE];


void SummArray(void)
{
uint16_t i = ARRAY_SIZE;
uint16_t *pDest = array3,*pSrc1 = array1, *pSrc2 = array2;

	while(i--) *pDest++ = *pSrc1++ + *pSrc2++;
}

int main(void)
{
SummArray();

while(1)
	{
	asm volatile ("nop");
	}

}
Под М32 соответственно - массивы большие. У меня под АВР вышло 5728 тактов на функцию SummArray.
А вот под STM8 эта фигня не собирается. Какие то странные вещи пишет - переполнение сегментов. Вроде 1800 байт должно в 2Кб влезать, а не лезут. Компилятор глючит что ли? Попробуйте в IAR собрать. Ну соответственно асм вставку в вечном цикле замените на что нибудь типа разрешения прерываний.
UPD: Собрал и сам, пришлось изменить секцию ubsct. По умолчанию ее размер всего 256 байт максимум, а туда идут все переменные инициализируемые 0. В общем это аналог bss, для тех кто с GCC знаком.
Действительно три указателя лучше двух - 9339 тактов у STM8. Впрочем не всегда у АВР три указателя - IAR использует один из них под указатель второго стека, так что там явно не 5700 тактов выйдет.
Чисто ради интереса протестил это пример на lpc1111
Получилось функция SummArray выполняется за 4529 тактов и занимает 38 байт.

P.S. Камень стоит 35 рублей.

Последний раз редактировалось Falconist; 13.04.2011 в 23:35.
Gnider вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
KiCAD-объявления и впечатления al_dan KiCAD 32 03.10.2016 17:02
Народ, посмотрите quasm, Как ваши впечатления? suri Proteus, KiCAD и другие ECAD 5 14.10.2009 11:57


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


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