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

 
 
> Выход из прерывания в требуемую точку
Krom
сообщение May 17 2011, 13:48
Сообщение #1


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

Группа: Свой
Сообщений: 107
Регистрация: 27-06-05
Из: Россия
Пользователь №: 6 324



Контроллер LPC1768. Задача: в определенный момент выйти из прерывания (UART) в требуемую точку, а уж оттуда потом продолжить выполнения с места, где возникло прерывание. Никаких ОС не используется.
В контроллерах семейства 8051 это делалось элементарно:
; сохраняем регистр прерываний
push IE
; запрещаем прерывания
clr EA
; берем требуемый адрес
mov DPTR,#PROCESS
; подсовываем в стек
push DPH
push DPL
; и выходим куда нужно
reti

А вот как сделать нечто подобное в Cortex M3? Как корректно передать управление нужному процессу из обработчика прерывания, да так, чтобы ничего не испортить,а затем уже из того процесса корректно вернуться в нужное место?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kovigor
сообщение May 17 2011, 15:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Krom @ May 17 2011, 16:48) *
Как корректно передать управление нужному процессу из обработчика прерывания, да так, чтобы ничего не испортить,а затем уже из того процесса корректно вернуться в нужное место?


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

Сообщение отредактировал kovigor - May 17 2011, 15:18
Go to the top of the page
 
+Quote Post
paskal
сообщение May 17 2011, 16:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(kovigor @ May 17 2011, 19:18) *
В правильно спроектированном ПО необходимости в таких действиях обычно не возникает. Продумайте структуру вашего проекта еще раз ...

Зря вы так. Есть масса задач где прыжок по определенному адресу при обработке прерывания наиболее оптимальный вариант.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 17 2011, 16:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(paskal @ May 17 2011, 20:04) *
Зря вы так. Есть масса задач где прыжок по определенному адресу при обработке прерывания наиболее оптимальный вариант.

Ну, хоть бы пример привели, а то так не интересно.
Go to the top of the page
 
+Quote Post
Krom
сообщение May 18 2011, 05:15
Сообщение #5


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

Группа: Свой
Сообщений: 107
Регистрация: 27-06-05
Из: Россия
Пользователь №: 6 324



Цитата(aaarrr @ May 17 2011, 20:19) *
Ну, хоть бы пример привели, а то так не интересно.

Пример: прерывание UART принимает пакет определенного формата (скажем, команду устройству, которая должна выполняться в фоновом режиме), которая должна быть обработана. Команда может выполняться долго, и обрабатываеть ее прямо в прерывании скажем так - не комильфо.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 18 2011, 05:22
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Krom @ May 18 2011, 09:15) *
Пример: прерывание UART принимает пакет определенного формата (скажем, команду устройству, которая должна выполняться в фоновом режиме), которая должна быть обработана. Команда может выполняться долго, и обрабатываеть ее прямо в прерывании скажем так - не комильфо.

Некрасиво обрабатывать команды в прерывании. Обычно в прерывании реализуют приёмный буфер, а разбор и обработку команды - в главном цикле (это если без ОС) или в отдельном потоке (с ОС). А фокусы с модификацией адреса возврата и прочее - это излишняя экзотика.
Go to the top of the page
 
+Quote Post
Krom
сообщение May 18 2011, 05:47
Сообщение #7


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

Группа: Свой
Сообщений: 107
Регистрация: 27-06-05
Из: Россия
Пользователь №: 6 324



Цитата(scifi @ May 18 2011, 09:22) *
Некрасиво обрабатывать команды в прерывании. Обычно в прерывании реализуют приёмный буфер, а разбор и обработку команды - в главном цикле (это если без ОС) или в отдельном потоке (с ОС). А фокусы с модификацией адреса возврата и прочее - это излишняя экзотика.

