Лисья Нора

Оглавление


§ Шаблона makefile

Компиляция под стандартный микроконтроллера AtMega328.
# https://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html
DEVICE = atmega328
OPTIONS = -Os -DF_CPU=25000000 -mmcu=$(DEVICE) -std=c++11
INCLUDE = -I.. -Iinclude
WARNING = -Wall -Wno-unused-but-set-variable
LINKER = -fdata-sections -Wl,--gc-sections,--defsym=__stack=0x80efff,--defsym=__heap_end=0x80efff
COMPILE = avr-gcc $(INCLUDE) $(WARNING) $(OPTIONS) $(LINKER)
AVR = avr_machine
 
all:
$(COMPILE) main.cc -o main.elf
avr-objcopy -j .text -j .data -O binary main.elf main.bin
avr-objdump -S main.elf > main.lst
avr-size -C --mcu=$(DEVICE) main.elf > mem.map
rm main.elf
$(AVR) main.bin
 
clean:
rm -f *.o rm *.elf *.lst *.bin *.map

§ main.cc

#include <avrio.h>
 
ISR(INT0_vect) { }
 
int main() {
for (;;);
}

§ Файл avrio.h

/*
* Этот файл покрыт различными некультурными лицензиями и не собирается
* на этом останавливаться! LICENSE NO WARRANTY COPYRIGHT TRADEMARK RIGHTS
* звучит очень круто, как-то не по-нашему, ну вы понимаете, да!
*/
 
#ifndef __AVRIO_GENERIC_FILE
#define __AVRIO_GENERIC_FILE
 
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
 
// Пример как пользоваться: LPM(my_best_array[i])
#define LPM(t) pgm_read_byte(&t)
#define LPW(t) pgm_read_word(&t)
 
// Базовые типы данных
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
 
// Чтение|запись в порты
inline byte inp(byte port) { return ((volatile byte*) 0x20)[port]; }
inline void out(byte port, byte val) { ((volatile byte*) 0x20)[port] = val; }
 
// Объявление указателя на память (имя x, адрес a)
#define heap(x, a) byte* x = (byte*) a
 
#endif

§ Устройства

DEVICE ROM RAM EEPROM
atmega328 32k 2048 1024
attiny85 8k 512 512
Если выбран attiny85
LINKER = -fdata-sections -Wl,--gc-sections,--defsym=__stack=0x80025f,--defsym=__heap_end=0x80025f