CodeVisionAVR 2.60
31.01.2014, 08:19
|
|
|
Прохожий
Регистрация: 03.05.2007
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Ребята, есть у кого CV 2.05.6 c таблеткой?
Скиньте приззз на мыло [email protected]
|
|
|
|
31.01.2014, 09:52
|
|
|
Частый гость
Регистрация: 14.02.2010
Адрес: Казахстан, Алмата.
Сообщений: 32
Сказал спасибо: 67
Сказали Спасибо 18 раз(а) в 10 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от winner_07
|
Ребята, есть у кого CV 2.05.6 c таблеткой?
Скиньте приззз на мыло [email protected]
|
И мне тоже пожалуйста, если можно [email protected]
|
|
|
|
31.01.2014, 11:46
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от Godzilla82
|
В CV 2.6 (да и в 2.0.3) приведённый вами код работает корректно.
Так что фигню пишите вы.
|
Дело не в printf. tempora намекал, что sizeof() в CV работает некорректно.
Судя по тому что sizeof(xlattable)/sizeof(*xlattable) получилось равным единице, в обоих случаях функция вернула какую-то одинаковую фигню. Фигня поделилась на себя же и получилась 1.
Но, судя по тому, что у Вас всё заработало нормально в версии 2.0.3, то баг этот уже несколько лет как пофиксен.
tempora ведь не говорит, какая у него версия CV. Или говорил где-то?
Интересно, какой объём памяти занимает такая конструкция - sizeof(xlattable)/sizeof(*xlattable)? Что хорошо в ПК, не всегда хорошо в МК. Я бы не поленился конкретно в этом случае константу вбить, и фиг с ней, с универсальностью кода. Но тогда бы не обнаружил этот баг.
|
|
|
|
31.01.2014, 11:51
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
Тогда почему так много страниц наплодили по поводу volatile?
Я всего лишь хотел показать, что в опциях компилятора можно включить или выключить необходимость применения volatile.
|
Вот видите, Godzilla82 как люди уже интерпретируют... ))
2 olc0267:
1. Нельзя включать или выключать volatile. Так как это квалификатор памяти определённый стандартом языка Си. И CV не делает то, что вы ему прописываете.
2. Вы включаете/ выключаете размещение глобальных переменных в регистрах. Это не имеет ни малейшего отношения к volatile. А ввиду малости свободных регистров в процессоре, то вообще существенно не влияет на производительность в сколь-нибудь сложном проекте.
|
|
|
|
31.01.2014, 12:02
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
Вот видите, Godzilla82 как люди уже интерпретируют... ))
2. Вы включаете/ выключаете размещение глобальных переменных в регистрах. Это не имеет ни малейшего отношения к volatile.
|
Это я понимаю. Но применительно к МК AVR, всё, что делает volatile при объявлении глобальной переменной - запрещает её размещение в регистрах. И не более того. Тоже самое я могу сделать щелчком мыши сразу для всех переменных, и не париться на эту тему. Два способа получения одного результата.
|
|
|
|
31.01.2014, 13:00
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: CodeVisionAVR 2.60
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
31.01.2014, 14:13
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от olc0267
|
|
Это я понимаю.
|
В том то и дело, что непонимаете.
Переменная расположенная в регистрах, как раз не требует применения volatile. )) Причина в том, что не требуется пересылка.
Godzilla82 давайте попробуем чуть чуть изменить ваш тестовый проект.
Разместим ваши переменные в памяти, а в голове изобразим это.
|
Код:
|
for(;;)
{
if(a == 100) PINA |= 1;
b = 2000;
b += PINA;
for(char i=0; i‹200; i++)
{
if(b › TCNT1)
{
PINA |= 2;
break;
}
}
if(c == 75) PINA |= 4;
if(d == 1) PINA |= 8;
} |
Дайте мне пожалуйста листинг откомпиленной проги только для головы если b объявлена без volatile и с ним.
|
|
|
|
31.01.2014, 14:49
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от ut1wpr
|
Компиляторы умнее нас, правда им иногда трудно объяснить, что же мы хотим от них. Особенно, если сами этого не знаем.
|
Признак искусственного интеллекта - умение угадать, чего хочет человек.
Маленький тест. Берём последнюю версию Atmel Studio - 6.1. Только сегодня с оф. сайта скачал.
Пишем два варианта кода.
|
Код:
|
#include ‹avr/io.h›
void del ( int volatile a)
{
while (a) --a;
}
int main(void)
{
while(1)
del(100);
} |
и
|
Код:
|
#include ‹avr/io.h›
void del ( int a)
{
while (a) --a;
}
int main(void)
{
while(1)
del(100);
} |
Вроде бы всем понятно, что я хочу сделать, никому объяснять, наверное, не надо.
Смотрим, как откомпилил Atmel Studio.
1-й вариант.
|
Код:
|
#include ‹avr/io.h›
void del ( int volatile a)
{
6c: cf 93 push r28
6e: df 93 push r29
70: 00 d0 rcall .+0 ; 0x72 ‹del+0x6›
72: cd b7 in r28, 0x3d ; 61
74: de b7 in r29, 0x3e ; 62
76: 9a 83 std Y+2, r25 ; 0x02
78: 89 83 std Y+1, r24 ; 0x01
while (a) --a;
7a: 89 81 ldd r24, Y+1 ; 0x01
7c: 9a 81 ldd r25, Y+2 ; 0x02
7e: 89 2b or r24, r25
80: 49 f0 breq .+18 ; 0x94 ‹del+0x28›
82: 89 81 ldd r24, Y+1 ; 0x01
84: 9a 81 ldd r25, Y+2 ; 0x02
86: 01 97 sbiw r24, 0x01 ; 1
88: 9a 83 std Y+2, r25 ; 0x02
8a: 89 83 std Y+1, r24 ; 0x01
8c: 89 81 ldd r24, Y+1 ; 0x01
8e: 9a 81 ldd r25, Y+2 ; 0x02
90: 89 2b or r24, r25
92: b9 f7 brne .-18 ; 0x82 ‹del+0x16›
}
94: 0f 90 pop r0
96: 0f 90 pop r0
98: df 91 pop r29
9a: cf 91 pop r28
9c: 08 95 ret
0000009e ‹main›:
int main(void)
{
while(1)
del(100);
9e: 84 e6 ldi r24, 0x64 ; 100
a0: 90 e0 ldi r25, 0x00 ; 0
a2: 0e 94 36 00 call 0x6c ; 0x6c ‹del›
a6: fb cf rjmp .-10 ; 0x9e ‹main›
000000a8 ‹_exit›:
a8: f8 94 cli
000000aa ‹__stop_program›:
aa: ff cf rjmp .-2 ; 0xaa ‹__stop_program› |
и 2-й вариант.
|
Код:
|
0000006c ‹main›:
{
while (a) a--;
}
int main(void)
{
6c: ff cf rjmp .-2 ; 0x6c ‹main›
0000006e ‹_exit›:
6e: f8 94 cli
00000070 ‹__stop_program›:
70: ff cf rjmp .-2 ; 0x70 ‹__stop_program› |
Здесь он вообще всё похерил, и не стал ничего делать.
А вот что сделал CV для обоих вариантов абсолютно одинаково
|
Код:
|
;void del ( int a)
; 0000 0029 {
_del:
; 0000 002A while (a) a--;
; a -› Y+0
_0x3:
000049 81e8 LD R30,Y
00004a 81f9 LDD R31,Y+1
00004b 9730 SBIW R30,0
00004c f021 BREQ _0x5
00004d 9731 SBIW R30,1
00004e 83e8 ST Y,R30
00004f 83f9 STD Y+1,R31
000050 cff8 RJMP _0x3
_0x5:
; 0000 002B }
000051 9622 ADIW R28,2
000052 9508 RET
......
; 0000 009D while(1)
_0x6:
; 0000 009E del(100);
000080 e6e4 LDI R30,LOW(100)
000081 e0f0 LDI R31,HIGH(100)
000082 93fa ST -Y,R31
000083 93ea ST -Y,R30
000084 dfc4 RCALL _del
000085 cffa RJMP _0x6
; 0000 009F }
_0x9:
000086 cfff RJMP _0x9 |
Теперь два вопроса :
1. Почему CV не только смог догадаться, чего я хочу, но и сделал это более рационально?
2. Какой из компиляторов умнее?
|
|
|
|
31.01.2014, 14:53
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
В том то и дело, что непонимаете.
Переменная расположенная в регистрах, как раз не требует применения volatile. )) Причина в том, что не требуется пересылка.
|
Не понял логики. Вроде бы причинно-следственная связь нарушена. Всё наоборот - если я применил volatile, то переменная не попадёт в регистр, если не применил - попадёт.
Ну да ладно. Как говорил один мой знакомый фотограф, "вам, большим фотохудожникам виднее".
Последний раз редактировалось olc0267; 31.01.2014 в 15:08.
|
|
|
|
31.01.2014, 15:00
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: CodeVisionAVR 2.60
Сообщение от SasaVitebsk
|
|
Дайте мне пожалуйста листинг откомпиленной проги только для головы если b объявлена без volatile и с ним.
|
int a,b,c,d:
|
Код:
|
;for(;;)
_0x4:
;if(a == 100) PINA |= 1;
LDI R30,LOW(100)
LDI R31,HIGH(100)
CP R30,R4
CPC R31,R5
BRNE _0x6
SBI 0x19,0
;b = 2000;
_0x6:
LDI R30,LOW(2000)
LDI R31,HIGH(2000)
MOVW R6,R30
;b += PINA;
IN R30,0x19
LDI R31,0
ADD R6,R30
ADC R7,R31
;for(i=0; i‹200; i++) {
LDI R17,LOW(0)
_0x8:
CPI R17,200
BRSH _0x9
;if(b › TCNT1) {
IN R30,0x2C
IN R31,0x2C+1
CP R30,R6
CPC R31,R7
BRSH _0xA
;PINA |= 2;
SBI 0x19,1
;break;
RJMP _0x9
;}
_0xA:
SUBI R17,-1
RJMP _0x8
_0x9:
;if(c == 75) PINA |= 4;
LDI R30,LOW(75)
LDI R31,HIGH(75)
CP R30,R8
CPC R31,R9
BRNE _0xB
SBI 0x19,2
;if(d == 1) PINA |= 8;
_0xB:
LDI R30,LOW(1)
LDI R31,HIGH(1)
CP R30,R10
CPC R31,R11
BRNE _0xC
SBI 0x19,3
;}
_0xC:
RJMP _0x4 |
volatile int a,b,c,d:
|
Код:
|
;for(;;)
_0x4:
;{
;if(a == 100) PINA |= 1;
LDS R26,_a
LDS R27,_a+1
CPI R26,LOW(0x64)
LDI R30,HIGH(0x64)
CPC R27,R30
BRNE _0x6
SBI 0x19,0
;b = 2000;
_0x6:
LDI R30,LOW(2000)
LDI R31,HIGH(2000)
STS _b,R30
STS _b+1,R31
;b += PINA;
IN R30,0x19
LDS R26,_b
LDS R27,_b+1
LDI R31,0
ADD R30,R26
ADC R31,R27
STS _b,R30
STS _b+1,R31
;for(i=0; i‹200; i++) {
LDI R17,LOW(0)
_0x8:
CPI R17,200
BRSH _0x9
;if(b › TCNT1) {
IN R30,0x2C
IN R31,0x2C+1
LDS R26,_b
LDS R27,_b+1
CP R30,R26
CPC R31,R27
BRSH _0xA
;PINA |= 2;
SBI 0x19,1
;break;
RJMP _0x9
;}
;}
_0xA:
SUBI R17,-1
RJMP _0x8
_0x9:
;if(c == 75) PINA |= 4;
LDS R26,_c
LDS R27,_c+1
CPI R26,LOW(0x4B)
LDI R30,HIGH(0x4B)
CPC R27,R30
BRNE _0xB
SBI 0x19,2
;if(d == 1) PINA |= 8;
_0xB:
LDS R26,_d
LDS R27,_d+1
SBIW R26,1
BRNE _0xC
SBI 0x19,3
;}
_0xC:
RJMP _0x4 |
int a,c,d;
volatile int b;
|
Код:
|
;for(;;)
_0x4:
;{
;if(a == 100) PINA |= 1;
LDI R30,LOW(100)
LDI R31,HIGH(100)
CP R30,R4
CPC R31,R5
BRNE _0x6
SBI 0x19,0
;b = 2000;
_0x6:
LDI R30,LOW(2000)
LDI R31,HIGH(2000)
STS _b,R30
STS _b+1,R31
;b += PINA;
IN R30,0x19
LDS R26,_b
LDS R27,_b+1
LDI R31,0
ADD R30,R26
ADC R31,R27
STS _b,R30
STS _b+1,R31
;for(i=0; i‹200; i++) {
LDI R17,LOW(0)
_0x8:
CPI R17,200
BRSH _0x9
;if(b › TCNT1) {
IN R30,0x2C
IN R31,0x2C+1
LDS R26,_b
LDS R27,_b+1
CP R30,R26
CPC R31,R27
BRSH _0xA
;PINA |= 2;
SBI 0x19,1
;break;
RJMP _0x9
;}
;}
_0xA:
SUBI R17,-1
RJMP _0x8
_0x9:
;if(c == 75) PINA |= 4;
LDI R30,LOW(75)
LDI R31,HIGH(75)
CP R30,R6
CPC R31,R7
BRNE _0xB
SBI 0x19,2
;if(d == 1) PINA |= 8;
_0xB:
LDI R30,LOW(1)
LDI R31,HIGH(1)
CP R30,R8
CPC R31,R9
BRNE _0xC
SBI 0x19,3
;}
_0xC:
RJMP _0x4 |
Последний раз редактировалось Godzilla82; 31.01.2014 в 15:05.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:38.
|
|