Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание на С
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Regbist
Здраствуйте.
Меня, как студента, волнует вопрос о прерываниях. А именно "как и с чем их едят ?" Иначе говоря, объясните, зачеи они нужны ? может есть где литература ?
и ещё.
ПОльзуюсь Keil для процессора DS80C400. когда исползую пример с прерыванием (пример не мой,а с сайта) и подгружаю файл startup.a51, то выдаётся ошибка типа "Memory spase overloop". МНе не понятно, почему происходит наложение адресов, и как от этого избавиься ?
G}{OST
Файл startup.a51 надо отредактировать в соответствии с конфигурацией памяти контроллера (и не только памяти, там много настроек).
Regbist
а не подскажешь где можно поситать про эти настройки ? или может сам сможешь пояснить немного ? smile.gif))
G}{OST
Цитата(Regbist @ Sep 28 2005, 23:54)
а не подскажешь где можно поситать про эти настройки ? или может сам сможешь пояснить немного ? smile.gif))
*

в самом файле, в комментариях
Kaplinsky
Цитата(Regbist @ Sep 28 2005, 08:46)
Здраствуйте.
Меня, как студента, волнует вопрос о прерываниях. А именно "как и с чем их едят ?" Иначе говоря,  объясните, зачеи они нужны ? может есть где литература ?
и ещё.

RTFM. Про прерывания у преподавателя лучше поспрашивай. Слишком долго обьяснять...

Цитата
ПОльзуюсь Keil  для процессора DS80C400. когда исползую пример с прерыванием (пример не мой,а с сайта) и подгружаю файл startup.a51, то выдаётся ошибка типа "Memory spase overloop". МНе не понятно, почему происходит наложение адресов, и как от этого избавиься ?
*


А чей проц ?
Убедись что Кейл у тебя крэкнутый. Хотя если ты берешь пример то даже если он не крэкнутый то должно пахать. Там в триальном ограничение по размеру кода.
Полезно будет посмотреть хелпы, лежат в папке С:\Keil\C51\HLP а также даташит к процу...
Troll
Цитата(Regbist @ Sep 28 2005, 09:46)
Здраствуйте.
Меня, как студента, волнует вопрос о прерываниях. А именно "как и с чем их едят ?" Иначе говоря,  объясните, зачеи они нужны ? может есть где литература ?
и ещё.
ПОльзуюсь Keil  для процессора DS80C400. когда исползую пример с прерыванием (пример не мой,а с сайта) и подгружаю файл startup.a51, то выдаётся ошибка типа "Memory spase overloop". МНе не понятно, почему происходит наложение адресов, и как от этого избавиься ?
*


на сайте смотри примеры:
ftp://ftp.dalsemi.com/pub/tini/ds80c400/c...ries/index.html
раздел ISR Installation - это и есть работа с прерываниями

оттуда же скачай файл startup.a51 для 400 проца
адрес начала программы в startup.a51 должен совпадать с адресом в настройках компилятора.
kolobok0
Цитата(Regbist @ Sep 28 2005, 10:46)
......волнует вопрос о прерываниях. А именно "как и с чем их едят ?" Иначе говоря,  объясните, зачеи они нужны ? ......


если коротко...

прерывания это события и всё что с ними связано. В различных OS принято выделять прерывания аппаратные и программные. Программные вызываються из того или иного куска кода OS или загруженной программы. Аппаратные - инициируються аппаратурой. Как правило в схеме с бОльшим кол-вом прерываний ставиться доп. аппаратный контроллер прерываний (например 8251 - интеловская линейка x86). Результатом прерывания с точки зрения аппаратуры - есть вход микропроцессора. В МК есть так же входа, которые можно использовать как линии прерывания (в зависимости от схемного решения). Как правило существуют основные прерывания : от последовательного порта, от внешних источников (входа), от таймера и т.п.. Как правило каждому прерыванию ставиться в соответствие определённое смещение в памяти, на адрес которого перейдёт управление МК. Чтоб упорядочить прерывания - существует иерархия прерываний и возможность их маскировать (блокировать). Подпрограммки прерываний пишуться лаконично (как выстрел smile.gif ) - хотя это не закон...

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

