2013-10-09 6 views
0
#define F_CPU 1000000 

#include <stdint.h> 
#include <avr/io.h> 
#include <util/delay.h> 

const uint8_t sequences[] = { 
    0b00000001, 
    0b00000011, 
    0b00000110, 
    0b00001100, 
    0b00011000, 
    0b00110000, 
    0b00100000, 
    0b00110000, 
    0b00011000, 
    0b00001100, 
    0b00000110, 
    0b00000011, 
    0b00000001, 
}; 

const uint8_t totalSequences = sizeof(sequences)/sizeof(sequences[0]); 

int main(void) { 
    DDRB = 0b00111111; 

    uint8_t i; 
    uint8_t b; 

    while(1) { 
     for(i = 0; i < totalSequences; i++) { 
      const uint8_t currentSequence = sequences[i]; 
      const uint8_t nextSequence = sequences[(i + 1) % totalSequences]; 

      // blend between sequences 
      for(b = 0; b < 100; b++) { 
       PORTB = currentSequence; _delay_us(b); 
       PORTB = nextSequence;  _delay_us(100-b); 
      } 

      _delay_ms(50); 
     } 
    } 

    return 0; 
} 

Это полностью моя программа. Когда я устанавливал PORTB напрямую (без сочетания), как показано ниже, скомпилированный двоичный файл равен 214 байтам. Когда я включаю второй цикл, мой скомпилированный двоичный файл превышает 4 КБ. У меня есть только 1 КБ FLASH, поэтому я должен соответствовать этому.Как он компилируется до 4kb?

const uint8_t currentSequence = sequences[i]; 
const uint8_t nextSequence = sequences[(i + 1) % totalSequences]; 

//// blend between sequences 
//for(b = 0; b < 100; b++) { 
// PORTB = currentSequence; _delay_us(b); 
// PORTB = nextSequence;  _delay_us(100-b); 
//} 

PORTB = currentSequence; 
PORTB = nextSequence; 
_delay_ms(50); 

Мой является WinAVR Набор инструментов, составленный следующим:

avr-gcc -Os -mmcu=attiny13 -Wall -std=c99 main.c -o main.out 
avr-objcopy -O binary main.out main.bin 

я не знаю достаточно, чтобы декомпилировать двоичный и посмотреть, что компилятор сделал, но все это было, это было неправильно. Почему двоичный код с внутренним циклом 4kb и как я могу его исправить?

После доработки петли (278 байт):

while(1) { 
    for(i = 0; i < totalSequences; i++) { 
     const uint8_t currentSequence = sequences[i]; 
     const uint8_t nextSequence = sequences[(i + 1) % totalSequences]; 

     // blend between sequences 
     for(b = 0; b < 100; b++) { 
      int d; 
      PORTB = currentSequence; for(d = 0; d < b; d++, _delay_us(1)); 
      PORTB = nextSequence;  for(d = 100; b < d; d--, _delay_us(1)); 
     } 

     _delay_ms(50); 
    } 
} 
+0

Я бы рекомендовал посмотреть файл карты. Вы должны иметь возможность получить GCC для создания файла карты, добавив '-Wl, -Map = output.map' –

ответ

3

Функция задержки() взрывается размером кода, если параметр не является постоянная время компиляции. Он также не будет задерживаться на правильное время с переменным параметром.

+0

, пожалуйста, проверьте мой пересмотренный цикл в OP. Скомпилированный двоичный файл теперь составляет 278 байт. Будет ли это работать лучше? –

Смежные вопросы