Микроконтроллер - PIC32MX. Прибор должен работать в двух разных режимах в зависимости от переключателя. Режим выбирается перед включением. Обработчики прерываний тоже должны быть разными. Возможно ли штатными методами создать две таблицы векторов прерываний и два набора обработчиков? В крайнем случае можно сделать одну таблицу в ОЗУ, но 4 КБ flash не так жалко, как ОЗУ. И компилятор ругается на разные обработчики одного вектора.
"Положение векторов в адресном пространстве может быть изменено программно, так же как и дистанция между векторами."© Гуголь
Т.е. можно
Так вы почитайте как у вас прерывания работают. Там есть режимы одного и множества векторов, есть между векторами оффсет, что позволяет сильно уменьшить выделяемое место под вектора. Адрес обработчика прерывания рассчитывается через адрес в регистре сопроцессора (ebase). Где и какие вектора размещать - определяется компоновщиком (линкером). Инициализация всего добра в ассемблерном стартапе (crt0.S).
Сути вопроса никто не понял. Попробую поэтапно.
1. Хочу ДВЕ(!!!) таблицы векторов во flash. Не важно, какой плотности. Таблицы должны быть с разными векторами и вызывать разные обработчики прерываний. При старте с помощью ebase должна выбираться одна из них со своим набором привязанных к ней обработчиков.
2. Тогда в тексте программы появляются соответственно ДВА разных обработчика ОДНОГО вектора, на что компилятор ругается. Не хочет он сразу и
void __attribute__((interrupt(X), vector(Y))) foo {};
и
void __attribute__((interrupt(X), vector(Y))) bar {};
К тому же нужно связать первый обработчик с первой таблицей, а второй, соответственно, со второй. И уже при старте в ebase писать адрес нужной таблицы.
3. Даже если одну таблицу разместить в озу и при старте менять вектора, то проблема одинаковых атрибутов разных обработчиков остается.
Догадываюсь, что штатно это не реализуемо. Но надеюсь, что решение есть.
Пока приходится в одном обработчике в зависимости от режима вызывать разные функции. Лишние расходы на сохранение/восстановление регистров.
Да не вопрос. Можно и в ОЗУ. Тогда и одной таблицы достаточно. И адрес нужного обработчика записать туда я в состоянии. Как два разных обработчика с одинаковыми атрибутами прописать?
Сформировать две таблицы.
А потом переключать их.
"Положение векторов в адресном пространстве может быть изменено программно, так же как и дистанция между векторами."© Гуголь
Да можно и во флеш. Еще раз: посмотрите как в скрипте компоновщика описывается таблица прерываний. Опишите вторую, а потом разместите в ней вектора. Да, у них будут другие индексы, ну сделайте список define'ов под них.
Т.е. для Вас "камень" это то, как его представляет для Вас предоставляет компилятор?
А я думал Вы системщик/железячник, а не программист.
Да я вообще дворник. Так, заглянул с умными людьми пообщаться.
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)