02.11.2010, 19:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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.
|
|
|
|
02.11.2010, 19:27
|
|
Временная регистрация
Регистрация: 15.03.2006
Сообщений: 80
Сказал спасибо: 3
Сказали Спасибо 83 раз(а) в 11 сообщении(ях)
|
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 |
Я не применял косвенную адресацию в асме. IAR при low-оптимизации скорости (по дефолту) этого тоже не делает, а вот при hight уже да.
Последний раз редактировалось Falconist; 13.04.2011 в 23:34.
|
|
|
|
02.11.2010, 19:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от EugVor
|
Я не применял косвенную адресацию в асме. IAR при low-оптимизации по скорости этого тоже не делает, а вот при hight уже да.
|
Только выигрыш то не от косвенной адресации, которая в АВР только тормозит, а всего лишь от инлайна функции. Нет call и ret. У STM8 при инлайне вообще 10 тактов выходит. Кстати 22 такта это даже много - исходный был 27, вычесть 7 (call 3 и ret 4) - должно быть 20 ![Улыбка](images/smilies/icon_smile.gif) Эти два такта как раз косвенная адресация накинула. В общем незачет - существенные отличия от исходного варианта.
Сделайте немного по другому - вынесите SubRout в другой си файл. А в этом extern void SubRout(void); Тогда получится один в один.
Последний раз редактировалось Falconist; 13.04.2011 в 23:34.
|
|
|
|
02.11.2010, 19:48
|
|
Временная регистрация
Регистрация: 15.03.2006
Сообщений: 80
Сказал спасибо: 3
Сказали Спасибо 83 раз(а) в 11 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Ага точно! Как много сюрпризов от оптимизации, даже не заметил, извиняюсь.
Сообщение от kison
|
Сделайте немного по другому - вынесите SubRout в другой си файл. А в этом extern void SubRout(void); Тогда получится один в один.
|
Да ладно уж итак всё ясно.
Зато в примере со сложением массивов косвенная адресация должна дать преимущества AVR-ке, но там она упорно не хочет учавствовать.
Последний раз редактировалось Falconist; 13.04.2011 в 23:35.
|
|
|
|
02.11.2010, 20:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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.
|
|
|
|
02.11.2010, 23:04
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
kison, Давай я твои с EugVor состязания в другую ветку потом перекину?
Вытирать , так потом снова кто нибудь начнет. А так можно будет ткнуть в нее.
А здесь почищу . И если не влом будет, можешь обзор, или квикстарт накидать ...
ЗЫ . Получил сегодня и ST-LINK и Discovery . Discovery помучаю сначала сам потом другу отдам .
__________________
Осторожно , злой кот
|
|
|
|
03.11.2010, 00:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от dosikus
|
kison, Давай я твои с EugVor состязания в другую ветку потом перекину?
Вытирать , так потом снова кто нибудь начнет. А так можно будет ткнуть в нее.
|
Начнут в любом случае. ![Улыбка](images/smilies/icon_smile.gif) Мозг человека устроен так - мы познаем все новое через сравнение с уже известным. Ищем сходства и отличия. Если кто не верит, пусть попробует объяснить что такое троллейбус человеку, никогда его не видевшему. На 99,9% объяснение начнется так: это как автобус, но... ![Улыбка](images/smilies/icon_smile.gif)
Ровно то же и с контроллерами - нужна точка отсчета.
А в этой ветке можно вообще оставить одно первое сообщение. Собственно все что нужно я в нем сказал. Остальное - рабочие моменты, я привыкал к новому для себя компилятору, он наверно ко мне ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) Отсюда и сравнения. Ну и флуда накопилось, и моего в том числе. Так что я бы зачистил тему совсем - первого сообщения достаточно. Ну можно еще пару оставить типа 57,58. Дальше либо заинтересует это кого, и он сам сядет и напишет ту же мигалку светодиодом. Если не получится - задаст конкретный вопрос в отдельной, специально для этого созданной теме.
Здесь то и правда "винегрет" получился вплоть до замены деления умножением
Последний раз редактировалось Falconist; 13.04.2011 в 23:34.
|
|
|
|
03.11.2010, 08:13
|
|
Заблокирован
Регистрация: 08.08.2007
Сообщений: 2,843
Сказал спасибо: 378
Сказали Спасибо 1,368 раз(а) в 746 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Не надо ничего убирать. Рафинированный продукт всегда хуже нерафинированного, потому что убираются многие полезные вещества. Когда по теме кто-нибудь будет "проезжаться", то обратит внимание на нюансы. А "голое" первое сообщение - скользнёт взглядом - и безразлично перейдёт на следующую тему.
|
|
|
|
03.11.2010, 11:27
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
А такие сравнения меня лично интересуют. Сколько ток на ножку, на порт, на кристалл.
|
|
|
|
03.11.2010, 12:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.06.2005
Сообщений: 3,399
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
|
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.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:14.
|
|