Jump to content

    

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

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

Edited by Drozd2

Share this post


Link to post
Share on other sites

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

 

Т.е. можно

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

 

и

 

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

 

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

 

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

 

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

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

Edited by Drozd2

Share this post


Link to post
Share on other sites
Сути вопроса никто не понял. Попробую поэтапно.

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

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

Хоть 10 таблиц

Edited by СНБ

Share this post


Link to post
Share on other sites

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

Edited by Drozd2

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Да можно и во флеш. Еще раз: посмотрите как в скрипте компоновщика...

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

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

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

 

 

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

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

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

Share this post


Link to post
Share on other sites
Да, у них будут другие индексы, ну сделайте список define'ов под них.

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

Edited by Drozd2

Share this post


Link to post
Share on other sites

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

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

 

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Да я вообще дворник. Так, заглянул с умными людьми пообщаться.

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

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

 

Это так?

 

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

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

 

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

 

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

 

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

 

Так?

Edited by СНБ

Share this post


Link to post
Share on other sites
Физически нельзя.

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

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

 

 

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

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

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

 

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

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
Sign in to follow this