ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
9 июля
306056 Топик полностью
Toчкa oпopы (08.02.2012 09:33 - 09:44, просмотров: 125) ответил Cepгeй Бopщ на Да, и после -Ttext '=' не нужен?
Этот гадёныш (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 слове.
Заказать импортные ЭК - https://shop.fulcrum.ru/buy