Перейти к содержанию
    

Keil, таблица векторов прерываний

У кейла в компиляторе С51 есть опция "Interrupt vectors at address". Это на самом деле работает? Если да, то как? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, Axel сказал:

У кейла в компиляторе С51 есть опция "Interrupt vectors at address". Это на самом деле работает? Если да, то как? 

Я использовал это для приложения с загрузчиком на Silabs-ах.

С 0-го адреса был загрузчик,но он работал без прерываний. На всех векторах стояла заглушка JMP $+0x2000

Приложение располагалось по адресу 0x2000 (как раз этой опцией + вкладка линкера убрать галку From Target Dialog и выставить CodeRange 0x2000 - и до конца флеши). Таким образом приложение становится независимо от загрузчика.

В сухом остатке - Keil может разместить таблицу векторов по этому адресу, но физически прерывания будут срабатывать по фиксированным адресам. Переход с фиксированного адреса на перенесеный нужно обеспечивать ручками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, Edit2007 said:

...На всех векторах стояла заглушка JMP $+0x2000...

Понял, спасибо. Похоже это то, что надо... С фрагментом кода расставления заглушек не поможете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, mcheb said:

На гитхабе есть  * CC Bootloader    от  Fergus Noble. Посмотрите.

Посмотрел, идею понял, спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В продолжение темы... Задача была приделать бутлоадер к стороннему проекту. Это получилось: бутлоадер разместился на начальных адресах, на адресах векторов - нужные переходы. Но получилось ... не совсем: В основной программе, сдвинутой выше, присутствует библиотека, использующая прерывания. Ну и, естественно, библиотечнуе вектора никуда не сдвинулись. Соответственно вопрос: есть ли возможность переместить библиотечные вектора вслед за программой (исходников библиотеки нет, дизассеблирование (IDA PRO) не одолел)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте в файле startup.a51 для верхнего приложения сегмент, определяющий расположение векторов прерывания.

В файле по умолчанию (для загрузчика)

                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

В файле для приложения

                CSEG    AT      0x2000
?C_STARTUP:     LJMP    STARTUP1

где 0x2000 это величина смещения. Подробности в описании CSEG AT (кодовый сегмент разместить по жесткому адресу). Возможно именно это переопределяет для линкера размещение данных. При сборке приложения в выходном файле (hex-bin) не должно быть ссылок на область загрузчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 minutes ago, Edit2007 said:

Проверьте в файле startup.a51...

С этого начинал, не помогает... Все двигается, кроме векторов... Решил проблему "в лоб": достучался до разработчиков и попросил перекомпилировать с нужным смещением. Спасибо...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...