Перейти к содержанию
    

Я просто не верю что IAR STM8 такой тупой!

Как раз эта часть отлично описана в посте со скринами

Мой товарищ сделал задержку 1us вот таким не хитрым способом

Код

#define ONE_US_DELAY nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();no

p();nop();nop()

 

Этот nop() есть ни что иное как макрос разворачивающийся в asm("nop")

Макрос nop(), его конкретное определение можно найти в файле STM8S_StdPeriph_Lib\Libraries\STM8S_StdPeriph_Driver\inc\stm8s.h

/*============================== Interrupts ====================================*/
#ifdef _RAISONANCE_
#include <intrins.h>
#define enableInterrupts()    _rim_()  /* enable interrupts */
#define disableInterrupts()   _sim_()  /* disable interrupts */
#define rim()                 _rim_()  /* enable interrupts */
#define sim()                 _sim_()  /* disable interrupts */
#define nop()                 _nop_()  /* No Operation */
#define trap()                _trap_() /* Trap (soft IT) */
#define wfi()                 _wfi_()  /* Wait For Interrupt */
#define halt()                _halt_() /* Halt */
#elif defined(_COSMIC_)
#define enableInterrupts()    {_asm("rim\n");}  /* enable interrupts */
#define disableInterrupts()   {_asm("sim\n");}  /* disable interrupts */
#define rim()                 {_asm("rim\n");}  /* enable interrupts */
#define sim()                 {_asm("sim\n");}  /* disable interrupts */
#define nop()                 {_asm("nop\n");}  /* No Operation */
#define trap()                {_asm("trap\n");} /* Trap (soft IT) */
#define wfi()                 {_asm("wfi\n");}  /* Wait For Interrupt */
#define halt()                {_asm("halt\n");} /* Halt */
#else /*_IAR_*/
#include <intrinsics.h>
#define enableInterrupts()    __enable_interrupt()   /* enable interrupts */
#define disableInterrupts()   __disable_interrupt()  /* disable interrupts */
#define rim()                 __enable_interrupt()   /* enable interrupts */
#define sim()                 __disable_interrupt()  /* disable interrupts */
#define nop()                 __no_operation()       /* No Operation */
#define trap()                __trap()               /* Trap (soft IT) */
#define wfi()                 __wait_for_interrupt() /* Wait For Interrupt */
#define halt()                __halt()               /* Halt */
#endif /*_RAISONANCE_*/

 

Ну и таки уже разобрались, что IAR уменьшил кол-во нопов ради размера и везде где встречается макрос он вставил два вызова этой своей авто сгенерированной функции с нопами.

Времянка конечно же не совпала, но прикольно всё равно.

 

Настройки проекта в IAR для повторения.

post-35751-1494857743_thumb.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да похоже так и есть - реально тупой :laughing:

Функцию, вычисляющую синус, переписал на асм - получил время её выполнения в ~4.5 раза меньше!

Без изменения алгоритма. И, естественно: компиляция си-функции с оптимизацией High(speed).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ШИМ — штука хорошая, но синусоида элементарно по таблице считается!

Не хватало еще флоатов в 8-битных МК!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ШИМ — штука хорошая, но синусоида элементарно по таблице считается!

По таблице? И каков её размер? И какова точность?

И причём тут "синусоида" если я пишу про "синус"? Или Вы таблицу строите для только одной частоты? Ну да - это известный чайниковский метод :biggrin:

 

Не хватало еще флоатов в 8-битных МК!

А при чём тут флоаты вообще??? :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЗАЧЕМ? Зачем он делает всё это????

Посмотрите новый IAR 3.10 (есть на ftp). Он уже гораздо лучше компилит и не делает многих тех странностей, что старый.

По крайней мере, там где старый генерил полный маразм:

     95            } while (++smplN < ncell(smpl));
   \   000063 A6 01        LD        A, #0x1
   \   000065 BB ..        ADD       A, S:smplN
   \   000067 B7 ..        LD        S:smplN, A
   \   000069 B6 ..        LD        A, S:smplN
   \   00006B A1 10        CP        A, #0x10
   \   00006D 25 A7        JRC       L:??McGenerate_0

новый для того же места выдаёт вполне разумно (я бы на асме так же написал-бы):

     95            } while (++smplN < ncell(smpl));
   \   00005F 3C ..        INC       S:smplN
   \   000061 B6 ..        LD        A, S:smplN
   \   000063 A1 10        CP        A, #0x10
   \   000065 25 AF        JRC       L:??McGenerate_0

Ну и много других мест.

И это даже при "Low" оптимизации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример из первого сообщения. STM8 Series 3.10.1

Как то так

post-4140-1501479599_thumb.png

 

И даже вот так

post-4140-1501480356_thumb.png

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...