Обработка прерываний в TI
Обработка прерываний в TI
Добрый день/вечер(на выбор).
Я еще не сильно "прошаренный" в связи с чем постоянно возникают вопросы, но стараюсь их решать самостоятельно, а если не выходит....
В общем я даже не знаю как сформулировать вопрос гуглу) (пробовал разные вариации)
Суть в том что необходимо обработать некоторое прерывание, адрес куда обращается процессор я знаю,
а вот как на этот адрес "прикрутить" обработчик не знаю(((
Я так понимаю "прикрутить" функцию к адресу можно только при помощи ассемблера или можно в С++ ?
Подскажите как это сделать или пните в нужном направлении)))
И еще вопрос. Работаю по Ж-тагу, в результате вся программа заливается в оперативку как я понял.(при сбросе питания прогу пропадает)
Есть разница (на время отладки) во флеше программа или в оперативке?
P.S.
Все вышенаписанное может содержать ошибки так как я оооочень сильно не прошареный)
P.P.S
Проц TI TMS320 6000 серии
Я еще не сильно "прошаренный" в связи с чем постоянно возникают вопросы, но стараюсь их решать самостоятельно, а если не выходит....
В общем я даже не знаю как сформулировать вопрос гуглу) (пробовал разные вариации)
Суть в том что необходимо обработать некоторое прерывание, адрес куда обращается процессор я знаю,
а вот как на этот адрес "прикрутить" обработчик не знаю(((
Я так понимаю "прикрутить" функцию к адресу можно только при помощи ассемблера или можно в С++ ?
Подскажите как это сделать или пните в нужном направлении)))
И еще вопрос. Работаю по Ж-тагу, в результате вся программа заливается в оперативку как я понял.(при сбросе питания прогу пропадает)
Есть разница (на время отладки) во флеше программа или в оперативке?
P.S.
Все вышенаписанное может содержать ошибки так как я оооочень сильно не прошареный)
P.P.S
Проц TI TMS320 6000 серии
- Реклама
Re: Обработка прерываний в TI
Не знаю как в 6000-й серии, но в 2000-й, которую мы используем, есть контроллер прерываний, который содержит набор регистров с адресами обработчиков. Доступ к регистрам, как и в случае любой другой периферии - с помощью стандартных средств языков C/C++ или ассемблера.
В некоторых микроконтроллерах таблица векторов прерываний статическая (не знаю есть ли такой термин, сам только что придумал), то есть существуют определенный набор адресов, к которым обращается контроллер прерываний. Чтобы установить обработчик нужно настроить проект так, чтобы в итоговой прошивке в этом месте находился адрес обработчика.
Разница есть. Во-первых, как я же сказал, без дополнительных манипуляций программа просто не запуститься, если её записать не туда. Во-вторых, в оперативной памяти программа (обычно) выполняется в несколько раз быстрее, важно ли это в твоем случае я не знаю. Например, если ты любишь прошу прощения поговнокодить на примитивных задержках, то тогда твои времена поплывут. В третьих, при отладке из flash могут иметь место ограничения на количество точек останова. Кроме этого никаких отличий быть не должно.
Как ты понял, что программа пропадает? Может она просто не запускается? Это возможно при неправильной настройке проекта: отладчик может читерить и после заливки ПО сразу перепрыгивать на начало программы, пропуская всю лабуду со сбросом контроллера и возникновением прерывания. Соответственно без отладчика, если ты намудрил с таблицей прерываний, у тебя ничего не получиться.
В некоторых микроконтроллерах таблица векторов прерываний статическая (не знаю есть ли такой термин, сам только что придумал), то есть существуют определенный набор адресов, к которым обращается контроллер прерываний. Чтобы установить обработчик нужно настроить проект так, чтобы в итоговой прошивке в этом месте находился адрес обработчика.
Не обязательно, и более того - я такого не встречал. Обычно, сначала в в оперативную память заливается небольшой загрузчик, уже он получает прошивку и программирует flash. В оперативную память программа может заливаться только в том случае, если ты соответствующим образом настроил проект. То есть программа для МК - это не такая штука, чтобы работать из любого места, куда её записали.foton6 писал(а):И еще вопрос. Работаю по Ж-тагу, в результате вся программа заливается в оперативку как я понял.
Разница есть. Во-первых, как я же сказал, без дополнительных манипуляций программа просто не запуститься, если её записать не туда. Во-вторых, в оперативной памяти программа (обычно) выполняется в несколько раз быстрее, важно ли это в твоем случае я не знаю. Например, если ты любишь прошу прощения поговнокодить на примитивных задержках, то тогда твои времена поплывут. В третьих, при отладке из flash могут иметь место ограничения на количество точек останова. Кроме этого никаких отличий быть не должно.
Как ты понял, что программа пропадает? Может она просто не запускается? Это возможно при неправильной настройке проекта: отладчик может читерить и после заливки ПО сразу перепрыгивать на начало программы, пропуская всю лабуду со сбросом контроллера и возникновением прерывания. Соответственно без отладчика, если ты намудрил с таблицей прерываний, у тебя ничего не получиться.
Re: Обработка прерываний в TI
Да таблица всегда одна и имеет 15 прерываний +1какоето прерывание по исключениям(или как то так).
Эти 15 прерываний формируются из 128 системных событий (тут как сам настроишь).
Вот мне и интересно как привязать программу к определенным адресам.
Я умею только на адреса ссылаться как на переменные(не знаю как правильно сказать):
А как функцию привязать?(гуглю-гуглю может найду)
Эти 15 прерываний формируются из 128 системных событий (тут как сам настроишь).
Вот мне и интересно как привязать программу к определенным адресам.
Я умею только на адреса ссылаться как на переменные(не знаю как правильно сказать):
Код: Выделить всё
#define DRR1_SPI 0x02900000
*(int*)DRR1_SPI =0x0001;Re: Обработка прерываний в TI
Я тут нашел код с куском таблицы прерываний в документе "TMS320C6000 Tools: Vector Table and Boot ROM Creation":
Она не совсем обычная, потому что на каждое прерывание резервирует аж 8 инструкций. Если обработчики прерываний короткие, то их можно разместить прямо в этой таблице, если обработчик не помещается, то там должна находится инструкция перехода к нему (сам обработчик может быть где угодно).
Таблицу обычно реализуют на ассемблере и размещают её в отдельной секции (в данном случае с именем "vectors"). Это нужно для того, чтобы на этапе компоновки программы разместить таблицу в требуемом месте, в данном случае по нулевому адресу. Для этого обычно используют так называемой скрипт компоновщика, специальный настроечный файлик, в котором мы указываем по какому адресу поместить каждую секцию. В простых случаях эту информацию можно указать в виде аргументов командной строки при вызове компоновщика.
Для того чтобы привязать обработчик к требуемому прерыванию нужно сделать что-то типа такого:
Я не уверен в точности синтаксиса, но смысл должен быть таким же. Если говорить по простому, то я тут указал, что где-то в программе есть метка с именем "my_nmi_handler". В таблицу векторов прерываний в соответствующем месте я поместил три инструкции, которые загружают адрес метки и выполняют переход по этому адресу. Соответственно в каком-нибудь си-файле нужно реализовать функцию с таким же именем, что-то типа:
Тут может быть несколько тонких моментов. Во-первых, перед функцией может потребоваться указать какой-нибудь атрибут, сигнализирующий о том, что это не просто функция, а обработчик прерывания:
Во-вторых, имена в ассемблере и в си могут не совпадать. По крайней мере в том тулчейне, что мы используем для нашего МК, метка "_some_name" в ассемблере соответствует функции "some_name" в си, то есть в ассемблерном файле нужно добавлять нижнее подчеркивание ко всем меткам, соответствующим функциям в си. В третьих, если хочешь использовать функцию C++, то она должна быть с атрибутом extern "C". В четвертых, там может быть еще десять тонкостей, поэтому нужно внимательно прочитать все документы и посмотреть готовые примеры.
Код: Выделить всё
.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
Таблицу обычно реализуют на ассемблере и размещают её в отдельной секции (в данном случае с именем "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
...
Код: Выделить всё
void my_nmi_handler(void)
{
...
}
Код: Выделить всё
__irq void my_nmi_handler(void)
{
...
}
Re: Обработка прерываний в TI
Спасибо )
#пауза связанная с параличом мозга....
Блин с "атмег" перелезть на 32-битный проц другой компании без знания ассемблера и английского
весьма занятно)))))
почти месяц разбирался чтобы поработать с SD флешкой (и это без EDMA и прерываний).
Ну продолжу)))
#пауза связанная с параличом мозга....
Блин с "атмег" перелезть на 32-битный проц другой компании без знания ассемблера и английского
весьма занятно)))))
почти месяц разбирался чтобы поработать с SD флешкой (и это без EDMA и прерываний).
Ну продолжу)))
- Реклама
Re: Обработка прерываний в TI
Без знания английского сейчас вообще тяжело заниматься электроникой на уровне выше дилетантского. Английский для инженера - как латынь для врачей, только еще более необходимо. Одна радость, если человек всерьез хочет расти, то язык он выучит вне зависимости от желания - это придет с практикой (проверено лично).
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Обработка прерываний в TI
Да по немногу то учится язык)
Но как то пока времени не находится на карусы или что-то т.п. (работа/учеба на вечерке) .
С прерываниями разобрался)
Но как то пока времени не находится на карусы или что-то т.п. (работа/учеба на вечерке) .
С прерываниями разобрался)
Re: Обработка прерываний в TI
Честно сказать, я не встречал курсов именно по технической лексике, хотя, наверное, они должны где-то быть. Так что познавал большинство терминов методом тыка, по контексту. Ну а обычные переводчики склонны переводить вещи вроде, например, common mode voltage (синфазное напряжение) как "напряжение общего вида".
Чесслово, сам видел в достаточно серьезной презентации такой перевод. Плакал.
Так что верить переводам никак нельзя. Косой перевод - потенциальная причина головной боли при отладке.
А наша преподша как-то перевела cold fusion (холодный термоядерный синтез) как "холодная пайка". Кстати, собственно "холодная пайка" (некачественное паяное соединение) по-английски - dry joint.
А наша преподша как-то перевела cold fusion (холодный термоядерный синтез) как "холодная пайка". Кстати, собственно "холодная пайка" (некачественное паяное соединение) по-английски - dry joint.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Обработка прерываний в TI
Я тут с промто-гуглом сижу и ухохатываюсь)
Курсы не технические, а обычные надо. Я вообще "как бы" немецкий учил.
Мне чтобы в переводчик с каждой мелочью не лазить знать общий "ход" предложения, а корректный перевод технических слов уже какраз гуглить.
Курсы не технические, а обычные надо. Я вообще "как бы" немецкий учил.
Мне чтобы в переводчик с каждой мелочью не лазить знать общий "ход" предложения, а корректный перевод технических слов уже какраз гуглить.


