Spider 0 16 мая, 2015 Опубликовано 16 мая, 2015 · Жалоба Всем привет! Не понятен момент описания прерываний. Точнее описывать их получается, но вот поведение линковщика неоднозначно. К примеру имеем main.c в котором скопом весь код программы в том числе и прерывания: void main(void) { бла бла бла } UART0_ISR() { обработчик } Теперь собираем его, и получаем примерно следующее: 563;-------------------------------------------------------- 564; interrupt vector 565;-------------------------------------------------------- 566 .area HOME (CODE) 000000 567 __interrupt_vect: 000000 02 00 29 [24] 568 ljmp __sdcc_gsinit_startup 000003 32 [24] 569 reti 000004 570 .ds 7 00000B 32 [24] 571 reti 00000C 572 .ds 7 000013 32 [24] 573 reti 000014 574 .ds 7 00001B 32 [24] 575 reti 00001C 576 .ds 7 000023 02 01 C9 [24] 577 ljmp _isr_uart 578;-------------------------------------------------------- 579; global & static initialisations 580;-------------------------------------------------------- Теперь "причёсываем" код. Создаём uart.c и переносим в него прерывание. собираем. Линкуем. 526;-------------------------------------------------------- 527; interrupt vector 528;-------------------------------------------------------- 529 .area HOME (CODE) 000000 530 __interrupt_vect: 000000 02 00 06 [24] 531 ljmp __sdcc_gsinit_startup 532;-------------------------------------------------------- 533; global & static initialisations 534;-------------------------------------------------------- А где?! Нет, сама функция собирается, но как обычная: 560;-------------------------------------------------------- 561; code 562;-------------------------------------------------------- 563 .area CSEG (CODE) 564;------------------------------------------------------------ 565;Allocation info for local variables in function '_isr_uart' 566;------------------------------------------------------------ 567; uart.c:41: _ISR_UART() 568; ----------------------------------------- 569; function _isr_uart 570; ----------------------------------------- 0000D8 571 _isr_uart: 00000F 572 ar7 = 0x0F 00000E 573 ar6 = 0x0E 00000D 574 ar5 = 0x0D 00000C 575 ar4 = 0x0C 00000B 576 ar3 = 0x0B 00000A 577 ar2 = 0x0A 000009 578 ar1 = 0x09 000008 579 ar0 = 0x08 Что я могу сделать не так? Это что получается прерывания должны быть только в основном коде? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 16 мая, 2015 Опубликовано 16 мая, 2015 · Жалоба Я sdcc для 51-х уже лет 10 не использовал, но раньше прерывания объявлялись вот так: void Timer0_ISR( void ) interrupt 1 using 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 16 мая, 2015 Опубликовано 16 мая, 2015 · Жалоба Я sdcc для 51-х уже лет 10 не использовал, но раньше прерывания объявлялись вот так: void Timer0_ISR( void ) interrupt 1 using 2 оно и сейчас так, только __interrupt 1 __using 2, а толку... если не SDCC, то что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 16 мая, 2015 Опубликовано 16 мая, 2015 · Жалоба Хм. Открываем SDCC Compiler User Guide, находим главу про прерывания, читаем: If you have multiple source files in your project, interrupt service routines can be present in any of them, but a prototype of the isr MUST be present or included in the file that contains the function main. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 16 мая, 2015 Опубликовано 16 мая, 2015 (изменено) · Жалоба Это уже давно не так. Компиляю под STM8 и не парюсь. А вот с годик назад - да, у sdcc была такая проблема. А еще он не компилялся, если в первом файле не было функции main. Изменено 16 мая, 2015 пользователем Эдди Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 16 мая, 2015 Опубликовано 16 мая, 2015 · Жалоба Это всё конечно хорошо, но что я то не так делаю? Почему у меня не создаёт таблицу прерываний как надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 16 мая, 2015 Опубликовано 16 мая, 2015 · Жалоба Какая версия? sdcc --version SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.4.0 #8981 (Apr 1 2015) (Linux) published under GNU General Public License (GPL) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 16 мая, 2015 Опубликовано 16 мая, 2015 · Жалоба Это всё конечно хорошо, но что я то не так делаю? Почему у меня не создаёт таблицу прерываний как надо? Вы должны включить прототипы обработчиков прерываний в тот файл, где у вас расположена функция main(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться