Больше чем год назад в компоновщик (binutils 2.17), был добавлен проход оптимизации результатом работы которого является замена инструкций CALL/JMP на RCALL/RJMP когда это возможно для контроллеров с памятью от 16 до 64KB (про 128/256 не знаю). Также выполняется замена последовательности команд CALL __label__; RET на JMP __label__. Эти оптимизации дает примерно 5%-ное уменьшение размера кода.
Для этого нужно использовать ключ компоновщика "--relax".
Есть еще один ключ, который позволяет использовать инструкции RCALL/RJMP для перехода из старших 4КВ флеш в младшие (и обратно) - "--pmem-wrap-around=<val>", где val - 16k, 32k или 64k (размер флеш контроллера).
Внимание: при использовании "--relax" теряется информация о номерах строк исходной программы и символьная отладка невозможна.
К сожалению, про эту возможность знало очень мало народу. У меня просьба испытайте это на своих проектах, и сообщите о результатах.
Спасибо, Анатолий.
PS: просьба, пожалуйста не посылайте в этот топик сообщения что Ваш купленный/вылеченный компилятор уже давно это делает.
|