#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);
}
}
Я бы рекомендовал посмотреть файл карты. Вы должны иметь возможность получить GCC для создания файла карты, добавив '-Wl, -Map = output.map' –