реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> SDCC не линкует прерывания вне main.c, Собирает код, но не вставляет в таблицу прерываний
Spider
сообщение May 16 2015, 08:19
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 427
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Всем привет!

Не понятен момент описания прерываний. Точнее описывать их получается, но вот поведение линковщика неоднозначно.

К примеру имеем 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;--------------------------------------------------------

А где?! wacko.gif
Нет, сама функция собирается, но как обычная:
Код
                                    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

Что я могу сделать не так? Это что получается прерывания должны быть только в основном коде?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 16 2015, 08:46
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 185
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я sdcc для 51-х уже лет 10 не использовал, но раньше прерывания объявлялись вот так:
Код
void Timer0_ISR( void )    interrupt 1    using 2


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Spider
сообщение May 16 2015, 08:53
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 427
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Цитата(AHTOXA @ May 16 2015, 12:46) *
Я sdcc для 51-х уже лет 10 не использовал, но раньше прерывания объявлялись вот так:
Код
void Timer0_ISR( void )    interrupt 1    using 2

оно и сейчас так, только __interrupt 1 __using 2, а толку...

если не SDCC, то что?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 16 2015, 12:04
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 185
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Хм. Открываем 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.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 16 2015, 12:55
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 383
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Это уже давно не так. Компиляю под STM8 и не парюсь. А вот с годик назад - да, у sdcc была такая проблема. А еще он не компилялся, если в первом файле не было функции main.

Сообщение отредактировал Эдди - May 16 2015, 12:56


--------------------
Я: на гитхабе, на stackexchange, в ЖЖшке
--------------------------------
In the world, only two things are the worst: Windows and Poettering.
Go to the top of the page
 
+Quote Post
Spider
сообщение May 16 2015, 16:02
Сообщение #6


В поисках истины
***

Группа: Свой
Сообщений: 427
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Это всё конечно хорошо, но что я то не так делаю? Почему у меня не создаёт таблицу прерываний как надо?
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 16 2015, 16:07
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 383
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Какая версия?
Код
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)


--------------------
Я: на гитхабе, на stackexchange, в ЖЖшке
--------------------------------
In the world, only two things are the worst: Windows and Poettering.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 16 2015, 16:12
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 185
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Alexey Belyaev @ May 16 2015, 21:02) *
Это всё конечно хорошо, но что я то не так делаю? Почему у меня не создаёт таблицу прерываний как надо?

Вы должны включить прототипы обработчиков прерываний в тот файл, где у вас расположена функция main().


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th March 2017 - 05:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016