sigmaN 0 15 мая, 2017 Опубликовано 15 мая, 2017 · Жалоба Как раз эта часть отлично описана в посте со скринами Мой товарищ сделал задержку 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 для повторения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба Да похоже так и есть - реально тупой :laughing: Функцию, вычисляющую синус, переписал на асм - получил время её выполнения в ~4.5 раза меньше! Без изменения алгоритма. И, естественно: компиляция си-функции с оптимизацией High(speed). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба Синус на STM8? Зачем???????????????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 июня, 2017 Опубликовано 12 июня, 2017 · Жалоба Синус на STM8? Зачем???????????????? Затем же зачем в его таймерах есть ШИМ ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 13 июня, 2017 Опубликовано 13 июня, 2017 · Жалоба ШИМ — штука хорошая, но синусоида элементарно по таблице считается! Не хватало еще флоатов в 8-битных МК! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 июня, 2017 Опубликовано 13 июня, 2017 · Жалоба ШИМ — штука хорошая, но синусоида элементарно по таблице считается! По таблице? И каков её размер? И какова точность? И причём тут "синусоида" если я пишу про "синус"? Или Вы таблицу строите для только одной частоты? Ну да - это известный чайниковский метод Не хватало еще флоатов в 8-битных МК! А при чём тут флоаты вообще??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 25 июля, 2017 Опубликовано 25 июля, 2017 · Жалоба ЗАЧЕМ? Зачем он делает всё это???? Посмотрите новый 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" оптимизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 26 июля, 2017 Опубликовано 26 июля, 2017 · Жалоба ммм, неплохо, неплохо! Затестим обязательно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 31 июля, 2017 Опубликовано 31 июля, 2017 · Жалоба Пример из первого сообщения. STM8 Series 3.10.1 Как то так И даже вот так Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться