Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Закрытая тема
Опции темы
Непрочитано 05.03.2010, 06:47   #1
svv11
Временная регистрация
 
Регистрация: 20.11.2005
Сообщений: 52
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svv11 на пути к лучшему
По умолчанию Си-шный компилятор в AVR Studio меняет последовательность команд

Си-шный компилятор в AVR Studio меняет последовательность команд, как это блокировать?
Разбираясь почему нет нормального обмена с внешним АЦП просматривал дизассемблер и увидел такую вот граблю. Получалось, что чтение происходило раньше чем на пине формировался синхросигнал, хотя в Си-шном коде последовательность правильная и код линейный. Я так понимаю компилятор переставил команды, чтобы не загружать лишний раз переменную из RAM. Может есть какая либо директива которая бы локально отключала всякую компиляцию в фрагменте и компилировала как есть? Стал писать ассемблерную вставку, но на будущее хотелось бы обходиться по возможности без вставок, больно уж много всяких правил в этом В Си-шном ассемблере, до сих пор есть вопросы как правильно обращаться к переменным. Может кто подскажет где посмотреть программы с примерами, у Шпака как-то не всё понятно.
Реклама:

Последний раз редактировалось svv11; 05.03.2010 в 06:53.
svv11 вне форума  
Непрочитано 05.03.2010, 11:22   #2
Nikopol
Вид на жительство
 
Аватар для Nikopol
 
Регистрация: 05.01.2007
Адрес: Украина, г. Макеевка
Сообщений: 408
Сказал спасибо: 229
Сказали Спасибо 62 раз(а) в 52 сообщении(ях)
Nikopol на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

Напишите кусок на асме и вставьте куда надо через директиву asm. Компилятор уж точно не будет оптимизировать код.
__________________

____________________________________________
Internet Explorer - это такая программа, с помощью которой можно зайти на сайт http://opera.com и скачать себе браузер...
Nikopol вне форума  
Непрочитано 05.03.2010, 11:52   #3
svv11
Временная регистрация
 
Регистрация: 20.11.2005
Сообщений: 52
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svv11 на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

Написал на ассемблере да не пойму в чём ошибка, студия ругается.
Вот фрагмент, где тут грабли?
Код:
//---------------------------------------------------------------
unsigned short	Signal;

  asm volatile
    (
    "LDS r24,0x0708" "\n\t" /* PORTJ.IN  мл. байт АЦП   */ 
    "LDS r25,0x0728" "\n\t" /* PORTK.IN 2 ст. бита АЦП */         
    "SBI 0x15,1"     "\n\t"   /* PF1=1 (~CD)                  */
    "SBI 0x15,0"     "\n\t"   /* PF0=1 (~CD)                  */
    "STS %0,R30"     "\n\t" /* сохранить мл байт          */
    "ANDI r24,0x03"  "\n\t"
    "STS %1,r25"     "\n\t" /* сохранить 2 ст. бита       */
    :"=M" (Signal & 0x00FF), "=M" (Signal ›› 8) /* выходные операторы         */
    :"0"  (Signal & 0x00FF), "1" (Signal ›› 8)     /* входные операторы           */
    :"r24", "r25"                                            /* резервирование регистров */
    );
//------------------------------------------------------------------------
нужен аналог выражения:
Код:
	Signal = ((PORTK.IN & 0x03) ‹‹ 8) | PORTJ.IN;

Последний раз редактировалось svv11; 05.03.2010 в 11:58.
svv11 вне форума  
Непрочитано 05.03.2010, 12:31   #4
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

Выложите код и листинг. По имеющимся данным ниче конкретного сказать не могу.
_guardianangel вне форума  
Непрочитано 05.03.2010, 13:03   #5
svv11
Временная регистрация
 
Регистрация: 20.11.2005
Сообщений: 52
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svv11 на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

Сообщение от _guardianangel Посмотреть сообщение
Выложите код и листинг. По имеющимся данным ниче конкретного сказать не могу.
Код очень объёмный, а листинг не сформируется пока не будет устранена ошибка.
Лучше так поясню:
Нужно прочитать два порта и положить результат в двух байтную переменную. В старшем байте значимы только два бита, остальные биты нужно очистить.
svv11 вне форума  
Непрочитано 05.03.2010, 13:42   #6
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

