Этот гадёныш (avr-gcc 3.4.6) таки считает себя умнее (исправил форматирование). А, ну и если функция не требует параметров или параметры передаются в соответствии с принятым в gcc соглашнеии о вызовах, то тогда в заголовочном файле пишем extern void Bootloader(); а в
командной строке линкера
LDFLAGS += -Wl,--defsym,BootLoader=0x1800
Пишу в .h:
extern voidIAP_UART_init(void);// настройка программного УАПП
Пишу в .c:
int main(){
IAP_UART_init();
while (1){
for (ADC_data=0;1;ADC_data++){
Добавляю в makefile (приложение начинается с адреса 0x140, вход в IAP_UART_init - по адресу 0x0037):
LDFLAGS += -Ttext 0x0140
LDFLAGS += -Wl,--defsym,IAP_UART_init=0x0037
В ответ получаю предупреждение на первую строку main с вызовом функции:
warning: internal error: out of range error
И в .hex файле получаю такой вот финт ушами:
71: int main(){
+00000103: D000 RCALL PC+0x0001 Relative call subroutine
77: for (ADC_data=0;1;ADC_data++){
+00000104: 92100064 STS 0x0064,R1 Store direct to data space
+00000106: 92100063 STS 0x0063,R1 Store direct to data space
и так далее, нет ret'а там нигде нет.
Читал избранные места из имеющихся справок по GCC и линкеру - ошибок, вроде, нет. Ох№;%:ю... 8-( Какой раздел манов ещё покурить?
Или я опять синтаксис попутал?
Как функция может начинаться с адреса 0x37, если команды двухбайтовые минимум? GCC считает адрес байтами, возможно надо было указать 0x006E?
Хм-м-м, наверное да... это надо обдумать.
Да, и после -Ttext '=' не нужен?
Пока я не начал пробовать прицеплять extern функции на листинге было всё нормально. Загрузчик (extern) заканчивается на 0x0140 байтах, начало программы в листинге на 0x000A0 слове.