|
MSP, ISR, изменение процедуры обработки прерывания |
|
|
|
May 4 2006, 08:14
|

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

|
Допустим есть процедура обработки прерывания, описана так: #pragma vector=PORT2_VECTOR __interrupt void P2_INT_ 1(){ ... } и допустим имеется другая: __interrupt void P2_INT_ 2(){ ... } Понятно что первая будет работать так как она зарегистрирована с помощью #pragma vector А как в процесе выполнения программы (при определенных условиях) перерегистрировать (поменять) ISR на другую (с последующим возвратом первой) ? На С естественно. Ветвление внутри единой ISR непредлагать
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
|
 |
Ответов
|
May 4 2006, 10:18
|

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

|
Цитата(vvvvv @ May 4 2006, 12:38)  Вообщем можно сделать так : 1. Завести сигнал прерывания, предполагается, что это все таки сигнал сразу параллельно на два вывода порта 1 или 2. 2. Назначить этим выводам разные процедуры. 3. Все, маскируя тот или иной вывод, мы выбираем нужную процедуру. некатит. Сигналы заводить это не по теме. Устройство уже готово, его надо програмить. Грязно материтсо ненада, вектора поменять - с удовольствием, тока как это сделать посредством С ? Дело в том ,что регистрировать прерывания кроме как #pragma vector я неумею. В хелпе (IARовском) по этому поводу ничего толком ненашел. Или может кто-нить покажет как это сделать спомощью вставки асемблерной ?
--------------------
Смотреть в себя, зреть муки свои, зная, что сам ты виновник мук - вот истинное страдание. Отладка / Софокл, "Аякс".
|
|
|
|
|
May 4 2006, 12:15
|

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

|
Цитата(Kaplinsky @ May 4 2006, 17:18)  Грязно материтсо ненада, вектора поменять - с удовольствием, тока как это сделать посредством С ? Дело в том ,что регистрировать прерывания кроме как #pragma vector я неумею. В хелпе (IARовском) по этому поводу ничего толком ненашел.
Или может кто-нить покажет как это сделать спомощью вставки асемблерной ? Вектора прерываний в MSP430 лежат во флеши, сами их не поменяешь. Но можно делать дополнительную векторизацию - при прерывании в PC загружается адрес обработчика, а в обработчике просто тупой переход на нужную функцию - jump ... Хотя все-таки не понятно, что в конечном итоге требуется. Вы бы задачу обрисовали, тогда, может, народ и решение наилучшее подскажет.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 4 2006, 13:11
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Цитата(dxp @ May 4 2006, 15:15)  Хотя все-таки не понятно, что в конечном итоге требуется. Вы бы задачу обрисовали, тогда, может, народ и решение наилучшее подскажет. Одно из двух -или пытается смастерить обработчик прерываний как автомат состояний -или пытается сохранить скорость "Прямой передачи управления" и устранить излишние сохранения-восстановления контекста, как в "Передаче управления на основе программного прерывания" По идее в обработчике должна стоять команда косвенного перехода по содержимому ячейки памяти. (Если конечно мсп со своей ортогональной архитектурой поддерживает такое. ) А в теле обработчика менять содержимое этой ячейки памяти на адрес обработчика(ов)-компаньона(ов)
|
|
|
|
|
May 4 2006, 13:23
|

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

|
Цитата(ig_z @ May 4 2006, 20:11)  -или пытается сохранить скорость "Прямой передачи управления" и устранить излишние сохранения-восстановления контекста, как в "Передаче управления на основе программного прерывания"  Цитата(ig_z @ May 4 2006, 20:11)  По идее в обработчике должна стоять команда косвенного перехода по содержимому ячейки памяти. Вот я выше что-то подобное и предложил. Но... Цитата(ig_z @ May 4 2006, 20:11)  (Если конечно мсп со своей ортогональной архитектурой поддерживает такое. ) А в теле обработчика менять содержимое этой ячейки памяти на адрес обработчика(ов)-компаньона(ов) ...Но тут, имхо, трудность в том, что переход надо делать не на любую функцию, а на функцию-обработчик - чтобы компилятор (благодаря __interrupt) понял, что это не простая функция и сохранял используемые ресурсы, как положено в обработчике прерываний. Можно, конечно, наобъявлять функций с квалификатором __interrupt без указания вектора, а потом подставлять их адреса. Но предупреждений он насыпет, что тоже некузяво. Предупреждения можно подавить, но кузявее от этого не становится.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
Kaplinsky MSP, ISR May 4 2006, 08:14 VAI А если таблица векторов во флэше будет вызывать та... May 4 2006, 11:57 Kaplinsky Цитата(VAI @ May 4 2006, 14:57) А в озу В... May 4 2006, 13:00  rezident Цитата(Kaplinsky @ May 4 2006, 19:00) Сей... May 4 2006, 13:14 VAI Цитата(Kaplinsky @ May 4 2006, 18:00) Цит... May 4 2006, 13:34 Kaplinsky Цитата(VAI @ May 4 2006, 16:34) А Вы прим... May 5 2006, 09:31 ig_z Цитата(dxp @ May 4 2006, 16:23) ...Но тут... May 4 2006, 21:40 dxp Цитата(ig_z @ May 5 2006, 04:40) Цитата(d... May 5 2006, 04:12 condor Цитата(Kaplinsky @ May 4 2006, 11:14) Доп... May 4 2006, 23:11 VAI Оба варианта, в принципе одно и тоже, только 2-й в... May 5 2006, 12:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|