Сообщение от svv11 Посмотреть сообщение
Си-шный компилятор в AVR Studio меняет последовательность команд, как это блокировать?
Сишный компилятор не будет менять последовательность команд. Это просто бред. Особенно это касается портов ввода-вывода. Все порты ввода-вывода объявлены как volatile. Соответственно компилятор не будет даже делать оптимизацию по эти операциям.
Например допустимо написать:
PORTC;
Если бы это было бы простая переменная, то компилятор просто выкинул данную строку. А в данном случае будет сгенерирована операция чтения порта С. Результат - проигнорирован.

2. AVR Studio - не компилятор. Надоело на форумах читать такую ересь. Но хоть немного интересуйтесь теорией того, с чем вы работаете. AVR Studio - это оболочка + ассемблер + симулятор-отладчик. Компилятор Си - внешний. Я так понимаю, что GNU C вы подключили.
SasaVitebsk вне форума  
Непрочитано 05.03.2010, 14:27   #7
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

Для примера набросал
Код:
#include ‹ctype.h›
#include ‹stdint.h›
#include ‹stdio.h›
#include ‹inttypes.h›
#include ‹avr/io.h›
#include ‹avr/iom16.h›


int i;

volatile int main(void)
{
	for(;;)
	{
		i = ((PINA & 0x03) ‹‹ 8) | PINB;
		PORTC = 0x02;
	}
	return(-1);
}
Листинг
Код:
tst.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         000000a0  00000000  00000000  00000074  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          00000002  00800060  000000a0  00000114  2**0
                  ALLOC
  2 .debug_aranges 00000020  00000000  00000000  00000114  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_pubnames 00000021  00000000  00000000  00000134  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   00000092  00000000  00000000  00000155  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_abbrev 00000059  00000000  00000000  000001e7  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_line   0000006d  00000000  00000000  00000240  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_frame  00000020  00000000  00000000  000002b0  2**2
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_str    00000065  00000000  00000000  000002d0  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 ‹__vectors›:
   0:	0c 94 2a 00 	jmp	0x54	; 0x54 ‹__ctors_end›
   4:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
   8:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
   c:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  10:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  14:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  18:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  1c:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  20:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  24:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  28:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  2c:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  30:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  34:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  38:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  3c:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  40:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  44:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  48:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  4c:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›
  50:	0c 94 47 00 	jmp	0x8e	; 0x8e ‹__bad_interrupt›

00000054 ‹__ctors_end›:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d4 e0       	ldi	r29, 0x04	; 4
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 ‹__do_copy_data›:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	e0 ea       	ldi	r30, 0xA0	; 160
  68:	f0 e0       	ldi	r31, 0x00	; 0
  6a:	02 c0       	rjmp	.+4      	; 0x70 ‹.do_copy_data_start›

0000006c ‹.do_copy_data_loop›:
  6c:	05 90       	lpm	r0, Z+
  6e:	0d 92       	st	X+, r0

00000070 ‹.do_copy_data_start›:
  70:	a0 36       	cpi	r26, 0x60	; 96
  72:	b1 07       	cpc	r27, r17
  74:	d9 f7       	brne	.-10     	; 0x6c ‹.do_copy_data_loop›

00000076 ‹__do_clear_bss›:
  76:	10 e0       	ldi	r17, 0x00	; 0
  78:	a0 e6       	ldi	r26, 0x60	; 96
  7a:	b0 e0       	ldi	r27, 0x00	; 0
  7c:	01 c0       	rjmp	.+2      	; 0x80 ‹.do_clear_bss_start›

0000007e ‹.do_clear_bss_loop›:
  7e:	1d 92       	st	X+, r1

00000080 ‹.do_clear_bss_start›:
  80:	a2 36       	cpi	r26, 0x62	; 98
  82:	b1 07       	cpc	r27, r17
  84:	e1 f7       	brne	.-8      	; 0x7e ‹.do_clear_bss_loop›
  86:	0e 94 49 00 	call	0x92	; 0x92 ‹main›
  8a:	0c 94 4e 00 	jmp	0x9c	; 0x9c ‹_exit›

