Этот RCALL PC+0001 - больше похоже на быстрое резервирование пары байтов на стеке. Далее: extern voidIAP_UART_init(void); Тут пробел после void утерян. Вероятно опечатка, компилятор не должен был такое скушать. А может быть скушал, но воспринял не как прототип функции и, соответственно, IAP_UART_init(); не как вызов функции (а оптимизатор выкинул).
LDFLAGS += -Ttext 0x0140 - это gcc должен или проигнорировать, или выругаться. Потому что у gcc нет опции -Ttext, это опция линкера, у gcc есть опция -T script_file и 0x140 через пробел тут как отдельный ключ должен трактоваться. Попробуйте заменить ее на
LDFLAGS += -Wl,-Ttext,0x0140 Ну и адрес IAP_UART_init никак не может быть нечетным.
Попробовал на тестовом проекте:
main.c:
extern void IAP_UART_init(void);
__attribute__((OS_main))
int main()
{
IAP_UART_init();
for(;;)
;
}
Флаги:
LDFLAGS += -Wl,--gc-sections LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--defsym,IAP_UART_init=0x6A LDFLAGS += -Wl,-Ttext=0x140листинг:
Disassembly of section .text: 00000140 <__vectors>: ........ 0000019e <main>: extern void IAP_UART_init(void); __attribute__((OS_main)) int main() { IAP_UART_init(); 19e: 65 df rcall .-310 ; 0x6a <IAP_UART_init> 1a0: ff cf rjmp .-2 ; 0x1a0 <main+0x2>Добавлено: проверил, действительно gcc кушает LDFLAGS += -Ttext 0x0140, так что дело у вас не в этом.