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

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

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

 
Опции темы

Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Непрочитано 09.07.2010, 00:46  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от Godzilla82
Ну вот и хочется посмотреть на код профессионалов при непростой пересборке этого неудачного примера под WinAVR. А также посмотреть на время выполнения "профессионального" кода
Зря обижаетесь, критика вполне справедливая. Порт должен читаться единожды, а энкодер должен опрашиваться в прерывании (ну и по мелочам еще).

Цитата:
P.S. Жду тайминги, тексты программ и прошивки
Ну, давайте бодаться:

Код:
/**************************************************  ***
Chip type           : ATtiny2313
Clock frequency     : 10,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
**************************************************  ***/

#include ‹avr/io.h›

#define PIN1    (1 ‹‹ PB4)
#define PIN2    (1 ‹‹ PB5)

unsigned char PortPrev;
unsigned char PortChanges;
unsigned char Temp;
unsigned char a = 1;
unsigned char b = 0;

volatile unsigned int count=0;

void main(void)
{
    CLKPR   = 0x80;
    CLKPR   = 0x00;
    PORTA   = 0x00;
    DDRA    = 0x00;
    PORTB   = 0x00;
    DDRB    = 0x00;
    PORTD   = 0x00;
    DDRD    = 0x01;
    TCCR0A  = 0x00;
    TCCR0B  = 0x00;
    TCNT0   = 0x00;
    OCR0A   = 0x00;
    OCR0B   = 0x00;
    TCCR1A  = 0x00;
    TCCR1B  = 0x00;
    TCNT1H  = 0x00;
    TCNT1L  = 0x00;
    ICR1H   = 0x00;
    ICR1L   = 0x00;
    OCR1AH  = 0x00;
    OCR1AL  = 0x00;
    OCR1BH  = 0x00;
    OCR1BL  = 0x00;
    GIMSK   = 0x00;
    MCUCR   = 0x00;
    TIMSK   = 0x00;
    USICR   = 0x00;
    ACSR    = 0x80;

    while (1)
    {
        PORTD = a;
        
        PortChanges = (PINB ^ PortPrev) & (PIN1 | PIN2);

        if (PortChanges)
        {
            Temp = 1;
            if (PortPrev    & PIN1) Temp += 1;
            if (PortPrev    & PIN2) Temp += 2;
            if (PortChanges & PIN1) Temp += 2;

            if (Temp & 2)   count++;
            else            count--;

            PortPrev ^= PortChanges;
        }

        PORTD = b;
    };

}
Скорость выполнения одного прохода цикла в тактах: "без изменения входов"/"с изменениями входов"
При отключенной оптимизвации -o0: 30/94
При полной оптимизации -oS: 9/33

Можно, навреное, еще ужать, но уже в ущерб наглядности (например, можно воспользоваться тем, что используются два рядом стоящих бита: 4 и 5 - и упростить работу с Temp).
Реклама:
testerplus вне форума  
Сказали "Спасибо" testerplus
Godzilla82 (09.07.2010)
Непрочитано 09.07.2010, 00:49  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

IAR v5.40:
Если убрать volatile, то естественно - видим
Код:
// 118 bytes of CODE memory (+  8 bytes shared)
//   6 bytes of DATA memory (+ 28 bytes shared)
В противном случае
Код:
// 168 bytes of CODE memory (+  4 bytes shared)
//   6 bytes of DATA memory (+ 28 bytes shared)
Текст
Код:
/**************************************************  ***
Chip type           : ATtiny2313
Clock frequency     : 10,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
**************************************************  ***/

#include ‹iotiny2313.h›
#include "inavr.h"
#include "stdio.h"
#include "stdint.h"

// Ýíêîäåð
#define ENC_P_PIN		4
#define ENC_N_PIN		5
#define ENC_PIN			PINB
#define ENC_PORT		PORTB
#define ENC_DDR			DDRB
#define ENC_P			(ENC_PIN & (1‹‹ENC_P_PIN))
#define ENC_N			(ENC_PIN & (1‹‹ENC_N_PIN))


char P4;
char P5;
char a=1;
char b=0;

volatile 
unsigned int count=0;

void main(void)
{
CLKPR=0x80;
CLKPR=0x00;

PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x01;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
USICR=0x00;
ACSR=0x80;

for( ; ; )
{
  PORTD=a;
  if (ENC_P!=P4) 
  {
                P4=ENC_P;
                if (P4!=ENC_N) count++;
                else           count--;
  }
  if (ENC_N!=P5) 
  {
                P5=ENC_N;
                if (ENC_P!=P5) count--;
                else           count++;
  }
  PORTD=b;
}
}
Вложения:
Тип файла: zip xxx.zip (490 байт, 37 просмотров)
SasaVitebsk вне форума  
Непрочитано 09.07.2010, 01:04  
testerplus
Прописка
 
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
testerplus на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от SasaVitebsk Посмотреть сообщение
...
Этот код не будет работать, т.к. сравнения (ENC_P != P5) и (ENC_N != P4) будут возвращать true, даже когда оба операнда в каждом выражении будут !=0.

Последний раз редактировалось testerplus; 09.07.2010 в 01:08.
testerplus вне форума  
Непрочитано 09.07.2010, 01:59  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Согласен.
В IAR возможно и прямое обращение к биту, аналогично CV, но я не пользую из соображений переносимости и правильного восприятия. И то что на AVR вполне безобидно, то на ARM совсем не так.

В стандарте примерно так выглядит.
Код:
/**************************************************  ***
Chip type           : ATtiny2313
Clock frequency     : 10,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
**************************************************  ***/

#include ‹iotiny2313.h›
#include "inavr.h"
#include "stdio.h"
#include "stdint.h"

// Ýíêîäåð
#define ENC_P_PIN		4
#define ENC_N_PIN		5
#define ENC_PIN			PINB
#define ENC_PORT		PORTB
#define ENC_DDR			DDRB
#define ENC_P			(ENC_PIN & (1‹‹ENC_P_PIN))
#define ENC_N			(ENC_PIN & (1‹‹ENC_N_PIN))


char P4;
char P5;
char a=1;
char b=0;

volatile 
unsigned int count=0;

void main(void)
{
CLKPR=0x80;
CLKPR=0x00;

PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x01;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
USICR=0x00;
ACSR=0x80;

for( ; ; )
{
  PORTD=a;
  if (ENC_P!=P4) 
  {
                P4=ENC_P;
                if (((P4==0)&&(ENC_N!=0))||((P4!=0)&&(ENC_N==0))) count++;
                else           count--;
  }
  if (ENC_N!=P5) 
  {
                P5=ENC_N;
                if (((P5==0)&&(ENC_P!=0))||((P5!=0)&&(ENC_P==0))) count--;
                else           count++;
  }
  PORTD=b;
}
}
Соответственно
Код:
// 176 bytes of CODE memory (+  4 bytes shared)
//   6 bytes of DATA memory (+ 28 bytes shared)
Вложения:
Тип файла: zip xxx.zip (514 байт, 39 просмотров)
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
Godzilla82 (09.07.2010)
Непрочитано 09.07.2010, 02:01  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Так а что вы хотите, если не секрет?
* Найти более красивое решение?
* Найти более быстрое решение?
* Затестить компилятор/ оптимизатор?
SasaVitebsk вне форума  
Непрочитано 09.07.2010, 02:28  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от SasaVitebsk Посмотреть сообщение
Так а что вы хотите, если не секрет?
* Найти более красивое решение?
* Найти более быстрое решение?
* Затестить компилятор/ оптимизатор?
Всё
Во-первых - найти самое быстрое. Соответственно, сравнить компиляторы. Какой компилятор при примерно одинаковом коде даст более быстрый код.

Ну и красивое решение, потому, что чем оно красивее, или, скажем, правильнее, тем более быстро оно будет выполняться.

Ну и по результатам компиляции решить для себя, каким компилятором лучше всего пользоваться.

Код, который прислал testerplus интересный. Этот же код, в CodeVision даёт 11/32 такта...

Самый быстрый вариант получился на CodeVision - 25 тактов при изменении сигналов. При абсолютно том же коде WinAVR даёт 30 тактов... Забавно, однако...

Ваш последний вариант (прошивка) неработоспособен. В симуляторе даёт одиночный импульс

Скомпилил в WinAVR c оптимизацией 3. Получилось 20/37 тактов...

Последний раз редактировалось Godzilla82; 09.07.2010 в 03:39.
Godzilla82 вне форума  
Непрочитано 13.07.2010, 01:47  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Впрямую должно выглядить так.
Код:
/**************************************************  ***
Chip type           : ATtiny2313
Clock frequency     : 10,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
**************************************************  ***/

#include ‹iotiny2313.h›
#include "inavr.h"
#include "stdio.h"
#include "stdint.h"

// Ýíêîäåð
#define ENC_P_PIN		4
#define ENC_N_PIN		5
#define ENC_PIN			PINB
#define ENC_PORT		PORTB
#define ENC_DDR			DDRB
#define ENC_P			(ENC_PIN & (1‹‹ENC_P_PIN))
#define ENC_N			(ENC_PIN & (1‹‹ENC_N_PIN))


char P4;
char P5;
char a=1;
char b=0;

volatile 
unsigned int count=0;

void main(void)
{
  char	bp,bn;
  
CLKPR=0x80;
CLKPR=0x00;

PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x01;
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
USICR=0x00;
ACSR=0x80;

for( ; ; )
{
  PORTD=a;
  bp=ENC_P==0;
  bn=ENC_N==0;
  if (bp!=P4) 
  {
                P4=bp;
                if (P4!=bn) count++;
                else           count--;
  }
  if (bn!=P5) 
  {
                P5=bn;
                if (P5!=bp) count--;
                else           count++;
  }
  PORTD=b;
}
}
// 172 bytes of CODE memory (+ 4 bytes shared)
// 6 bytes of DATA memory (+ 28 bytes shared)
Вложения:
Тип файла: zip xxx.zip (515 байт, 38 просмотров)
SasaVitebsk вне форума  
Непрочитано 13.07.2010, 19:04  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от SasaVitebsk Посмотреть сообщение
Впрямую должно выглядить так.
// 172 bytes of CODE memory (+ 4 bytes shared)
// 6 bytes of DATA memory (+ 28 bytes shared)
Да что же ваши прошивки в симуляторе не запускаются
Godzilla82 вне форума  
Непрочитано 13.07.2010, 19:28  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Ваши - тоже.
Пришлите мне объектный код (типа ubrof вашей прошивки. Я написал несколько вариантов, но интересно было бы сравнить.
SasaVitebsk вне форума  
Непрочитано 14.07.2010, 00:03  
Godzilla82
Почётный гражданин KAZUS.RUN
 
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?

Сообщение от SasaVitebsk Посмотреть сообщение
Ваши - тоже.
Пришлите мне объектный код (типа ubrof вашей прошивки.
Прикрепил всё, что есть. Это последний вариант. То есть, порт читается один раз.
В CodeVision получилось 20/28 тактов.
В WinAVR при том же коде 16/31 такт.

Это при том, что некоторые говорят, что в CodeVision всё работает медленно и печально...
Вложения:
Тип файла: rar main.winavr.rar (12.9 Кб, 50 просмотров)
Тип файла: rar main.codevision.rar (9.9 Кб, 47 просмотров)
Godzilla82 вне форума  
 
Опции темы

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

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

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


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


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