25.02.2013, 01:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: IAR Embedded Workbench
gary2007, я конечно понимаю, что по-английски Вам не очень удобно, но в данном случае оно того стоит - Mastering stack and heap for system reliability - очень рекомендую!
__________________
There's always more than one way to skin a cat.
|
|
|
Сказали "Спасибо" tempora
|
|
|
25.02.2013, 02:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Спасибо, изучим.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
25.02.2013, 11:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от SasaVitebsk
|
Например умножение long long чисел займёт десятки тактов, а умножение double тысячи либо десятки тысяч. Для 8-битного контроллера ....
|
long long = это 8 байт умножить на 8 байт,
а double - 7 байт мантиссы на 7 байт мантиссы (тем более мантисса всегда нормализованная) - так что откуда там тысячи и десятки тысяч тактов? Даже если нет аппартного умножения байт на байт, то все гораздо быстрее работает.
Не пугайте людей !!!.
|
|
|
|
25.02.2013, 22:54
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от Boba_spb
|
Не пугайте людей !!!.
|
провёл исследование мелкое ... ![Очень смешно](images/smilies/icon_veryhappy.gif)
double * ~ 1576 тактов
double / ~ 1783 тактов
long long int * ~ 1272 такта
long long int / ~ 1645 такта
Любопытно что на двух процах сделал: atmega168 и at90s4414.
Как известно, последний аппаратно умножать неумеет ... Результаты почти идентичные IAR AVR 6.12.1. Честно говоря последнее слегка удивляет.
Иными словами, вы оказались правы ...
|
|
|
|
25.02.2013, 23:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
Уж что то многовато, хотя ... Если на СИ писали эту арифметику, а не АСМе, да исчо студенту дали в качестве контрольной, то все может быть.
|
|
|
|
25.02.2013, 23:37
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Я ж не идиот на ASM писать и так времени в обрез ... ) На си там ровно 3 строчки в тесте было. ) Даже студенту трудно ошибиться ... )) Разве что volatile не поставил бы ... ))
|
|
|
|
25.02.2013, 23:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
Я имел ввиду-компилятор как разворачивает всю эту арифметику.
Когда то давно пришлось писать float для MCS51 - ибо библиотеки были исчо те.
|
|
|
|
26.02.2013, 00:16
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Да успокойтесь вы за компилятор волноваться ... Сейчас специально для вас взял фильтр движения свой... Он у меня на ASM написан, так как в прерывании и 6 двигателей на 5 кгц... Там ШИМ и АЦП фиьтрация АЦП фильтрация движения с дроблением шага ... + can, ну короче трохи напряжно ... А некоторые прерывания короткие ... синус вблизи максимумов ... короче напряжно ... Ну и написал ... Сейчас сделал обратный реверс (честно говоря не проверял на правильность) и сделал компиляцию ... Полюбуйтесь ...
Вот я ... возился ...
Код:
|
PUBLIC iir8
#define wl r16
#define wh r17
#define dl r18
#define dh r19
#define iter r20
#define ZH r31
#define ZL r30
RSEG CODE
// Расчёт фильтра IIR iter звеньев
// int16_t iir8(int16_t *filtr, uint8_t iter);
iir8:
movw ZH:ZL,wh:wl ; Занесли адрес начала в Z
mov iter,dl ; Загрузили число итераций фильтра
ld wl,Z+ ; Загрузили рабочее число
ld wh,Z+
iir8_с:
ld dl,Z ; Загрузили следующее число
ldd dh,Z+1
sub wl,dl ; вычли
sbc wh,dh
asr wh ; поделили на 2
ror wl
asr wh ; поделили на 4
ror wl
add wl,dl ; прибавили
adc wh,dh
st Z+,wl ; сохранили
st Z+,wh
dec iter ; следующая итерация
brne iir8_с ; если не все итерации, то повторить
sub wl,dl ; нашли микростеп и вернули его
sbc wh,dh
ret
END |
Ну вот вам компилятор
Код:
|
################################################## #############################
# #
# 25/Feb/2013 22:04:48 #
# IAR Atmel AVR C/C++ Compiler V5.10A/W32, Evaluation Version #
# Copyright 1996-2008 IAR Systems. All rights reserved. #
# #
# Source file = D:\work\AVR IAR C\Traktor\kd8096m\filtr_iir8.c #
# Command line = "D:\work\AVR IAR C\Traktor\kd8096m\filtr_iir8.c" #
# --cpu=can128 -ms -o "D:\work\AVR IAR #
# C\Traktor\kd8096m\Debug\Obj\" -lCN "D:\work\AVR IAR #
# C\Traktor\kd8096m\Debug\List\" -y #
# --initializers_in_flash -s9 --no_cross_call --debug #
# -DENABLE_BIT_DEFINITIONS --do_cross_call -e -I #
# "C:\Program Files\IAR Systems\Embedded Workbench 5.0 #
# Evaluation\avr\INC\" -I "C:\Program Files\IAR #
# Systems\Embedded Workbench 5.0 #
# Evaluation\avr\INC\CLIB\" --eeprom_size 4096 #
# --lock_regs=7 #
# List file = D:\work\AVR IAR C\Traktor\kd8096m\Debug\List\filtr_iir8. #
# lst #
# Object file = D:\work\AVR IAR C\Traktor\kd8096m\Debug\Obj\filtr_iir8.r #
# 90 #
# #
# #
################################################## #############################
D:\work\AVR IAR C\Traktor\kd8096m\filtr_iir8.c
1 #include "inavr.h"
2 #include "stdint.h"
3
\ In segment CODE, align 2, keep-with-next
4 uint16_t iir8(uint16_t *data, uint8_t iter)
\ iir8:
5 {
6 int16_t w, d;
7
8 w = *data++;
\ 00000000 01F8 MOVW R31:R30, R17:R16
\ 00000002 9141 LD R20, Z+
\ 00000004 9151 LD R21, Z+
9 for(; iter==0; iter--)
\ 00000006 2322 TST R18
\ 00000008 F461 BRNE ??iir8_0
10 {
11 d = *data;
\ 0000000A 8160 LD R22, Z
\ 0000000C 8171 LDD R23, Z+1
12 w -= d;
13 w ››= 2;
14 w += d;
\ 0000000E 1B46 SUB R20, R22
\ 00000010 0B57 SBC R21, R23
\ 00000012 9555 ASR R21
\ 00000014 9547 ROR R20
\ 00000016 9555 ASR R21
\ 00000018 9547 ROR R20
\ 0000001A 0F46 ADD R20, R22
\ 0000001C 1F57 ADC R21, R23
15 *data++ = w;
\ 0000001E 8340 ST Z, R20
\ 00000020 8351 STD Z+1, R21
16 }
17 w -= d;
18 return(w);
\ ??iir8_0:
\ 00000022 1B46 SUB R20, R22
\ 00000024 0B57 SBC R21, R23
\ 00000026 018A MOVW R17:R16, R21:R20
\ 00000028 9508 RET
19 };
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
iir8 0 2
Segment part sizes:
Function/Label Bytes
-------------- -----
iir8 42
42 bytes in segment CODE
42 bytes of CODE memory
Errors: none
Warnings: none |
|
|
|
|
26.02.2013, 00:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
У меня на меге8 такая строчка :
cnt_ovf =TCNT1 + corr_L * cnt_cmp + cnt_ovf * 65536;
выполняется за 996 тактов.
cnt_cmp, cnt_ovf переменные unsigned long long int
Код, страшно смотреть
PHP код:
|
453 //подсчет суммарных тиков за весь период
454 cnt_ovf =TCNT1 + corr_L * cnt_cmp + cnt_ovf * 65536;
\ 00000032 9100.... LDS R16, corr_L
\ 00000036 9110.... LDS R17, (corr_L + 1)
\ 0000003A E020 LDI R18, 0
\ 0000003C E030 LDI R19, 0
\ 0000003E E040 LDI R20, 0
\ 00000040 E050 LDI R21, 0
\ 00000042 E060 LDI R22, 0
\ 00000044 E070 LDI R23, 0
\ 00000046 .... LDI R26, LOW(cnt_cmp)
\ 00000048 .... LDI R27, (cnt_cmp) ›› 8
\ 0000004A .... RCALL ?LL_MUL_L12
\ 0000004C 8708 STD Y+8, R16
\ 0000004E 8719 STD Y+9, R17
\ 00000050 872A STD Y+10, R18
\ 00000052 873B STD Y+11, R19
\ 00000054 874C STD Y+12, R20
\ 00000056 875D STD Y+13, R21
\ 00000058 876E STD Y+14, R22
\ 0000005A 877F STD Y+15, R23
\ 0000005C .... LDI R30, LOW(cnt_ovf)
\ 0000005E .... LDI R31, (cnt_ovf) ›› 8
\ 00000060 8100 LD R16, Z
\ 00000062 8111 LDD R17, Z+1
\ 00000064 8122 LDD R18, Z+2
\ 00000066 8133 LDD R19, Z+3
\ 00000068 8144 LDD R20, Z+4
\ 0000006A 8155 LDD R21, Z+5
\ 0000006C 8166 LDD R22, Z+6
\ 0000006E 8177 LDD R23, Z+7
\ 00000070 .... LDI R26, LOW(__Constant_10000_0)
\ 00000072 .... LDI R27, (__Constant_10000_0) ›› 8
\ 00000074 .... RCALL ?LL_MUL_L12
\ 00000076 8308 ST Y, R16
\ 00000078 8319 STD Y+1, R17
\ 0000007A 832A STD Y+2, R18
\ 0000007C 833B STD Y+3, R19
\ 0000007E 834C STD Y+4, R20
\ 00000080 835D STD Y+5, R21
\ 00000082 836E STD Y+6, R22
\ 00000084 837F STD Y+7, R23
\ 00000086 B50C IN R16, 0x2C
\ 00000088 B51D IN R17, 0x2D
\ 0000008A E020 LDI R18, 0
\ 0000008C E030 LDI R19, 0
\ 0000008E E040 LDI R20, 0
\ 00000090 E050 LDI R21, 0
\ 00000092 E060 LDI R22, 0
\ 00000094 E070 LDI R23, 0
\ 00000096 01FE MOVW R31:R30, R29:R28
\ 00000098 9638 ADIW R31:R30, 8
\ 0000009A .... RCALL ?LL_ADD_L12
\ 0000009C 01FE MOVW R31:R30, R29:R28
\ 0000009E .... RCALL ?LL_ADD_L12
\ 000000A0 .... LDI R30, LOW(cnt_ovf)
\ 000000A2 .... LDI R31, (cnt_ovf) ›› 8
\ 000000A4 8300 ST Z, R16
\ 000000A6 8311 STD Z+1, R17
\ 000000A8 8322 STD Z+2, R18
\ 000000AA 8333 STD Z+3, R19
\ 000000AC 8344 STD Z+4, R20
\ 000000AE 8355 STD Z+5, R21
\ 000000B0 8366 STD Z+6, R22
\ 000000B2 8377 STD Z+7, R23
|
__________________
Мелочи не решают главного. Они решают всё!
Последний раз редактировалось gary2007; 26.02.2013 в 00:26.
|
|
|
|
26.02.2013, 00:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от gary2007
|
У меня на меге8 такая строчка :
"cnt_ovf =TCNT1 + ... + cnt_ovf * 65536;" выполняется за 996 тактов.
|
А зачем же умножать на 65636?! 65'536 это же то же самое, что и 0x10000 или 0b1'00000000'00000000, тут умножение вообще незачем.
__________________
There's always more than one way to skin a cat.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подниму тему WinAVR vs IAR
|
oleg110592 |
Микроконтроллеры, АЦП, память и т.д |
5 |
24.10.2015 14:06 |
Часовой пояс GMT +4, время: 09:40.
|
|