Не надо использовать в реальном коде вот такое PORTB |= (1<<7);
Обычно любое действие имеет осмысленное название. Простой пример - допустим взвод 7 бита включает светодиод.
Тогда добавим дефайн - #define LedOn() PORTB |= (1<<7) и можно в тексте не задумываться где там этот светодиод, на каком он бите какого порта.
Если вдруг схема изменится и светодиод будет подключен в другое место - достаточно изменить одну строчку, а не перелопачивать весь текст программы. Можно и не через дефайн, а инлайновой функцией:
static inline LedOn(void) attribute((always_inline));
static inline LedOn(void)
{
PORTB |= (1<<7)
}
В обоих случаях используется как LedOn();
А неиспользуемые функции компилятор выбрасывает - ключик -ffunction-sections при сборке используется. Каждая функция в свою секцию помещается, неиспользуемые же секции линкер выкинет.