29.01.2014, 23:06
|
#171
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: CodeVisionAVR 2.60
![](http://www.liveinternet.ru/images/newsmiles/appl.gif)
Замечательный ответ, полностью подтверждающий высказанные ранее оценки.
__________________
There's always more than one way to skin a cat.
|
|
|
|
29.01.2014, 23:40
|
#172
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от makser1
|
Тестировал я компиляторы IAR MikroC CVAVR на выполнении FFT
|
Интересно стало. Проверил на CV и WinAVR.
как вы проверяли время выполнения? по какой методике?
Без обнуления массивов mr[],mi[] время выполнения каждый раз разное.
При предварительном обнулении массивов перед расчётом:
CV: 985 мс
GCC: 545 мс
это на частоте 8 МГц.
Не вникал в алгоритм. Соответственно вопрос: какой критерий правильности выполнения расчётов. Что должно получится в итоге.
|
|
|
|
30.01.2014, 05:59
|
#173
|
Прописка
Регистрация: 14.04.2009
Сообщений: 103
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Там проект в proteus, в цикле выполняется целочисленное 16бит fft, значение массивов данных ни как не влияет на скорость. Осциллографом смотрим порт, он изменяется с каждый раз после исполнения fft, по исходнику видно, и мне интересна скорость gcc avr.
|
|
|
|
30.01.2014, 08:35
|
#174
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от makser1
|
значение массивов данных ни как не влияет на скорость.
|
В том-то и дело. Без зануления массивов импульсы (по крайней мере на осцилографе) с разной длительностью. Причём от импульса к импульсу она в разы отличается.
Что для микроси, что для CV, что для GCC.
После зануления указанных массивов длительность импульсов остаётся постоянной.
|
|
|
|
30.01.2014, 09:54
|
#175
|
Прописка
Регистрация: 28.04.2008
Сообщений: 134
Сказал спасибо: 7
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Господа подскажите, почему данную функцию delay в VC можно организовать а вот в WinAvr она не работает. Или я что то не то делаю?
#include ‹avr\io.h›
#include ‹avr\interrupt.h›
#include ‹math.h›
#define F_CPU 8000000UL
#include ‹avr/delay.h›
void delay(int);
//********************************************
// Описание функции delay обязательно
//********************************************
void delay (int m)
{int j;
for(j=0;j‹m;j++){}
}
//*********** Конец функции Delay ************
// Timer1 output compare A interrupt service routine
//interrupt ISR(TIMER1_COMPA_vect)
ISR(TIMER1_COMPA_vect)
{
PORTD^=1;
}
int main(void)
{
DDRD = 0xFF;
PORTD = 0x00;
DDRB = 0x0F;
PORTB = 0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0‹‹ICIE1) | (0‹‹OCIE1B) | (1‹‹OCIE1A) | (0‹‹TOIE1);
TCCR1A = 0x00;
TCCR1B = 0x0A;
// Global enable interrupts
sei(); //глобально разрешаем прерывания
while (1)
{
PORTB = 0x01;
delay(100);
PORTB = 0x00;
delay(100);
}
}
|
|
|
|
30.01.2014, 10:04
|
#176
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от vgtmaster
|
Господа подскажите, почему данную функцию delay в VC можно организовать а вот в WinAvr она не работает. Или я что то не то делаю?
Код:
|
void delay (int m)
{int j;
for(j=0;j‹m;j++){}
} |
|
Потому, что WinAVR умный. Он оптимизирует программу. Смотрит, что переменная j нигде не используется, тело цикла пустое. И, скорее всего, выбрасывает весь цикл. Для этого попробуйте описать переменную j с квалификатором volatile или так:
Код:
|
void delay (int m)
{
int j;
for(j=0; j‹m; j++) {
asm volatile ("nop");
}
} |
А зачем вам самому писать такие функции?
_delay_ms(), _delay_us() вас не устраивают (для WinAVR)?
Последний раз редактировалось Godzilla82; 30.01.2014 в 10:10.
|
|
|
|
30.01.2014, 10:51
|
#177
|
Прописка
Регистрация: 28.04.2008
Сообщений: 134
Сказал спасибо: 7
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
Потому, что WinAVR умный. Он оптимизирует программу. Смотрит, что переменная j нигде не используется, тело цикла пустое. И, скорее всего, выбрасывает весь цикл. Для этого попробуйте описать переменную j с квалификатором volatile или так:
Код:
|
void delay (int m)
{
int j;
for(j=0; j‹m; j++) {
asm volatile ("nop");
}
} |
А зачем вам самому писать такие функции?
_delay_ms(), _delay_us() вас не устраивают (для WinAVR)?
|
Дело в том, что мне необходимо менять delay в динамике, например delay_ms (i); в VC работает и вопросов нет, а вот WinAvr _delay_ms(i); уже не работает, так вот, я хотел сделать свою функцию, а она оказывается не хочет работать в WinAvr почему? не знаю.
|
|
|
|
30.01.2014, 11:05
|
#178
|
Прописка
Регистрация: 28.04.2008
Сообщений: 134
Сказал спасибо: 7
Сказали Спасибо 18 раз(а) в 9 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Godzilla82 огромное вам спасибо, все получилось. Вот что значить, век живи и век учись.
|
|
|
|
30.01.2014, 12:21
|
#179
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от tempora
|
Если это мне, то поздновато - я так уже лет *дцать и делаю.
|
Нет это не Вам. Это для начинающих
|
|
|
|
30.01.2014, 13:09
|
#180
|
Почётный гражданин KAZUS.RU
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,505
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Тут целую "Войну и мир" про CV написали.
Если я понял правильно тему спора, то я тогда не понял, о чём спор.
Я сгенерил в CV минимальный проект для ATMega32 с таким кодом
Код:
|
#include ‹mega32.h›
char a;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
a++;
}
void main(void)
{
....................
while (1)
{
if (a==100) a=0;
}
} |
Компилю, получаю
Код:
|
_timer0_ovf_isr:
000048 93ea ST -Y,R30
000049 b7ef IN R30,SREG
; 0000 001D a++;
00004a 9453 INC R5
; 0000 001E }
00004b bfef OUT SREG,R30
00004c 91e9 LD R30,Y+
00004d 9518 RETI
.................................................. ...
;void main(void)
; 0000 0023 {
_main:
.................................................. ......
; 0000 008B
; 0000 008C while (1)
_0x3:
; 0000 008D {
; 0000 008E if (a==100) a=0;
000078 e6e4 LDI R30,LOW(100)
000079 15e5 CP R30,R5
00007a f409 BRNE _0x6
00007b 2455 CLR R5
; 0000 008F }
_0x6:
00007c cffb RJMP _0x3
; 0000 0090 }
_0x7:
00007d cfff RJMP _0x7 |
Меняю "char a;" на "volatile char a;"
Получаю
Код:
|
_timer0_ovf_isr:
000048 93ea ST -Y,R30
000049 b7ef IN R30,SREG
00004a 93ea ST -Y,R30
; 0000 001D a++;
00004b 91e0 0260 LDS R30,_a
00004d 5fef SUBI R30,-LOW(1)
00004e 93e0 0260 STS _a,R30
; 0000 001E }
000050 91e9 LD R30,Y+
000051 bfef OUT SREG,R30
000052 91e9 LD R30,Y+
000053 9518 RETI
.................................................. .............................
;void main(void)
; 0000 0023 {
_main:
.................................................. ..............................
; 0000 008C while (1)
_0x3:
; 0000 008D {
; 0000 008E if (a==100) a=0;
00007e 91a0 0260 LDS R26,_a
000080 36a4 CPI R26,LOW(0x64)
000081 f419 BRNE _0x6
000082 e0e0 LDI R30,LOW(0)
000083 93e0 0260 STS _a,R30
; 0000 008F }
_0x6:
000085 cff8 RJMP _0x3
; 0000 0090 }
_0x7:
000086 cfff RJMP _0x7 |
Опять убираю volataile, иду на вкладку
Project-›Configure-›C Compiler. Снимаю галочку "Automatic Global Register Allocation". Опять компилю, и получаю код asm точ-в-точ такой же, как и с "volatile".
Говорите по CV что хотите, а мне он нравится. Могучая штука, позволяет сэкономить огромное количество времени, освобождая от необходимости писать стандартные куски кода.
У меня - V2.05 .
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:17.
|
|