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

вектора прерываний

Микроконтроллер - PIC32MX. Прибор должен работать в двух разных режимах в зависимости от переключателя. Режим выбирается перед включением. Обработчики прерываний тоже должны быть разными. Возможно ли штатными методами создать две таблицы векторов прерываний и два набора обработчиков? В крайнем случае можно сделать одну таблицу в ОЗУ, но 4 КБ flash не так жалко, как ОЗУ. И компилятор ругается на разные обработчики одного вектора.

Изменено пользователем Drozd2

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


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

"Положение векторов в адресном пространстве может быть изменено программно, так же как и дистанция между векторами."© Гуголь

 

Т.е. можно

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


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

Так вы почитайте как у вас прерывания работают. Там есть режимы одного и множества векторов, есть между векторами оффсет, что позволяет сильно уменьшить выделяемое место под вектора. Адрес обработчика прерывания рассчитывается через адрес в регистре сопроцессора (ebase). Где и какие вектора размещать - определяется компоновщиком (линкером). Инициализация всего добра в ассемблерном стартапе (crt0.S).

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


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

Сути вопроса никто не понял. Попробую поэтапно.

1. Хочу ДВЕ(!!!) таблицы векторов во flash. Не важно, какой плотности. Таблицы должны быть с разными векторами и вызывать разные обработчики прерываний. При старте с помощью ebase должна выбираться одна из них со своим набором привязанных к ней обработчиков.

2. Тогда в тексте программы появляются соответственно ДВА разных обработчика ОДНОГО вектора, на что компилятор ругается. Не хочет он сразу и

 

void __attribute__((interrupt(X), vector(Y))) foo {};

 

и

 

void __attribute__((interrupt(X), vector(Y))) bar {};

 

К тому же нужно связать первый обработчик с первой таблицей, а второй, соответственно, со второй. И уже при старте в ebase писать адрес нужной таблицы.

 

3. Даже если одну таблицу разместить в озу и при старте менять вектора, то проблема одинаковых атрибутов разных обработчиков остается.

 

Догадываюсь, что штатно это не реализуемо. Но надеюсь, что решение есть.

Пока приходится в одном обработчике в зависимости от режима вызывать разные функции. Лишние расходы на сохранение/восстановление регистров.

Изменено пользователем Drozd2

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


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

Сути вопроса никто не понял. Попробую поэтапно.

1. Хочу ДВЕ(!!!) таблицы векторов во flash.

Во флешь нельзя. Только в ОЗУ.

Хоть 10 таблиц

Изменено пользователем СНБ

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


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

Да не вопрос. Можно и в ОЗУ. Тогда и одной таблицы достаточно. И адрес нужного обработчика записать туда я в состоянии. Как два разных обработчика с одинаковыми атрибутами прописать?

Изменено пользователем Drozd2

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


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

Сформировать две таблицы.

А потом переключать их.

 

"Положение векторов в адресном пространстве может быть изменено программно, так же как и дистанция между векторами."© Гуголь

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


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

Да можно и во флеш. Еще раз: посмотрите как в скрипте компоновщика описывается таблица прерываний. Опишите вторую, а потом разместите в ней вектора. Да, у них будут другие индексы, ну сделайте список define'ов под них.

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


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

Да можно и во флеш. Еще раз: посмотрите как в скрипте компоновщика...

Физически нельзя.

А компоновщик и прочее - это уже все программные извраты компилятора.

Я думал речь идет о возможностях непосредственно архитектуры

 

 

Например, компилятор может генерировать код, который копирует вектора из флэш в RAM.

А в ручную на ассемблере можно и не такие извраты делать.

Но тогда в теме нужно было сразу сказать, что интересует не "железные" возможности, а софтовые извраты

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


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

Да, у них будут другие индексы, ну сделайте список define'ов под них.

А вот насчет других индексов то я и не подумал. Начинаю понимать. Хотя с define пока довольно туманно. Попробую додуматься сам. Спасибо!

Изменено пользователем Drozd2

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


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

Т.е. для Вас "камень" это то, как его представляет для Вас предоставляет компилятор?

А я думал Вы системщик/железячник, а не программист.

 

Хотя с define пока довольно туманно.

Это Ваш первый проект? Курсовая?

 

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


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

Да я вообще дворник. Так, заглянул с умными людьми пообщаться.

Не обижайтесь.

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

 

Это так?

 

Объясните нормально в чем проблема:

Вы не знаете поддерживает ли железо данную возможность или вы просто не знаете как это в компиляторе написать?

 

Т.е. у вас вопрос по архитектуре железа или по компилятору?

 

Т.е. Вам нужен просто пример исходного кода?

 

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

 

Так?

Изменено пользователем СНБ

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


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

Физически нельзя.

А компоновщик и прочее - это уже все программные извраты компилятора.

Я думал речь идет о возможностях непосредственно архитектуры

 

 

Например, компилятор может генерировать код, который копирует вектора из флэш в RAM.

А в ручную на ассемблере можно и не такие извраты делать.

Но тогда в теме нужно было сразу сказать, что интересует не "железные" возможности, а софтовые извраты

 

Что-то когда я работаю с прерываниями в pic32 у меня обработчики прерываний размещены во флеш-памяти и PC в прыгает по адресам rom. Если нужно подменить вектора - переинициализирую ebase и он начинает прыгать по другой таблице прерываний. И все во флеш. ЧЯДНТ?

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


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

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

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

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

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

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

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

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

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

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