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

 
 
> как поменять адрес возврата из IRQ, нужна помощь новичку((((
lons83
сообщение Mar 1 2014, 15:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296



Здравствуйте, извините если такая тема уже повторялась. Но я никак не нашел ответа:

Есть прога:
Код
#include

func1
{
....
}

func2
{
....
}

func3
{
....
}

func4
{
....
}

IRQ   // обработчик прерывания
{
....
}

int main
{

while (1)
{


func1();

func2();

func3();

func4();

}

}



Предположим выполняется func3{} в этот момент срабатывает прерывание и передается обработчику IRQ
после завершения IRQ, программа по адресу возврата возвращается к func3{}....

НО!!!!!!

Как можно с помощью языка СИ сделать чтобы после возвращения из IRQ -> выполняться стала func1{} !!! ( поменять адрес возврата ) и уже после выполнения func1{} -> вернуться к func3{}; ??????????

Делал такое на ассмеблере, а тут как-то завис....
не понятно как в этом случае использовать ассемблерные вставки... а чтение программных прерываний ( SWI и SVC ) завели меня в тупик...

Заранее спасибо.

P.S. среда программирования Keil 4 . МК: stm cortex-m3

Сообщение отредактировал lons83 - Mar 1 2014, 15:17
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Mar 1 2014, 18:22
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(lons83 @ Mar 1 2014, 17:17) *
чтобы после возвращения из IRQ -> выполняться стала func1{} !!! ( поменять адрес возврата ) и уже после выполнения func1{} -> вернуться к func3{}; ??????????

Код
IRQ   // обработчик прерывания
{
....
    func1();
}

И забыть про ассемблер.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
lons83
сообщение Mar 1 2014, 18:35
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 9-11-12
Пользователь №: 74 296



Цитата(Сергей Борщ @ Mar 1 2014, 22:22) *
Код
IRQ   // обработчик прерывания
{
....
    func1();
}

И забыть про ассемблер.


Можно и так... Только в этом случае Вы не выходите из прерывания. И если func1() не закончиться выполнятся до повторного входа в IRQ... то получиться рекурсия и через некоторое время контроллер зависает!!!!

Поэтому я и хочу чтобы переход был после выхода из прерывания
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 1 2014, 18:46
Сообщение #4


Гуру
******

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



Цитата(lons83 @ Mar 1 2014, 22:35) *
Можно и так... Только в этом случае Вы не выходите из прерывания. И если func1() не закончиться выполнятся до повторного входа в IRQ... то получиться рекурсия и через некоторое время контроллер зависает!!!!
Поэтому я и хочу чтобы переход был после выхода из прерывания

В Cortex-M3 есть программные прерывания. Можно установить флаг одного из них в IRQ,
но приоритет такого прерывания должен быть ниже приоритета IRQ. В обработчике программного
прерывания вызвать func1(). Тут и с пугающей рекурсией ничего не зависнет, просто будут потери вызовов
func1(). Честно говоря, станно все это, ибо вызов func1() получается асинхронным со всеми вытекающими.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 11:31
Рейтинг@Mail.ru


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