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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
foton6
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

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

Сообщение foton6 »

Добрый день/вечер(на выбор).

Я еще не сильно "прошаренный" в связи с чем постоянно возникают вопросы, но стараюсь их решать самостоятельно, а если не выходит....
В общем я даже не знаю как сформулировать вопрос гуглу) (пробовал разные вариации)

Суть в том что необходимо обработать некоторое прерывание, адрес куда обращается процессор я знаю,
а вот как на этот адрес "прикрутить" обработчик не знаю(((
Я так понимаю "прикрутить" функцию к адресу можно только при помощи ассемблера или можно в С++ ?
Подскажите как это сделать или пните в нужном направлении)))

И еще вопрос. Работаю по Ж-тагу, в результате вся программа заливается в оперативку как я понял.(при сбросе питания прогу пропадает)
Есть разница (на время отладки) во флеше программа или в оперативке?

P.S.
Все вышенаписанное может содержать ошибки так как я оооочень сильно не прошареный)
P.P.S
Проц TI TMS320 6000 серии
Реклама
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Обработка прерываний в TI

Сообщение menzoda »

Не знаю как в 6000-й серии, но в 2000-й, которую мы используем, есть контроллер прерываний, который содержит набор регистров с адресами обработчиков. Доступ к регистрам, как и в случае любой другой периферии - с помощью стандартных средств языков C/C++ или ассемблера.

В некоторых микроконтроллерах таблица векторов прерываний статическая (не знаю есть ли такой термин, сам только что придумал), то есть существуют определенный набор адресов, к которым обращается контроллер прерываний. Чтобы установить обработчик нужно настроить проект так, чтобы в итоговой прошивке в этом месте находился адрес обработчика.
foton6 писал(а):И еще вопрос. Работаю по Ж-тагу, в результате вся программа заливается в оперативку как я понял.
Не обязательно, и более того - я такого не встречал. Обычно, сначала в в оперативную память заливается небольшой загрузчик, уже он получает прошивку и программирует flash. В оперативную память программа может заливаться только в том случае, если ты соответствующим образом настроил проект. То есть программа для МК - это не такая штука, чтобы работать из любого места, куда её записали.

Разница есть. Во-первых, как я же сказал, без дополнительных манипуляций программа просто не запуститься, если её записать не туда. Во-вторых, в оперативной памяти программа (обычно) выполняется в несколько раз быстрее, важно ли это в твоем случае я не знаю. Например, если ты любишь прошу прощения поговнокодить на примитивных задержках, то тогда твои времена поплывут. В третьих, при отладке из flash могут иметь место ограничения на количество точек останова. Кроме этого никаких отличий быть не должно.

Как ты понял, что программа пропадает? Может она просто не запускается? Это возможно при неправильной настройке проекта: отладчик может читерить и после заливки ПО сразу перепрыгивать на начало программы, пропуская всю лабуду со сбросом контроллера и возникновением прерывания. Соответственно без отладчика, если ты намудрил с таблицей прерываний, у тебя ничего не получиться.
Реклама
foton6
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Re: Обработка прерываний в TI

Сообщение foton6 »

Да таблица всегда одна и имеет 15 прерываний +1какоето прерывание по исключениям(или как то так).
Эти 15 прерываний формируются из 128 системных событий (тут как сам настроишь).
Вот мне и интересно как привязать программу к определенным адресам.
Я умею только на адреса ссылаться как на переменные(не знаю как правильно сказать):

Код: Выделить всё

#define DRR1_SPI		0x02900000
*(int*)DRR1_SPI =0x0001;
А как функцию привязать?(гуглю-гуглю может найду)
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Обработка прерываний в TI

Сообщение menzoda »

Я тут нашел код с куском таблицы прерываний в документе "TMS320C6000 Tools: Vector Table and Boot ROM Creation":

Код: Выделить всё

         .sect vectors
         
RESET:   MVK .S2 Start, B0 ; Load Start address
         MVKH .S2 Start, B0 ; Load Start address
         B .S2 B0 ; Branch to start
         NOP
         NOP
         NOP
         NOP
         NOP

NMI_ISR: MVK .S2 Nmi_isr, B0
         MVKH .S2 Nmi_isr, B0
         B .S2 B0
         NOP
         NOP
         NOP
         NOP
         NOP
Она не совсем обычная, потому что на каждое прерывание резервирует аж 8 инструкций. Если обработчики прерываний короткие, то их можно разместить прямо в этой таблице, если обработчик не помещается, то там должна находится инструкция перехода к нему (сам обработчик может быть где угодно).

