Программирую на Си под AVR ATtiny2313, flash памяти у нее 2 килобайта, каждый байт на счету, поэтому требуется тщательно следить, чтобы лишний код не попадал в HEX файл.
У меня была программа состояла из трех файлов:
main.c // основной файл программы
lcd_lib.c // библиотека для работы с LCD экраном HD44780
ds18b20.c // библиотека для работы с термодатчиком ds18b20
листинг main.c
#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
#include "lcd_lib.c" // библиотека для работы с LCD HD44780
#include "ds18b20_lib.c"
.....
void main(void) {
......
}Компилирую и собираю так:
avr-gcc -O2 -Os -mmcu=attiny2313 -o sensor.elf sensor.cДелаем HEX
avr-objcopy -R .eeprom -O ihex sensor.elf sensor.hexHEX получается 2032 байт, т.е. влезет в 2048 байт flash памяти attiny2313
Затем я решил сделать все красиво и включать в main.c не с файлы, а h файлы.
листинг main.c
#define F_CPU 8000000UL
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
#include "lcd_lib.h" // библиотека для работы с LCD HD44780
#include "ds18b20_lib.h"
.....
void main(void) {
......
}Создаю объектный файл lcd_lib.o:
avr-gcc -O2 -Os -mmcu=attiny2313 -std=c99 -c lcd_lib.c -I /usr/avr/include/Создаю объектный файл ds18b20_lib.o:
avr-gcc -O2 -Os -mmcu=attiny2313 -std=c99 -c ds18b20_lib.c -I /usr/avr/include/Создаю объектный файл sensor.elf:
avr-gcc -O2 -Os -mmcu=attiny2313 -std=c99 lcd_lib.o ds18b20_lib.o main.c -o sensor.elfДелаем HEX:
avr-objcopy -R .eeprom -O ihex sensor.elf sensor.hexИ вот такой HEX уже не влезает в 2048 байт!!!
Вопрос: В первом варианте, где в main.c подключены lcd_lib.c и ds18b20_lib.с неиспользуемые функции из этих файлов не попадают в результирующий файл?
Какой есть способ на этапе линковки исключить неиспользуемые функции ?