|
Я просто не верю что IAR STM8 такой тупой!, Ведь это же всегда был один из самых качественных компиляторов |
|
|
|
May 9 2017, 20:00
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Код #pragma inline=forced static void inline f(uint8_t i) { while(--i) asm(""); }
int main() { f(10); } В результате: Код 183 int main() 184 { \ main: \ 000000 52 01 SUB SP, #0x1 186 f(10); \ 000002 35 0A .... MOV S:?b0, #0xa \ 000006 20 00 JRA L:??main_0 \ ??main_1: \ ??main_0: \ 000008 B6 .. LD A, S:?b0 \ 00000A 4A DEC A \ 00000B B7 .. LD S:?b0, A \ 00000D 26 F9 JRNE L:??main_1 ЗАЧЕМ? Зачем он делает всё это???? Настройки компилятора по полной программе: Multi-file compilation, High, Speed +No size constraints P.S. Cosmic же на много толковее справился, хотя я конечно по прежнему не понимаю почему нельзя просто с регистром A работать.... Зачем в стек то? Код 60 .text: section .text,new 61 0000 _main: 63 0000 88 push a 64 00000001 OFST: set 1 67 ; 10 f(12); 70 0001 a60c ld a,#12 71 0003 6b01 ld (OFST+0,sp),a 74 0005 L72: 75 ; 5 _asm(""); 79 ; 4 while(--i) 81 0005 0a01 dec (OFST+0,sp) 83 0007 26fc jrne L72 /////////////////////////////////////////////// 84 0009 L73: 86 0009 20fe jra L73 99 xdef _main 118 end
--------------------
The truth is out there...
|
|
|
|
|
 |
Ответов
|
May 11 2017, 10:24
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Приведите лучше пример реализации БИХ-фильтра для разных компиляторов biggrin.gif Проверено на вполне боевой реализации void fir_mem16() из https://github.com/xiph/speex/blob/master/libspeex/filters.c из Speex Взято как средний случай обычного фильтра на Си, без особых оптимизаций там и всего прочего. Согласен, чистота эксперимента нарушена, т.к. это КИХ фильтр ))))) Но переделывать уже не охота ) Удивительно, но при раздутом размере IAR по тактам таки победил 19498 тактов у IAR 19929 Cosmic Оба последних версий, у обоих оптимизация на скорость включена по максимуму. Added:Мужики, ну я не удержался и скомпилил это на AVR-GCC 6.3.0 10708 тактов оптимизация -O3 Да-даа, я знаю что это разные архитектуры и сравнивать вот так в лоб нельзя, но я просто оставлю эти цифры здесь )))))) полный код теста: Код #include <stdint.h>
typedef int16_t spx_int16_t; typedef uint16_t spx_uint16_t; typedef int32_t spx_int32_t; typedef uint32_t spx_uint32_t;
#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ #define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ #define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ #define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ #define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ #define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */
typedef spx_int16_t spx_word16_t; typedef spx_int32_t spx_word32_t; typedef spx_word32_t spx_mem_t; typedef spx_word16_t spx_coef_t; typedef spx_word16_t spx_lsp_t; typedef spx_word32_t spx_sig_t;
#define Q15ONE 32767
#define LPC_SCALING 8192 #define SIG_SCALING 16384 #define LSP_SCALING 8192. #define GAMMA_SCALING 32768. #define GAIN_SCALING 64 #define GAIN_SCALING_1 0.015625
#define LPC_SHIFT 13 #define LSP_SHIFT 13 #define SIG_SHIFT 14 #define GAIN_SHIFT 6
#define VERY_SMALL 0 #define VERY_LARGE32 ((spx_word32_t)2147483647) #define VERY_LARGE16 ((spx_word16_t)32767) #define Q15_ONE ((spx_word16_t)32767)
#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) #define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
#define NEG16(x) (-(x)) #define NEG32(x) (-(x)) #define EXTRACT16(x) ((spx_word16_t)(x)) #define EXTEND32(x) ((spx_word32_t)(x)) #define SHR16(a,shift) ((a) >> (shift)) #define SHL16(a,shift) ((a) << (shift)) #define SHR32(a,shift) ((a) >> (shift)) #define SHL32(a,shift) ((a) << (shift)) #define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) #define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) #define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) #define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
#define SHR(a,shift) ((a) >> (shift)) #define SHL(a,shift) ((spx_word32_t)(a) << (shift)) #define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) #define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
#define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) #define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) #define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) #define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b))
/* result fits in 16 bits */ #define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b))))
/* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ #define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b)))
#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) #define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) #define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) #define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14))
#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) #define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)))
#define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) #define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) #define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)))
#define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) #define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) #define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13)))
#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) #define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) #define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) #define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) #define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) #define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15))
#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
#define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))) #define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b)))) #define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b))) #define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b)))
////////////////// #define NVALUE 32 #define ORD 2
spx_word16_t x[NVALUE]; spx_coef_t num[ORD]; spx_word16_t y[NVALUE]; spx_mem_t mem[ORD];
void fir_mem16(const spx_word16_t *x, const spx_coef_t *num, spx_word16_t *y, int N, int ord, spx_mem_t *mem, char *stack) { int i,j; spx_word16_t xi,yi;
for (i=0;i<N;i++) { xi=x[i]; yi = EXTRACT16(SATURATE(ADD32(EXTEND32(x[i]),PSHR32(mem[0],LPC_SHIFT)),32767)); for (j=0;j<ord-1;j++) { mem[j] = MAC16_16(mem[j+1], num[j],xi); } mem[ord-1] = MULT16_16(num[ord-1],xi); y[i] = yi; } }
void main() { asm("nop"); //for brakepoints fir_mem16(&x[0], &num[0], &y[0], NVALUE, ORD, &mem[0], 0x0000); asm("nop"); //for brakepoints }
--------------------
The truth is out there...
|
|
|
|
|
May 11 2017, 14:37
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 29-09-10
Пользователь №: 59 816

|
Цитата(AHTOXA @ May 11 2017, 20:00)  Раз уж вы взялись тестировать, то укажите и полученный размер. (Ну и добавьте sdcc, для полноты картины). Кейл V5 Cortex-М0 L3 2673мт Program Size: Code=308 RO-data=224 RW-data=16 ZI-data=1152 Cortex-М3 L3 1651мт Program Size: Code=304 RO-data=224 RW-data=16 ZI-data=1152
Сообщение отредактировал Михась - May 11 2017, 14:39
|
|
|
|
|
May 12 2017, 03:40
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 29-09-10
Пользователь №: 59 816

|
Цитата(AHTOXA @ May 12 2017, 00:05)  Это немного не то, интересны именно компиляторы для STM8. Это да, просто хотел получить некоторую калибровочную точку на основе широко распространенной архитектуры  Компилятор RIDE51 6.4 для 8052 показал время выполнения 1,1 сек на частоте 1МГц с оптимизацией по скорости и 3,3 сек с оптимизацией по объему. Прогресс внушает!! Keil C51 8052 L7 52 632 тактов Program Size: data=114.0 xdata=0 code=1228
Сообщение отредактировал Михась - May 12 2017, 15:41
|
|
|
|
Сообщений в этой теме
sigmaN Я просто не верю что IAR STM8 такой тупой! May 9 2017, 20:00 jcxz Цитата(sigmaN @ May 9 2017, 22:00) Cosmic... May 9 2017, 20:57 AHTOXA Посмотрите, что из вашего кода делает sdcc, и успо... May 10 2017, 06:51 Эдди Цитата(AHTOXA @ May 10 2017, 09:51) Посмо... May 11 2017, 11:52 sigmaN Грустно, потому что я в другом окне смотрю, что из... May 10 2017, 10:01 jcxz Цитата(sigmaN @ May 10 2017, 12:01) Груст... May 10 2017, 12:44 sigmaN Цели никакой нет и холливара тоже. Просто обидно ч... May 10 2017, 13:13 AHTOXA А как, по-вашему, должен выглядеть предложенный ва... May 10 2017, 18:21 jcxz Цитата(sigmaN @ May 10 2017, 15:13) Прост... May 10 2017, 20:01 sigmaN Выглядеть этот кусок может и должен в точности как... May 11 2017, 01:54 AHTOXA Цитата(sigmaN @ May 11 2017, 06:54) Выгля... May 11 2017, 06:20 jcxz Цитата(sigmaN @ May 11 2017, 03:54) Приде... May 11 2017, 08:38 sigmaN Тоже потом подумал про испорченный A. Однако же ни... May 11 2017, 08:34 sigmaN Cosmic для стм8 нынче абсолютно свободен и без огр... May 11 2017, 13:15 Эдди Космик только под мастдайку — не годится. May 11 2017, 13:24 sigmaN Странно, но космик в удобном виде размеры не вывод... May 12 2017, 10:44 sigmaN Мой товарищ сделал задержку 1us вот таким не хитры... May 13 2017, 17:35 jcxz Цитата(sigmaN @ May 13 2017, 19:35) Рассл... May 14 2017, 06:05  Den64 Цитата(jcxz @ May 14 2017, 09:05) Не поня... May 14 2017, 06:39   jcxz Цитата(Den64 @ May 14 2017, 08:39) Нескол... May 14 2017, 18:36    Den64 Цитата(jcxz @ May 14 2017, 21:36) Это пон... May 14 2017, 18:59 sigmaN ЦитатаЭто из игры fallout. Что это за приложение д... May 14 2017, 20:17 AHTOXA Мне фотки видны.
Он заменил 16 nop-ов на два вызов... May 14 2017, 21:16 jcxz Цитата(sigmaN @ May 14 2017, 22:17) Короч... May 15 2017, 09:38 sigmaN Да, я тоже перепроверил, времянка не соблюдена. Дл... May 14 2017, 21:27 sigmaN Как раз эта часть отлично описана в посте со скрин... May 15 2017, 14:15 jcxz Да похоже так и есть - реально тупой
Функцию, ... Jun 12 2017, 13:36 Эдди Синус на STM8? Зачем???????????????? Jun 12 2017, 14:43 jcxz Цитата(Эдди @ Jun 12 2017, 16:43) Синус н... Jun 12 2017, 17:27 Эдди ШИМ — штука хорошая, но синусоида элементарно по т... Jun 13 2017, 05:25 jcxz Цитата(Эдди @ Jun 13 2017, 07:25) ШИМ ... Jun 13 2017, 06:26 jcxz Цитата(sigmaN @ May 9 2017, 23:00) ЗАЧЕМ?... Jul 25 2017, 11:44 sigmaN ммм, неплохо, неплохо! Затестим обязательно... Jul 26 2017, 19:26 VladislavS Пример из первого сообщения. STM8 Series 3.10.1
Ка... Jul 31 2017, 05:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|