03.11.2010, 15:44
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
А вот под STM8 эта фигня не собирается. Какие то странные вещи пишет - переполнение сегментов. Вроде 1800 байт должно в 2Кб влезать, а не лезут. Компилятор глючит что ли? Попробуйте в IAR собрать. Ну соответственно асм вставку в вечном цикле замените на что нибудь типа разрешения прерываний.
UPD: Собрал и сам, пришлось изменить секцию ubsct. По умолчанию ее размер всего 256 байт максимум, а туда идут все переменные инициализируемые 0. В общем это аналог bss, для тех кто с GCC знаком.
|
Компилятор не глючит, память разбита на три секции нулевая страница, "выше нулевой" и стек.
нулевая страница от 0 до 255
выше от 256 до макс_озу-стек
стек от макс_озу-стек до макс_озу
поэтому достаточно было сказать компилятору
@near short array1[ARRAY_SIZE];
и всё получилось бы, дока же есть к нему, достаточно хорошо описанна.
ЗЫ вот только при таком раскладе (для двух кило байт озу стек 512 байт, если не ошибаюсь) у вас не войдут всё массивы.
|
|
|
|
03.11.2010, 15:49
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
Код:
|
#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");
}
} |
|
Самое смешное что если заменить цикл на соледовательность
Код:
|
array1[0] = array2[0] + array3[0];
...
array1[299] = array2[299] + array3[299]; |
получаем всего лишь 1800 тактов ![Улыбка](images/smilies/icon_smile.gif) т.е. 6 тактов на одну операцию, с циклом у меня получается 30 тактов...
|
|
|
|
03.11.2010, 16:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.06.2005
Сообщений: 3,399
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от zheleznjakov
|
Самое смешное что если заменить цикл на соледовательность
Код:
|
array1[0] = array2[0] + array3[0];
...
array1[299] = array2[299] + array3[299]; |
получаем всего лишь 1800 тактов т.е. 6 тактов на одну операцию, с циклом у меня получается 30 тактов...
|
Это называется "Unrolling Cycles". Ее мы рассматривать не будет ибо можно просуммировать без всякого цикла.
|
|
|
|
03.11.2010, 16:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от zheleznjakov
|
и всё получилось бы, дока же есть к нему, достаточно хорошо описанна.
|
Есть дока. #pragma ubsct @near и все собирается. Можно было и по умолчанию так сделать - неужели два байта флеши экономят?
Сообщение от zheleznjakov
|
ЗЫ вот только при таком раскладе (для двух кило байт озу стек 512 байт, если не ошибаюсь) у вас не войдут всё массивы.
|
Все вроде входит. С чего это стек 512 байт? Я детально пока не разбирался, но считал что у космика стек как в GCC - компилятором никак не контролируется. Растет стек вниз, так что если до данных не достанет, то и все в порядке.
Сообщение от zheleznjakov
|
получаем всего лишь 1800 тактов
|
Размер слишком большой выйдет. Беда в том, что указателя всего два, вот и тормоза. Было бы три... С другой стороны 5700 тактов это GCC под АВР, у IAR будет куда больше, как у STM8 или еще тормознее. А народ им пользуется и не переживает по поводу таких вот тормозов. Но третий указатель STM8 бы не помешал
|
|
|
|
03.11.2010, 16:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от Gnider
|
Это называется "Unrolling Cycles".
|
Это не так называется. Unrolling банально разворачивает циклы, тупо повторяя все действия. Будет все равно работа с указателями, а сэкономится только время на счетчик итераций и переход на начало. Ну может тактов 8 из 30 = 22. Сравните с 6.
|
|
|
|
03.11.2010, 16:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.06.2005
Сообщений: 3,399
Сказал спасибо: 5
Сказали Спасибо 431 раз(а) в 306 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
Это не так называется. Unrolling банально разворачивает циклы, тупо повторяя все действия. Будет все равно работа с указателями, а сэкономится только время на счетчик итераций и переход на начало. Ну может тактов 8 из 30 = 22. Сравните с 6.
|
Да любое уменьшение цикла и есть unrolling.
|
|
|
|
03.11.2010, 16:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от Gnider
|
Да любое уменьшение цикла и есть unrolling.
|
Спорить не буду. Когда напишете хоть одну программу ![Улыбка](images/smilies/icon_smile.gif) - поймете.
|
|
|
|
03.11.2010, 17:09
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
Есть дока. #pragma ubsct @near и все собирается. Можно было и по умолчанию так сделать - неужели два байта флеши экономят?
Все вроде входит. С чего это стек 512 байт? Я детально пока не разбирался, но считал что у космика стек как в GCC - компилятором никак не контролируется. Растет стек вниз, так что если до данных не достанет, то и все в порядке.
Размер слишком большой выйдет. Беда в том, что указателя всего два, вот и тормоза. Было бы три... С другой стороны 5700 тактов это GCC под АВР, у IAR будет куда больше, как у STM8 или еще тормознее. А народ им пользуется и не переживает по поводу таких вот тормозов. Но третий указатель STM8 бы не помешал
|
Я детально не вникал глунял просто распределение секций у линкера, при 2048 байт озу нулевая страница 255 байт, а bss (data) от 0x0100 до 0x05FE, вот и подумал что 512 под стек.
|
|
|
|
03.11.2010, 17:10
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
а прога "соберается" да же если ARRAY_SIZE 20000 тыщ поставить...
|
|
|
|
03.11.2010, 17:18
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
А вот ещё один простой примерчик - программный DDS
с 32-разрядным аккумулятором фазы. 10 тактов, 2000 Котсчётов/с на тактовой 20 МГц. Интересно, насколько STM8 здесь проиграет? Код такой
loop: add r10,r20 ;
adc r11,r21 ;
adc r12,r22 ;
adc r30,r23 ;
lpm r13,z ;
out portb,r13 ;
rjmp loop
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:39.
|
|