Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как послать программное прерывание?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
inventor
Вобщем задача такая:
есьт несколько устройств, которые работают по прерыванием,
мне нужно что то подобное функции raise()
для посылания сигнала (программного прерывания)
которая будет выполняться
приоритетом выше основной программы и ниже чем аппаратных прерываний.
Есть возможность это сделать?
Kabdim
несколько устройств каждый со своим контроллером и контролеры обеденны сетью?
несколько устройств на шине(на какой?) подключены к контроллеру?
требования по скорости реакции?
inventor
Цитата(Kabdim @ May 19 2015, 14:06) *
несколько устройств каждый со своим контроллером и контролеры обеденны сетью?
несколько устройств на шине(на какой?) подключены к контроллеру?
требования по скорости реакции?

несколько АЦП и тому подобная периферия.
raise() нужно вызывать примерно раз в несколько секунд
для выполнения полусекунной задачи
чтобы не прерывалось обработка прерываний от АЦП
и чтобы функция, которая вызвана по raise() была
приоритетом выше программы main()
Kabdim
Обычно в контроллерах можно настроить приоритеты прерываний. Беретё таймер, настраиваете ему желаемый период и наименьший приоритет и в обработчике делаете свою задачу.
inventor
не...так нельзя.
ADC собирает данные, я из отправляю в raise() задаче на sd карту.
если карта полудохлая - то время записи на нее может меняться.
я так понимаю можно пользоваться как то PendSV или SVC_handle как то
но можно его настроить, что его приоритет быль меньше чем у всего остального?
jcxz
Цитата(inventor @ May 19 2015, 17:29) *
я так понимаю можно пользоваться как то PendSV или SVC_handle как то
но можно его настроить, что его приоритет быль меньше чем у всего остального?

Можно и PendSV если у Вас нет ОС, можно и любое другое неиспользуемое аппаратное прерывание. Выставляете нужные приоритеты и вперёд. Читайте описание NVIC - там всё есть. Если у Вас конечно Cortex.
Но для такой задачи лучше использовать любую RTOS.
inventor
Цитата(jcxz @ May 19 2015, 17:03) *
Можно и PendSV если у Вас нет ОС, можно и любое другое неиспользуемое аппаратное прерывание. Выставляете нужные приоритеты и вперёд. Читайте описание NVIC - там всё есть. Если у Вас конечно Cortex.
Но для такой задачи лучше использовать любую RTOS.

я взял сделал по - тупому
у меня нет OC
сначала пытался SVCall_Handler задействовать, но ничего не получилось.
потом написал функцию

CODE

signal_handler(int num) {
***
/* востанавливаю сигнал */
signal(***)
}

в

в функции main() вызываю его как raise c различными параметрами
это работает, параметр передается в signal_handler
но никаких описаний SIG_USR1 SIG_USR2 как в Linux/Solaris я не нашел
завтра буду разбираца как и почему это работает
так как ни на какой обработчик не попадает
компилятор IAR.
adnega
Цитата(inventor @ May 19 2015, 14:29) *
если карта полудохлая - то время записи на нее может меняться.

Нет объективных причин ждать и ничего не делать пока карта готовится к записи.
У меня работа с sd-картой построена так, что в mainloop я вызываю асинхронные запросы для карты (выполняются очень быстро),
а она по результату выполнения вызывает callback. Вся основная работа выполнена через прерывания и DMA. Причем интерфейс
подключения хоть SDIO, хоть SPI. Советую подумать над архитектурой или задействовать RTOS. Ждать у моря погоды - дурной
тон в программировании.
jcxz
Цитата(inventor @ May 20 2015, 00:00) *
завтра буду разбираца как и почему это работает
так как ни на какой обработчик не попадает

Ещё раз: читать Вам нужно User manual на ядро Cortex, раздел посвящённый NVIC. Там есть как программно возбудить аппаратное прерывание.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.