реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как послать программное прерывание?
inventor
сообщение May 19 2015, 10:28
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Вобщем задача такая:
есьт несколько устройств, которые работают по прерыванием,
мне нужно что то подобное функции raise()
для посылания сигнала (программного прерывания)
которая будет выполняться
приоритетом выше основной программы и ниже чем аппаратных прерываний.
Есть возможность это сделать?
Go to the top of the page
 
+Quote Post
Kabdim
сообщение May 19 2015, 11:06
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



несколько устройств каждый со своим контроллером и контролеры обеденны сетью?
несколько устройств на шине(на какой?) подключены к контроллеру?
требования по скорости реакции?
Go to the top of the page
 
+Quote Post
inventor
сообщение May 19 2015, 11:20
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Kabdim @ May 19 2015, 14:06) *
несколько устройств каждый со своим контроллером и контролеры обеденны сетью?
несколько устройств на шине(на какой?) подключены к контроллеру?
требования по скорости реакции?

несколько АЦП и тому подобная периферия.
raise() нужно вызывать примерно раз в несколько секунд
для выполнения полусекунной задачи
чтобы не прерывалось обработка прерываний от АЦП
и чтобы функция, которая вызвана по raise() была
приоритетом выше программы main()
Go to the top of the page
 
+Quote Post
Kabdim
сообщение May 19 2015, 11:23
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Обычно в контроллерах можно настроить приоритеты прерываний. Беретё таймер, настраиваете ему желаемый период и наименьший приоритет и в обработчике делаете свою задачу.
Go to the top of the page
 
+Quote Post
inventor
сообщение May 19 2015, 11:29
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



не...так нельзя.
ADC собирает данные, я из отправляю в raise() задаче на sd карту.
если карта полудохлая - то время записи на нее может меняться.
я так понимаю можно пользоваться как то PendSV или SVC_handle как то
но можно его настроить, что его приоритет быль меньше чем у всего остального?
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 19 2015, 13:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(inventor @ May 19 2015, 17:29) *
я так понимаю можно пользоваться как то PendSV или SVC_handle как то
но можно его настроить, что его приоритет быль меньше чем у всего остального?

Можно и PendSV если у Вас нет ОС, можно и любое другое неиспользуемое аппаратное прерывание. Выставляете нужные приоритеты и вперёд. Читайте описание NVIC - там всё есть. Если у Вас конечно Cortex.
Но для такой задачи лучше использовать любую RTOS.
Go to the top of the page
 
+Quote Post
inventor
сообщение May 19 2015, 18:00
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(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.
Go to the top of the page
 
+Quote Post
adnega
сообщение May 19 2015, 20:43
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(inventor @ May 19 2015, 14:29) *
если карта полудохлая - то время записи на нее может меняться.

Нет объективных причин ждать и ничего не делать пока карта готовится к записи.
У меня работа с sd-картой построена так, что в mainloop я вызываю асинхронные запросы для карты (выполняются очень быстро),
а она по результату выполнения вызывает callback. Вся основная работа выполнена через прерывания и DMA. Причем интерфейс
подключения хоть SDIO, хоть SPI. Советую подумать над архитектурой или задействовать RTOS. Ждать у моря погоды - дурной
тон в программировании.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 20 2015, 05:32
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(inventor @ May 20 2015, 00:00) *
завтра буду разбираца как и почему это работает
так как ни на какой обработчик не попадает

Ещё раз: читать Вам нужно User manual на ядро Cortex, раздел посвящённый NVIC. Там есть как программно возбудить аппаратное прерывание.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016