с уважением
(круглый)
SpiritDance
Regbist
Наконец-то дошло что на progz.ru делать нечего. wink.gif
Regbist
SpiritDance -а ты vodoopeople ?
SpiritDance
Угу cool.gif
rezident
Цитата(Regbist @ Sep 28 2005, 12:46)
Меня, как студента, волнует вопрос о прерываниях. А именно "как и с чем их едят ?" Иначе говоря,  объясните, зачеи они нужны ?
*

Прерывания нужны для обработки каких-то внешних (по отношению к МК и исполняемой программе) событий, которые неопределены во времени. Т.е. могут возникнуть когда угодно.
Make_Pic
Цитата(rezident @ Oct 20 2005, 16:08)
Цитата(Regbist @ Sep 28 2005, 12:46)
Меня, как студента, волнует вопрос о прерываниях. А именно "как и с чем их едят ?" Иначе говоря,  объясните, зачеи они нужны ?
*

Прерывания нужны для обработки каких-то внешних (по отношению к МК и исполняемой программе) событий, которые неопределены во времени. Т.е. могут возникнуть когда угодно.
*


И в дополнение неоходима моментальная реакция на это событие, временно плюнув на все остальноеwink.gif
Karol
Какое время отклика на прерывание следует ожидать у LPCxx ? По моим наблюдениям отклик на внешнее прерывание, SPI и I2C в области микросекунд. Программа на Кейл Ц во внешней RAM.
Regbist
Народ, я написал обработчик прерываний для com порта, используя Keil/ А как мне вызвать эти прерывание в программе?
к примеру задача такая:
я выполняю какие то операции в контроллере , затем мне надо всё остановить и передеть по com порту, затем опять начать считать что то в контроллере,либо котроллер что то считает , потом "Бац" и мне приходит команда по компорту,которую надо обработать и понять что это за команда,остановив при этом вычисления.

ну в итоге всё сводится к тому, как мне вызвать обработчик прерываний в программе?
и как я узнаю, что мне чтото пришло по компорту ?
Sergu
Цитата(Regbist @ Oct 30 2005, 22:01)
ну в итоге всё сводится к тому, как мне вызвать обработчик прерываний в программе? 
и как  я узнаю, что мне чтото пришло по компорту ?


Прерывание само вызовется, если вы его разрешите ;-)

Один из вариантов - в прерывании работать со спец-ми буферами на прием и передачу, а в основной программе узнавать о делах по состоянию переменных, в которых хранится кол-во байтов в этих буферах

примеры есть, например в
ISR-Driven Serial I/O V2
This example program provides you with easily configurable interrupt- driven serial I/O routines
This example works with any 8051-compatible device.
http://www.keil.com/download/files/intsio2.zip
Виктория
Цитата(Regbist @ Oct 31 2005, 00:01)
Народ, я написал обработчик прерываний для com порта, используя Keil/ А как мне вызвать эти прерывание в программе?
*

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

Вообще то в Вашем случае smile.gif , уважаемая наша молодежь, нужно с книг начинать. Можно вот эти, хотя бы

1. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. – М.: “Финансы и статистика”, 1991.
2. Фролов А.В., Фролов Г.В. Аппаратное обеспечение компьютера IBM PC. – М.: “Диалог-МИФИ”, книги 1-2, 1992. (Библиотека системного программиста; Т. 2).
3. Фролов А.В., Фролов Г.В. Программирование модемов. – М.: “Диалог-МИФИ”, 1993. (Библиотека системного программиста; Т. 4).
4. Густав Олссон, Джангуидо Пиани. Цифровые системы автоматизации и управления.- С.Петербург: “Невский диалект”, 2001.

Если у Вас уж очень серьезная необходимость, а книг нет - то могу выложить в этой ветке (кроме Джордейна).
kolobok0
Цитата(Regbist @ Oct 30 2005, 23:01)
....я написал обработчик прерываний для com порта.....А как мне вызвать эти прерывание в программе?......


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

Или вот ышо вариант... Приходящий байтик по COM порту вываливаем на шинку порта. Тут буфером никаким не пахнет. Единственный нюанс (как и везде) - заботиться о сохранности регистров проца. Ведь если Вы заюзали регистр "a" (к примеру) - то нуна сохранить старое значение. Сохранить мона либо на стэке, либо в ячейке памяти.