0000008e ‹__bad_interrupt›:
  8e:	0c 94 00 00 	jmp	0	; 0x0 ‹__vectors›

00000092 ‹main›:


int i;

volatile int main(void)
{
  92:	82 e0       	ldi	r24, 0x02	; 2
	for(;;)
	{
		i = ((PINA & 0x03) ‹‹ 8) | PINB;
  94:	99 b3       	in	r25, 0x19	; 25
  96:	96 b3       	in	r25, 0x16	; 22
		PORTC = 0x02;
  98:	85 bb       	out	0x15, r24	; 21
  9a:	fc cf       	rjmp	.-8      	; 0x94 ‹main+0x2›

0000009c ‹_exit›:
  9c:	f8 94       	cli

0000009e ‹__stop_program›:
  9e:	ff cf       	rjmp	.-2      	; 0x9e ‹__stop_program›
Вродь все правильно

Последний раз редактировалось _guardianangel; 05.03.2010 в 17:47.
_guardianangel вне форума  
Непрочитано 05.03.2010, 17:14   #8
svv11
Временная регистрация
 
Регистрация: 20.11.2005
Сообщений: 52
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svv11 на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

Сообщение от SasaVitebsk Посмотреть сообщение
Сишный компилятор не будет менять последовательность команд. Это просто бред. Особенно это касается портов ввода-вывода. Все порты ввода-вывода объявлены как volatile. Соответственно компилятор не будет даже делать оптимизацию по эти операциям.
Например допустимо написать:
PORTC;
Если бы это было бы простая переменная, то компилятор просто выкинул данную строку. А в данном случае будет сгенерирована операция чтения порта С. Результат - проигнорирован.
Код пишется для ATxmega128A1, порты к которым идёт обращения настроенны как виртуальные и обращение к ним идёт как к регистрам с младшими адресами - командами за 1 такт, кампилятор и не знает что это порты. Что меняет местами не сомневайтесь, я внимательно проверял.


Сообщение от SasaVitebsk Посмотреть сообщение
2. AVR Studio - не компилятор. Надоело на форумах читать такую ересь. Но хоть немного интересуйтесь теорией того, с чем вы работаете. AVR Studio - это оболочка + ассемблер + симулятор-отладчик. Компилятор Си - внешний. Я так понимаю, что GNU C вы подключили.
Конечно я прекрасно понимаю, что компилятором является подключёный к студии GCC и согласен что выразился не корректно, но это для укрочения писанины, да и боялся перепутать (на работе Xmega дома PIC), поэтоме не стоит так "разорятся". Но несмотря на агресивное выступление, всё же есть за что сказать спасибо: натолкнули на мысль объявить некоторые регистры конфигурации виртуальных портов как volatile. Но это уже не в этом проекте. Всё равно прийдётся наверно воспользоваться ассемблером чтобы работал быстрей.

Последний раз редактировалось svv11; 05.03.2010 в 17:50.
svv11 вне форума  
Непрочитано 05.03.2010, 17:34   #9
svv11
Временная регистрация
 
Регистрация: 20.11.2005
Сообщений: 52
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svv11 на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

guardianangel а как бы тегами code воспользоваться, а то теряюсь в догадках, что за глазастыми смайликами спрятано. Можно наверное отредактировать то что уже выложено.

Последний раз редактировалось svv11; 05.03.2010 в 17:38.
svv11 вне форума  
Непрочитано 05.03.2010, 18:02   #10
svv11
Временная регистрация
 
Регистрация: 20.11.2005
Сообщений: 52
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svv11 на пути к лучшему
По умолчанию Re: Си-шный компилятор в AVR Studio меняет последовательность команд

А не подкинет ли кто примерчик на ассемблере c синтаксисом для GCC WinAVR, или просто укажите ошибку в том фрагменте что я в начале выложил.?

Последний раз редактировалось svv11; 05.03.2010 в 21:53.
svv11 вне форума  
Закрытая тема

Закладки


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прерывания usart в avr studio 4.13 zubr_ Микроконтроллеры, АЦП, память и т.д 6 14.10.2009 18:33
AVR studio и GCC Nifelheim Микроконтроллеры, АЦП, память и т.д 12 26.09.2009 23:33


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot