| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
09.07.2010, 00:46
|
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
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
|
|
|
09.07.2010, 00:49
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
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;
}
} |
|
|
|
|
09.07.2010, 01:04
|
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от SasaVitebsk
|
|
...
|
Этот код не будет работать, т.к. сравнения (ENC_P != P5) и (ENC_N != P4) будут возвращать true, даже когда оба операнда в каждом выражении будут !=0.
Последний раз редактировалось testerplus; 09.07.2010 в 01:08.
|
|
|
|
09.07.2010, 01:59
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
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) |
|
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
09.07.2010, 02:01
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Так а что вы хотите, если не секрет?
* Найти более красивое решение?
* Найти более быстрое решение?
* Затестить компилятор/ оптимизатор?
|
|
|
|
09.07.2010, 02:28
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от SasaVitebsk
|
Так а что вы хотите, если не секрет?
* Найти более красивое решение?
* Найти более быстрое решение?
* Затестить компилятор/ оптимизатор?
|
Всё 
Во-первых - найти самое быстрое. Соответственно, сравнить компиляторы. Какой компилятор при примерно одинаковом коде даст более быстрый код.
Ну и красивое решение, потому, что чем оно красивее, или, скажем, правильнее, тем более быстро оно будет выполняться.
Ну и по результатам компиляции решить для себя, каким компилятором лучше всего пользоваться.
Код, который прислал testerplus интересный. Этот же код, в CodeVision даёт 11/32 такта...
Самый быстрый вариант получился на CodeVision - 25 тактов при изменении сигналов. При абсолютно том же коде WinAVR даёт 30 тактов... Забавно, однако...
Ваш последний вариант (прошивка) неработоспособен. В симуляторе даёт одиночный импульс
Скомпилил в WinAVR c оптимизацией 3. Получилось 20/37 тактов...
Последний раз редактировалось Godzilla82; 09.07.2010 в 03:39.
|
|
|
|
13.07.2010, 01:47
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
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)
|
|
|
|
13.07.2010, 19:04
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от SasaVitebsk
|
Впрямую должно выглядить так.
// 172 bytes of CODE memory (+ 4 bytes shared)
// 6 bytes of DATA memory (+ 28 bytes shared)
|
Да что же ваши прошивки в симуляторе не запускаются
|
|
|
|
13.07.2010, 19:28
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Ваши - тоже.
Пришлите мне объектный код (типа ubrof  вашей прошивки. Я написал несколько вариантов, но интересно было бы сравнить.
|
|
|
|
14.07.2010, 00:03
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 29.10.2006
Сообщений: 1,449
Сказал спасибо: 99
Сказали Спасибо 318 раз(а) в 234 сообщении(ях)
|
Re: Может ли меняться логика откомпилированной программы при использовании разных режимов оптимизации?
Сообщение от SasaVitebsk
|
Ваши - тоже.
Пришлите мне объектный код (типа ubrof вашей прошивки.
|
Прикрепил всё, что есть. Это последний вариант. То есть, порт читается один раз.
В CodeVision получилось 20/28 тактов.
В WinAVR при том же коде 16/31 такт.
Это при том, что некоторые говорят, что в CodeVision всё работает медленно и печально...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:45.
|
|