удачи Вам
(круглый)
Roma_te
Цитата(Regbist @ Oct 30 2005, 23:01) *
Народ, я написал обработчик прерываний для com порта, используя Keil/ А как мне вызвать эти прерывание в программе?
к примеру задача такая:
я выполняю какие то операции в контроллере , затем мне надо всё остановить и передеть по com порту,


1. Включаеш режым дебагера (CTRL+F5)
2. Ставиш брекпоинт в начале обработчика перериваний (Debug - Insert/Remove Breakpoint)
3. Запускаєшь на исполнение (F5)
В случае если биты ЕА и ЕS равны 1 после комманды SBUF=... (через определенное количество операций) твоя программа должна остановится на брекпоинте.

Цитата(Regbist @ Oct 30 2005, 23:01) *
затем опять начать считать что то в контроллере,либо котроллер что то считает , потом "Бац" и мне приходит команда по компорту,которую надо обработать и понять что это за команда,остановив при этом вычисления.


1. Включаеш режым дебагера (CTRL+F5)
2. Ставиш брекпоинт в начале обработчика перериваний (Debug - Insert/Remove Breakpoint)
3. Запускаєшь на исполнение (F5)
Для проверки обработчика на прием необходимо в окне Watch открыть переменные SBUF и RI, присваиваешь SBUF нужное значение затем присваиваешь RI 1 и программа останавливается на брек поинте.

Не забудь в конце обработчика програмно сбросить флаги ТI и RI smile.gif
san822
Цитата(Vic1 @ Oct 31 2005, 08:47) *
Вообще то в Вашем случае smile.gif , уважаемая наша молодежь, нужно с книг начинать. Можно вот эти, хотя бы

1. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. – М.: “Финансы и статистика”, 1991.
2. Фролов А.В., Фролов Г.В. Аппаратное обеспечение компьютера IBM PC. – М.: “Диалог-МИФИ”, книги 1-2, 1992. (Библиотека системного программиста; Т. 2).
3. Фролов А.В., Фролов Г.В. Программирование модемов. – М.: “Диалог-МИФИ”, 1993. (Библиотека системного программиста; Т. 4).
4. Густав Олссон, Джангуидо Пиани. Цифровые системы автоматизации и управления.- С.Петербург: “Невский диалект”, 2001.

Если у Вас уж очень серьезная необходимость, а книг нет - то могу выложить в этой ветке (кроме Джордейна).




Очень бы хотелось почитать что-нибудь о прерываниях на русском языке,
желательно с примерами на ЯП Си.
У меня по Си есть книги, но, к сожалению, в них про прерывания не сказано почти ничего.
Наверное не то читаю...
Виктория
Цитата(san822 @ Dec 14 2005, 12:51) *
Цитата(Vic1 @ Oct 31 2005, 08:47) *



Вообще то в Вашем случае smile.gif , уважаемая наша молодежь, нужно с книг начинать. Можно вот эти, хотя бы

1. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. – М.: “Финансы и статистика”, 1991.
2. Фролов А.В., Фролов Г.В. Аппаратное обеспечение компьютера IBM PC. – М.: “Диалог-МИФИ”, книги 1-2, 1992. (Библиотека системного программиста; Т. 2).
3. Фролов А.В., Фролов Г.В. Программирование модемов. – М.: “Диалог-МИФИ”, 1993. (Библиотека системного программиста; Т. 4).
4. Густав Олссон, Джангуидо Пиани. Цифровые системы автоматизации и управления.- С.Петербург: “Невский диалект”, 2001.

Если у Вас уж очень серьезная необходимость, а книг нет - то могу выложить в этой ветке (кроме Джордейна).




Очень бы хотелось почитать что-нибудь о прерываниях на русском языке,
желательно с примерами на ЯП Си.
У меня по Си есть книги, но, к сожалению, в них про прерывания не сказано почти ничего.
Наверное не то читаю...


Теоретически, для чего нужны прерывания - см. 2 главу [4]
Практически на примерах программирования на Си для IBM PC AT - глава из [2].
Последний файл - это материал из моих старых лекций (давно электронный вариант не обновляла, рассказываю студентам уже немного по другому и естеств., с примерами)

