Jump to content

    

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

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

Share this post


Link to post
Share on other sites
13 минут назад, Axel сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
13 minutes ago, Edit2007 said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
13 minutes ago, mcheb said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

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

                CSEG    AT      0x2000
?C_STARTUP:     LJMP    STARTUP1

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

Share this post


Link to post
Share on other sites
27 minutes ago, Edit2007 said:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now