реклама на сайте
подробности

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


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...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение May 11 2017, 10:24
Сообщение #2


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...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - AHTOXA   Цитата(sigmaN @ May 11 2017, 15:24) Удиви...   May 11 2017, 14:00
|- - Михась   Цитата(AHTOXA @ May 11 2017, 20:00) Раз у...   May 11 2017, 14:37
|- - AHTOXA   Цитата(Михась @ May 11 2017, 19:37) Это ...   May 11 2017, 17:05
|- - Михась   Цитата(AHTOXA @ May 12 2017, 00:05) Это н...   May 12 2017, 03:40
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 00:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016