Таблицу обычно реализуют на ассемблере и размещают её в отдельной секции (в данном случае с именем "vectors"). Это нужно для того, чтобы на этапе компоновки программы разместить таблицу в требуемом месте, в данном случае по нулевому адресу. Для этого обычно используют так называемой скрипт компоновщика, специальный настроечный файлик, в котором мы указываем по какому адресу поместить каждую секцию. В простых случаях эту информацию можно указать в виде аргументов командной строки при вызове компоновщика.

Для того чтобы привязать обработчик к требуемому прерыванию нужно сделать что-то типа такого:

Код: Выделить всё

...
         .global  my_nmi_handler
NMI_ISR: MVK .S2 my_nmi_handler, B0
         MVKH .S2 my_nmi_handler, B0
         B .S2 B0
         NOP
         NOP
         NOP
         NOP
         NOP
...
Я не уверен в точности синтаксиса, но смысл должен быть таким же. Если говорить по простому, то я тут указал, что где-то в программе есть метка с именем "my_nmi_handler". В таблицу векторов прерываний в соответствующем месте я поместил три инструкции, которые загружают адрес метки и выполняют переход по этому адресу. Соответственно в каком-нибудь си-файле нужно реализовать функцию с таким же именем, что-то типа:

Код: Выделить всё

void my_nmi_handler(void)
{
    ...
}
Тут может быть несколько тонких моментов. Во-первых, перед функцией может потребоваться указать какой-нибудь атрибут, сигнализирующий о том, что это не просто функция, а обработчик прерывания:

Код: Выделить всё

__irq void my_nmi_handler(void)
{
    ...
}
Во-вторых, имена в ассемблере и в си могут не совпадать. По крайней мере в том тулчейне, что мы используем для нашего МК, метка "_some_name" в ассемблере соответствует функции "some_name" в си, то есть в ассемблерном файле нужно добавлять нижнее подчеркивание ко всем меткам, соответствующим функциям в си. В третьих, если хочешь использовать функцию C++, то она должна быть с атрибутом extern "C". В четвертых, там может быть еще десять тонкостей, поэтому нужно внимательно прочитать все документы и посмотреть готовые примеры.
Реклама
Эиком - электронные компоненты и радиодетали
foton6
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Re: Обработка прерываний в TI

Сообщение foton6 »

Спасибо )
#пауза связанная с параличом мозга....



Блин с "атмег" перелезть на 32-битный проц другой компании без знания ассемблера и английского
весьма занятно)))))

почти месяц разбирался чтобы поработать с SD флешкой (и это без EDMA и прерываний).
Ну продолжу)))
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Обработка прерываний в TI

Сообщение YS »

Без знания английского сейчас вообще тяжело заниматься электроникой на уровне выше дилетантского. Английский для инженера - как латынь для врачей, только еще более необходимо. Одна радость, если человек всерьез хочет расти, то язык он выучит вне зависимости от желания - это придет с практикой (проверено лично).
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
foton6
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Re: Обработка прерываний в TI

Сообщение foton6 »

Да по немногу то учится язык)
Но как то пока времени не находится на карусы или что-то т.п. (работа/учеба на вечерке) .

С прерываниями разобрался)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Обработка прерываний в TI

Сообщение YS »

Честно сказать, я не встречал курсов именно по технической лексике, хотя, наверное, они должны где-то быть. Так что познавал большинство терминов методом тыка, по контексту. Ну а обычные переводчики склонны переводить вещи вроде, например, common mode voltage (синфазное напряжение) как "напряжение общего вида". :))) Чесслово, сам видел в достаточно серьезной презентации такой перевод. Плакал. :facepalm: Так что верить переводам никак нельзя. Косой перевод - потенциальная причина головной боли при отладке.

А наша преподша как-то перевела cold fusion (холодный термоядерный синтез) как "холодная пайка". Кстати, собственно "холодная пайка" (некачественное паяное соединение) по-английски - dry joint.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
foton6
Встал на лапы
Сообщения: 146
Зарегистрирован: Вс сен 16, 2012 22:00:40

Re: Обработка прерываний в TI

Сообщение foton6 »

Я тут с промто-гуглом сижу и ухохатываюсь)
Курсы не технические, а обычные надо. Я вообще "как бы" немецкий учил.
Мне чтобы в переводчик с каждой мелочью не лазить знать общий "ход" предложения, а корректный перевод технических слов уже какраз гуглить.
Ответить

Вернуться в «Разные вопросы по МК»