Avr Gcc Формирует Слишком Много Кода

1-11-2012, 12:23 От: admin Посмотрели: 1159
Друзья!

Я написал коротенькую программку (ее код ниже), но компилятор (avr gcc) налабал больше 2K кода (у меня процессор ATTiny26, соответственно, программа уже не влезает. И это при том, что я еще не дошел до вычислений, которые там будут, и возможно, с плавающей точкой...

Посмотрел дизассемблер - что-то там и правда много всего лишнего на мой взгляд. Мой код компилируется нормально, беда в том, что компилятор добавляет еще кучу каких-то кусков назначение которых мне вовсе не понятно. Вот названия непонятных кусков: __gtsf2, __ltsf2, __floatunsisf, __clzsi2, __pack_f, __unpack_f, __fpcmp_parts_f, __prologue_saves__, __epilogue_restores__

Компилятор в режиме Os (это вроде как скорость, но в этом режиме получается самый компактный код, в других режимах код еще больше).

Что можно сделать?

1) Сменить компилятор? Мне вообще-то avr gcc что-то не очень нравится и по другим причинам. Если IAR поможет решить эти проблемы, то наверно я пересяду.

2) Что-то выкинуть из программы? Может я что-то не заметил и какие-то действия вызывают сложные мат.функции?

3) Что-то подкрутить в настройках компилятора?

4) Моя ставка на младший контроллер изначально была не правильной?

5) Еще что-нибудь?



Спасибо!



Ну и код, собственно:




#include "avr/io.h"
#include "avr/interrupt.h"

#define fVCS(v) (255*v/5) // VP (0...300) (0...255)
#define VCSMAX fVCS(0.55) // VCS
#define VCSNORM fVCS(0.48) // VCS
#define fVP(v) ((unsigned)255*v/200/2.56)
// VCS (0...5) (0...255)
#define VPSTART fVP(175) // (175)
#define VPSAVE fVP(170) // SAVE (170)
#define VPSTOP fVP(60) // STOP(60)
#define NS 8 // START

volatile unsigned char ADC_data=0;// (0...255)
volatile unsigned char DAC_data=0;// , (0...255 = 0...5)
volatile unsigned int VP; // ?????
volatile unsigned int msec; // : 1

typedef struct
{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} BYTE_BITFIELD;

#define ddra (*((volatile BYTE_BITFIELD*)(&DDRA )))
#define ddrb (*((volatile BYTE_BITFIELD*)(&DDRB )))
#define porta (*((volatile BYTE_BITFIELD*)(&PORTA)))
#define portb (*((volatile BYTE_BITFIELD*)(&PORTB)))
#define pina (*((volatile BYTE_BITFIELD*)(&PINA )))
#define pinb (*((volatile BYTE_BITFIELD*)(&PINB )))

#define SAVE porta.bit5 //
#define LED_VPN porta.bit4 //
#define STOP porta.bit3 //
#define START porta.bit2 //

#define DAC_SYNC portb.bit3 // ()
#define DAC_SCLK portb.bit2 // ()
#define DAC_DIN portb.bit0 // ()

#define clrb_STOP STOP = 0
#define setb_STOP STOP = 1
#define clrb_START START = 0
#define setb_START START = 1
#define clrb_SAVE SAVE = 1
#define setb_SAVE SAVE = 0
#define clrb_EORLOCK ddrb.bit6=0// EORLOCK ( )
#define setb_EORLOCK portb.bit6=0; ddrb.bit6=0
// EORLOCK ( )

#define setb_ADSC ADCSR |= ( 1<<6 )
#define setb_I SREG != ( 1<<7 )
#define clrb_I SREG &= ~( 1<<7 )

void delay_us( volatile signed int usec )
{
usec -= 5; // 38 "" , @8 5 .
if( usec < 0 ) usec = 0;
usec = usec >> 1; // 1 = 16 , @8 = 2 .
for( ; usec>0; usec-- )
{
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
}
}

void WriteDAC( unsigned char data )
{
unsigned int data1 = data;
data1 = data1 << 4;

DAC_SYNC = 1;
DAC_SCLK = 1;
DAC_SYNC = 0;

for( int i=0; i<16; i++ )
{
(data1&0x8000) ? (DAC_DIN=1) : (DAC_DIN=0);
data1 = data1<<1;
DAC_SCLK = 0;
DAC_SCLK = 1;
}
}

int main( void )
{
unsigned int i;

DDRA = 0b01111100;
DDRB = 0b00111101;

WDTCR = 0b00001000; // 000=(reserved)
// 0=Watchdog change disabled
// 1=Watchdog enabled
// 000=prescaler 1/16384

TCCR1A = 0b00000000; // 00=Comparator A disconected,
// 00=Comparator B disconected,
// 0=No Force Output Compare Match 1A
// 0=No Force Output Compare Match 1B
// 0=No PWM A
// 0=No PWM B
TCCR1B = 0b00000110; // 0=No Timer/Counter clear
// 0=No prescaler reset
// 00=(reserved)
// 0110=PCS/32
TIMSK = 0b00000100; // 0=(reserved)
// 0=TC1 A output compare int. disabled
// 0=TC1 B output compare int. disabled
// 00=(reserved)
// 1=TC1 overflow interupt enabled
// 0=TC0 overflow interupt disabled
// 0=(reserved)
ADMUX = 0b10100110; // 10=Internal Voltage Reference (2.56 V), AREF pin (PA3) not connected
// 1=ADC Left Adjust Result
// 00110=Input: ADC6 single ended
ADCSR = 0b11000111; // 1=ADC Enabled
// 1=Start conversion
// 0=No free-running mode (single conversion)
// 00=Clear interrupt flag,ADC interrupt disabled
// 111=Confersion time CK/128

msec = 0;
DAC_data = VCSMAX;
setb_STOP;
while( VP < VPSTART ) {}
clrb_STOP;
setb_EORLOCK;
for( i=0; i<NS; i++ ) {
delay_us( 300 );
setb_START;
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
clrb_START; }
clrb_EORLOCK;
while( msec < 300 ) {}
DAC_data = VCSNORM;

while(1)
{
VP = ADC_data;
if( VP < VPSAVE ) setb_SAVE; // VP - SAVE
if( VP > VPSTART ) clrb_SAVE; // VP - SAVE
if( VP < VPSTOP) // VP ,
{
clrb_I; //
while(1) {} // ( WDT )
}
}

return 0;
}

ISR( TIMER1_OVF1_vect )
{
asm( "wdr" );
TCNT1 = 0xFF - 250;
msec++;

WriteDAC( DAC_data );
if( ( ADCSR&(1<<6) ) == 0 ) ADC_data = ADCH;
setb_ADSC;
}


Раздел: AVR

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Avr Gcc Формирует Слишком Много Кода все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Май 2024    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031