А дальше уже смотрите свою док. на используемый контроллер (принципы организации прерываний) и компилятор Си (ключевые слова типа interrupt, функции установки векторов прерываний и маскирования).
defunct
Цитата(Karol @ Oct 21 2005, 07:53) *
Какое время отклика на прерывание следует ожидать у LPCxx ? По моим наблюдениям отклик на внешнее прерывание, SPI и I2C в области микросекунд. Программа на Кейл Ц во внешней RAM.


Время отклика в первую очередь зависит от приоритета прерывания и далее от частоты кварца, настроек PLL, частоты периферийной шины... переход на обработчик FIQ LPC (в Keil) в области наносекунд (завершение текущей команды, сохранение в стек адреса возврата и переход по адресу FIQ), IRQ векторные - медленнее, а безвекторные могут откликаться, как Вы и говорите, в области микросекунд, т.к. могут откладываться до завершения обработки всех активных более высокоприоритетных прерываний плюс имеют дополнительный тормоз - потребность в программном определении источника прерывания. Реакция на прерывание не зависит от источника, будь-то внешний источник или внутренний, главное в какой слот записан вектор обработчика.
Regbist
здрасте!!! это снова я, и снова с прерываниямиsmile.gif
теперь проблема такая.
написал обработчик прерывания по com порту для микроконтроллера (DS80c400) в кейле,но при компиляции проекта прроисходит наложение адресов. #memory space overlap from c:400023h to c:400027h#. как мне избавиться от этого?
ещё такие особенности заметил при эксперименте с этим делом smile.gif
если для етого контроллера компилировать проект для его пошагового исполния в эмуляторе кейловском, то всё нормально компилируется, если же подгружать файл startup.a51(необходииый для загрузки в железо), то как раз происходит вышеуказанная путаница....

наверно я один из студентов разбираюсь с железяками в такое время, когда все остальные уже начали отмечать НГ smile.gif)))
всем удачи и с наступающим smile.gif
Regbist
UP!!
Roma_te
Цитата(Regbist @ Dec 29 2005, 14:44) *
написал обработчик прерывания по com порту для микроконтроллера (DS80c400) в кейле,но при компиляции проекта прроисходит наложение адресов. #memory space overlap from c:400023h to c:400027h#. как мне избавиться от этого?
ещё такие особенности заметил при эксперименте с этим делом smile.gif
если для етого контроллера компилировать проект для его пошагового исполния в эмуляторе кейловском, то всё нормально компилируется, если же подгружать файл startup.a51(необходииый для загрузки в железо), то как раз происходит вышеуказанная путаница....


Попробуй подгружать не startup.a51 а start390.a51 из ...Keil\C51\EXAMPLES\Dallas 390\C (я прицел его к етому сообщению)

Извиняюсь, почемуто файл с расширением A51 не цепляется (смотри предыдущее сообщение). Поетому пришлось переименовать в ТХТ (смотри атачмент).
Regbist
я подгружал файл startup400.a51 и startup390.a51 ошибка такая же sad.gif(( может в настройках Keila надо сделать что то ? пока разбираюсь с файлом startup400.a51, может там кроется истина smile.gif
Roma_te
Цитата(Regbist @ Jan 26 2006, 23:40) *
я подгружал файл startup400.a51 и startup390.a51 ошибка такая же sad.gif(( может в настройках Keila надо сделать что то ? пока разбираюсь с файлом startup400.a51, может там кроется истина smile.gif

Выложи здесь обработчик прерываний, может с ним чтото не так.
Попробуй в startup400.a51 отключить ненужные опции (следуй операторам IF ELSE) и рано или позно найдеш что тебе мешает (хотя я лично не вижу что ето может быть).
alm_
Адрес code:27h - это адрес вектора прерывания serial0. Очевидно у тебя два обработчика прерывания на этот порт (interrupt 4)

Но самое главное - бросай этот процесоор. Он не приспособлен для написания больших программ (с размером кода больне 64К) - просто не хватает сегмена data для автоматических переменных (туда помещаются аргументы функций и переменные внутри функция). Те, кто используют для этих целей сегмент xdata/hdata - извращенцы. И прочих дыр там полно - загрузчик, таймеры, выборка периферии.

Для проектов с размером коа меньше 64К Используй AVRMega, для большего - ARM7
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.