Drozd2 0 25 мая, 2016 Опубликовано 25 мая, 2016 (изменено) · Жалоба Микроконтроллер - PIC32MX. Прибор должен работать в двух разных режимах в зависимости от переключателя. Режим выбирается перед включением. Обработчики прерываний тоже должны быть разными. Возможно ли штатными методами создать две таблицы векторов прерываний и два набора обработчиков? В крайнем случае можно сделать одну таблицу в ОЗУ, но 4 КБ flash не так жалко, как ОЗУ. И компилятор ругается на разные обработчики одного вектора. Изменено 25 мая, 2016 пользователем Drozd2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SNB 0 26 мая, 2016 Опубликовано 26 мая, 2016 · Жалоба "Положение векторов в адресном пространстве может быть изменено программно, так же как и дистанция между векторами."© Гуголь Т.е. можно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
becopt 0 26 мая, 2016 Опубликовано 26 мая, 2016 · Жалоба Так вы почитайте как у вас прерывания работают. Там есть режимы одного и множества векторов, есть между векторами оффсет, что позволяет сильно уменьшить выделяемое место под вектора. Адрес обработчика прерывания рассчитывается через адрес в регистре сопроцессора (ebase). Где и какие вектора размещать - определяется компоновщиком (линкером). Инициализация всего добра в ассемблерном стартапе (crt0.S). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drozd2 0 26 мая, 2016 Опубликовано 26 мая, 2016 (изменено) · Жалоба Сути вопроса никто не понял. Попробую поэтапно. 1. Хочу ДВЕ(!!!) таблицы векторов во flash. Не важно, какой плотности. Таблицы должны быть с разными векторами и вызывать разные обработчики прерываний. При старте с помощью ebase должна выбираться одна из них со своим набором привязанных к ней обработчиков. 2. Тогда в тексте программы появляются соответственно ДВА разных обработчика ОДНОГО вектора, на что компилятор ругается. Не хочет он сразу и void __attribute__((interrupt(X), vector(Y))) foo {}; и void __attribute__((interrupt(X), vector(Y))) bar {}; К тому же нужно связать первый обработчик с первой таблицей, а второй, соответственно, со второй. И уже при старте в ebase писать адрес нужной таблицы. 3. Даже если одну таблицу разместить в озу и при старте менять вектора, то проблема одинаковых атрибутов разных обработчиков остается. Догадываюсь, что штатно это не реализуемо. Но надеюсь, что решение есть. Пока приходится в одном обработчике в зависимости от режима вызывать разные функции. Лишние расходы на сохранение/восстановление регистров. Изменено 26 мая, 2016 пользователем Drozd2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SNB 0 26 мая, 2016 Опубликовано 26 мая, 2016 (изменено) · Жалоба Сути вопроса никто не понял. Попробую поэтапно. 1. Хочу ДВЕ(!!!) таблицы векторов во flash. Во флешь нельзя. Только в ОЗУ. Хоть 10 таблиц Изменено 26 мая, 2016 пользователем СНБ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drozd2 0 26 мая, 2016 Опубликовано 26 мая, 2016 (изменено) · Жалоба Да не вопрос. Можно и в ОЗУ. Тогда и одной таблицы достаточно. И адрес нужного обработчика записать туда я в состоянии. Как два разных обработчика с одинаковыми атрибутами прописать? Изменено 26 мая, 2016 пользователем Drozd2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SNB 0 26 мая, 2016 Опубликовано 26 мая, 2016 · Жалоба Сформировать две таблицы. А потом переключать их. "Положение векторов в адресном пространстве может быть изменено программно, так же как и дистанция между векторами."© Гуголь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
becopt 0 27 мая, 2016 Опубликовано 27 мая, 2016 · Жалоба Да можно и во флеш. Еще раз: посмотрите как в скрипте компоновщика описывается таблица прерываний. Опишите вторую, а потом разместите в ней вектора. Да, у них будут другие индексы, ну сделайте список define'ов под них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SNB 0 27 мая, 2016 Опубликовано 27 мая, 2016 · Жалоба Да можно и во флеш. Еще раз: посмотрите как в скрипте компоновщика... Физически нельзя. А компоновщик и прочее - это уже все программные извраты компилятора. Я думал речь идет о возможностях непосредственно архитектуры Например, компилятор может генерировать код, который копирует вектора из флэш в RAM. А в ручную на ассемблере можно и не такие извраты делать. Но тогда в теме нужно было сразу сказать, что интересует не "железные" возможности, а софтовые извраты Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drozd2 0 27 мая, 2016 Опубликовано 27 мая, 2016 (изменено) · Жалоба Да, у них будут другие индексы, ну сделайте список define'ов под них. А вот насчет других индексов то я и не подумал. Начинаю понимать. Хотя с define пока довольно туманно. Попробую додуматься сам. Спасибо! Изменено 27 мая, 2016 пользователем Drozd2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SNB 0 27 мая, 2016 Опубликовано 27 мая, 2016 · Жалоба Т.е. для Вас "камень" это то, как его представляет для Вас предоставляет компилятор? А я думал Вы системщик/железячник, а не программист. Хотя с define пока довольно туманно. Это Ваш первый проект? Курсовая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Drozd2 0 27 мая, 2016 Опубликовано 27 мая, 2016 · Жалоба Да я вообще дворник. Так, заглянул с умными людьми пообщаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SNB 0 27 мая, 2016 Опубликовано 27 мая, 2016 (изменено) · Жалоба Да я вообще дворник. Так, заглянул с умными людьми пообщаться. Не обижайтесь. Просто складывается ощущение, что это первый процессор, с которым Вы разбираетесь, и что это первая программа, которую вы пишите в своей жизни. Это так? Объясните нормально в чем проблема: Вы не знаете поддерживает ли железо данную возможность или вы просто не знаете как это в компиляторе написать? Т.е. у вас вопрос по архитектуре железа или по компилятору? Т.е. Вам нужен просто пример исходного кода? Т.е. Вас интересует "что конкретно я должен написать в этом долбаном компиляторе чтобы прога заработала как надо и плевать мне на архитектуру, как оно там все внутри организовано и прочее" Так? Изменено 27 мая, 2016 пользователем СНБ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
becopt 0 30 мая, 2016 Опубликовано 30 мая, 2016 · Жалоба Физически нельзя. А компоновщик и прочее - это уже все программные извраты компилятора. Я думал речь идет о возможностях непосредственно архитектуры Например, компилятор может генерировать код, который копирует вектора из флэш в RAM. А в ручную на ассемблере можно и не такие извраты делать. Но тогда в теме нужно было сразу сказать, что интересует не "железные" возможности, а софтовые извраты Что-то когда я работаю с прерываниями в pic32 у меня обработчики прерываний размещены во флеш-памяти и PC в прыгает по адресам rom. Если нужно подменить вектора - переинициализирую ebase и он начинает прыгать по другой таблице прерываний. И все во флеш. ЧЯДНТ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться