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

 
 
> MSP, ISR, изменение процедуры обработки прерывания
Kaplinsky
сообщение May 4 2006, 08:14
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 26-05-05
Из: Киев, Украина
Пользователь №: 5 426



Допустим есть процедура обработки прерывания, описана так:

#pragma vector=PORT2_VECTOR
__interrupt void P2_INT_1(){
...
}

и допустим имеется другая:

__interrupt void P2_INT_2(){
...
}

Понятно что первая будет работать так как она зарегистрирована с помощью #pragma vector

А как в процесе выполнения программы (при определенных условиях) перерегистрировать (поменять) ISR на другую (с последующим возвратом первой) ?

На С естественно.

Ветвление внутри единой ISR непредлагать smile.gif


--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vvvvv
сообщение May 4 2006, 09:38
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 342
Регистрация: 21-06-04
Пользователь №: 85



Вообщем можно сделать так :
1. Завести сигнал прерывания, предполагается, что это все таки сигнал сразу
параллельно на два вывода порта 1 или 2.
2. Назначить этим выводам разные процедуры.
3. Все, маскируя тот или иной вывод, мы выбираем нужную процедуру.
Go to the top of the page
 
+Quote Post
Kaplinsky
сообщение May 4 2006, 10:18
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 26-05-05
Из: Киев, Украина
Пользователь №: 5 426



Цитата(vvvvv @ May 4 2006, 12:38) *
Вообщем можно сделать так :
1. Завести сигнал прерывания, предполагается, что это все таки сигнал сразу
параллельно на два вывода порта 1 или 2.
2. Назначить этим выводам разные процедуры.
3. Все, маскируя тот или иной вывод, мы выбираем нужную процедуру.

некатит. Сигналы заводить это не по теме. Устройство уже готово, его надо програмить.

Грязно материтсо ненада, вектора поменять - с удовольствием, тока как это сделать посредством С ?
Дело в том ,что регистрировать прерывания кроме как #pragma vector я неумею. В хелпе (IARовском) по этому поводу ничего толком ненашел.

Или может кто-нить покажет как это сделать спомощью вставки асемблерной ?


--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание.
Отладка / Софокл, "Аякс".
Go to the top of the page
 
+Quote Post
dxp
сообщение May 4 2006, 12:15
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Kaplinsky @ May 4 2006, 17:18) *
Грязно материтсо ненада, вектора поменять - с удовольствием, тока как это сделать посредством С ?
Дело в том ,что регистрировать прерывания кроме как #pragma vector я неумею. В хелпе (IARовском) по этому поводу ничего толком ненашел.

Или может кто-нить покажет как это сделать спомощью вставки асемблерной ?

Вектора прерываний в MSP430 лежат во флеши, сами их не поменяешь. Но можно делать дополнительную векторизацию - при прерывании в PC загружается адрес обработчика, а в обработчике просто тупой переход на нужную функцию - jump ...

Хотя все-таки не понятно, что в конечном итоге требуется. Вы бы задачу обрисовали, тогда, может, народ и решение наилучшее подскажет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ig_z
сообщение May 4 2006, 13:11
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(dxp @ May 4 2006, 15:15) *
Хотя все-таки не понятно, что в конечном итоге требуется. Вы бы задачу обрисовали, тогда, может, народ и решение наилучшее подскажет.


Одно из двух
-или пытается смастерить обработчик прерываний как автомат состояний
-или пытается сохранить скорость "Прямой передачи управления" и устранить излишние сохранения-восстановления контекста, как в "Передаче управления на основе программного прерывания" biggrin.gif

По идее в обработчике должна стоять команда косвенного перехода по содержимому ячейки памяти. (Если конечно мсп со своей ортогональной архитектурой поддерживает такое. )
А в теле обработчика менять содержимое этой ячейки памяти на адрес обработчика(ов)-компаньона(ов)
Go to the top of the page
 
+Quote Post
dxp
сообщение May 4 2006, 13:23
Сообщение #6


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ig_z @ May 4 2006, 20:11) *
-или пытается сохранить скорость "Прямой передачи управления" и устранить излишние сохранения-восстановления контекста, как в "Передаче управления на основе программного прерывания" biggrin.gif

smile.gif

Цитата(ig_z @ May 4 2006, 20:11) *
По идее в обработчике должна стоять команда косвенного перехода по содержимому ячейки памяти.

Вот я выше что-то подобное и предложил. Но...

Цитата(ig_z @ May 4 2006, 20:11) *
(Если конечно мсп со своей ортогональной архитектурой поддерживает такое. )
А в теле обработчика менять содержимое этой ячейки памяти на адрес обработчика(ов)-компаньона(ов)

...Но тут, имхо, трудность в том, что переход надо делать не на любую функцию, а на функцию-обработчик - чтобы компилятор (благодаря __interrupt) понял, что это не простая функция и сохранял используемые ресурсы, как положено в обработчике прерываний. Можно, конечно, наобъявлять функций с квалификатором __interrupt без указания вектора, а потом подставлять их адреса. Но предупреждений он насыпет, что тоже некузяво. Предупреждения можно подавить, но кузявее от этого не становится. sad.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 20:34
Рейтинг@Mail.ru


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