ОСи нет, а главный цикл очень сложный, с вводами с клавиатуры и т.д., и когда дойдет очередь до обработки команды - хз. В 51х все работало на ура, и здесь будет wink.gif, просто нигде не могу найти детального описания - что происходит при передаче управления обработчику прерывания и при выходе из него. Например, в поисании указано, что при передаче управления обработчику прерывания в стек автоматически помещается 8 регистров: R0-R3,LR,PC,xPSR. Смотрю в листингах:
При входе в обработчик SysTick:
64:M1504/lpc17xx_it.c **** void SysTick_Handler(void)
65:M1504/lpc17xx_it.c **** {
200 .loc 1 65 0
201 .cfi_startproc
202 @ args = 0, pretend = 0, frame = 0
203 @ frame_needed = 1, uses_anonymous_args = 0
204 @ link register save eliminated.
205 0000 80B4 push {r7}
206 .LCFI14:
207 .cfi_def_cfa_offset 4
208 .cfi_offset 7, -4
209 0002 00AF add r7, sp, #0

При выходе:
248 .loc 1 74 0
249 0068 BD46 mov sp, r7
250 006a 80BC pop {r7}
251 006c 7047 bx lr
252 .cfi_endproc


Нигде нет обработки этих самых 8 регистров в стеке. Они отрабатываюся автомачически самим контроллером или? Мне бы мануал детальный найти...



Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Krom   Выход из прерывания в требуемую точку   May 17 2011, 13:48
- - scifi   Цитата(Krom @ May 17 2011, 17:48) Контрол...   May 17 2011, 14:04
|- - paskal   Цитата(aaarrr @ May 17 2011, 20:19) Ну, х...   May 17 2011, 18:15
||- - ReAl   Цитата(paskal @ May 17 2011, 21:15) А вот...   May 17 2011, 18:51
|||- - paskal   Цитата(ReAl @ May 17 2011, 22:51) Что-то ...   May 17 2011, 19:14
|||- - AHTOXA   Цитата(paskal @ May 18 2011, 01:14) Конеч...   May 17 2011, 20:04
||- - KnightIgor   Цитата(paskal @ May 17 2011, 20:15) А вот...   May 17 2011, 18:55
||- - ReAl   Цитата(paskal @ May 17 2011, 21:15) Друго...   May 17 2011, 19:05
|- - VslavX   Цитата(aaarrr @ May 17 2011, 19:19) Ну, х...   May 17 2011, 19:10
|- - scifi   Цитата(Krom @ May 18 2011, 09:47) а главн...   May 18 2011, 06:17
|- - Krom   Цитата(scifi @ May 18 2011, 10:17) И кост...   May 18 2011, 06:50
- - VladislavS   Кусок кода, который используется и в прерывании, и...   May 17 2011, 15:41
|- - klen   редизайн системы однозначно, и чем раньше тем мень...   May 17 2011, 15:49
- - brag   Сохранить адрес возврата (в регистре или в памяти,...   May 17 2011, 16:21
- - AHTOXA   Цитата(Krom @ May 17 2011, 19:48) Контрол...   May 17 2011, 17:11
|- - Krom   Цитата(AHTOXA @ May 17 2011, 21:11) практ...   May 18 2011, 05:26
|- - scifi   Цитата(Krom @ May 18 2011, 09:26) Команды...   May 18 2011, 05:30
- - Александр_С   А кто вам мешает использовать указатель на функцию...   May 17 2011, 19:00
- - scifi   В дополнение к вышесказанному: "Преждевременн...   May 17 2011, 19:10
- - ReAl   Цитата(Krom @ May 17 2011, 16:48) ; сохра...   May 17 2011, 21:09
- - _Pasha   Цитата(Krom @ May 18 2011, 08:15) Пример:...   May 18 2011, 05:34
- - Александр_С   Переключаться на другую задачю всегда надо через P...   May 18 2011, 07:01
|- - Krom   Цитата(Александр_С @ May 18 2011, 11:01) ...   May 18 2011, 07:14
- - Александр_С   //Формирование прерывания "PendSV_Handler...   May 18 2011, 07:15
- - VladislavS   Можно перед выходом из прерывания настроить таймер...   May 18 2011, 07:34
- - brag   ЦитатаТо есть, ваш вариант "в определенный мо...   May 18 2011, 12:24
|- - _Pasha   Цитата(brag @ May 18 2011, 15:24) все быс...   May 18 2011, 14:56
- - d__   Можно попробовать механизм setjmp & longjmp. П...   May 19 2011, 06:35
- - zovsilab   Правильно ли сделал запись по формированию и вызов...   May 20 2011, 11:59
- - brag   ну типа правильно, не помню только что там с приор...   May 20 2011, 12:20


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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 03:53
Рейтинг@Mail.ru


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