Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

CodeVisionAVR 2.60

Непрочитано 31.01.2014, 08:19  
winner_07
Прохожий
 
Регистрация: 03.05.2007
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
winner_07 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Ребята, есть у кого CV 2.05.6 c таблеткой?
Скиньте приззз на мыло [email protected]
Реклама:
winner_07 вне форума  
Непрочитано 31.01.2014, 09:52  
Romsb
Частый гость
 
Регистрация: 14.02.2010
Адрес: Казахстан, Алмата.
Сообщений: 32
Сказал спасибо: 67
Сказали Спасибо 18 раз(а) в 10 сообщении(ях)
Romsb на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от winner_07 Посмотреть сообщение
Ребята, есть у кого CV 2.05.6 c таблеткой?
Скиньте приззз на мыло [email protected]
И мне тоже пожалуйста, если можно [email protected]
Romsb вне форума  
Непрочитано 31.01.2014, 11:46  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию 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)? Что хорошо в ПК, не всегда хорошо в МК. Я бы не поленился конкретно в этом случае константу вбить, и фиг с ней, с универсальностью кода. Но тогда бы не обнаружил этот баг.
olc0267 вне форума  
Непрочитано 31.01.2014, 11:51  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от olc0267 Посмотреть сообщение
Тогда почему так много страниц наплодили по поводу volatile?
Я всего лишь хотел показать, что в опциях компилятора можно включить или выключить необходимость применения volatile.
Вот видите, Godzilla82 как люди уже интерпретируют... ))

2 olc0267:
1. Нельзя включать или выключать volatile. Так как это квалификатор памяти определённый стандартом языка Си. И CV не делает то, что вы ему прописываете.
2. Вы включаете/ выключаете размещение глобальных переменных в регистрах. Это не имеет ни малейшего отношения к volatile. А ввиду малости свободных регистров в процессоре, то вообще существенно не влияет на производительность в сколь-нибудь сложном проекте.
SasaVitebsk вне форума  
Непрочитано 31.01.2014, 12:02  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от SasaVitebsk Посмотреть сообщение
Вот видите, Godzilla82 как люди уже интерпретируют... ))


2. Вы включаете/ выключаете размещение глобальных переменных в регистрах. Это не имеет ни малейшего отношения к volatile.
Это я понимаю. Но применительно к МК AVR, всё, что делает volatile при объявлении глобальной переменной - запрещает её размещение в регистрах. И не более того. Тоже самое я могу сделать щелчком мыши сразу для всех переменных, и не париться на эту тему. Два способа получения одного результата.
olc0267 вне форума  
Непрочитано 31.01.2014, 13:00  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от olc0267 Посмотреть сообщение
Но применительно к МК AVR, всё, что делает volatile при объявлении глобальной переменной - запрещает её размещение в регистрах.
Этот квалификатор - всего лишь "инструкция" компилятору НИЧЕГО НЕ ВЫТВОРЯТЬ с переменной. Где бы она ни находилась. volatile и размещение переменных - разные вещи. Побольше доверяйте компилятору и поменьше заглядывайте, куда чего он размещает. Компиляторы умнее нас, правда им иногда трудно объяснить, что же мы хотим от них. Особенно, если сами этого не знаем.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 31.01.2014, 14:13  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию 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 и с ним.
SasaVitebsk вне форума  
Непрочитано 31.01.2014, 14:49  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию 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. Какой из компиляторов умнее?
olc0267 вне форума  
Непрочитано 31.01.2014, 14:53  
olc0267
Почётный гражданин KAZUS.RUN
 
Регистрация: 06.08.2008
Адрес: Ярославль
Сообщений: 1,504
Сказал спасибо: 115
Сказали Спасибо 1,314 раз(а) в 548 сообщении(ях)
olc0267 на пути к лучшему
По умолчанию Re: CodeVisionAVR 2.60

Сообщение от SasaVitebsk Посмотреть сообщение
В том то и дело, что непонимаете.
Переменная расположенная в регистрах, как раз не требует применения volatile. )) Причина в том, что не требуется пересылка.
Не понял логики. Вроде бы причинно-следственная связь нарушена. Всё наоборот - если я применил volatile, то переменная не попадёт в регистр, если не применил - попадёт.
Ну да ладно. Как говорил один мой знакомый фотограф, "вам, большим фотохудожникам виднее".

Последний раз редактировалось olc0267; 31.01.2014 в 15:08.
olc0267 вне форума  
Непрочитано 31.01.2014, 15:00  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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.
Godzilla82 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CodeVisionAVR selevo Embedd С 11 26.02.2016 22:16
SD и CodeVisionAvr 2.04.4a sersne Микроконтроллеры, АЦП, память и т.д 29 24.03.2010 18:39
CodeVisionAVR V2.03.2 dimonbest Микроконтроллеры, АЦП, память и т.д 253 29.09.2009 22:37
New CodeVisionAVR 1.25.8 dimonbest Микроконтроллеры, АЦП, память и т.д 15 07.02.2008 12:56
Help CodeVisionAVR Serg79 Микроконтроллеры, АЦП, память и т.д 3 15.12.2005 23:32


Часовой пояс GMT +4, время: 16:38.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.