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

 
 
> как поменять адрес возврата из 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
Ответов
DpInRock
сообщение Mar 2 2014, 10:36
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



ПОхоже все запутались конкретно.

До вызова прерывания выполнялась F1. После прерывания требуется выполнение F2.
ПОСЛЕ ЗАВЕРШЕНИЯ F2 - видимо, требуется продолжить F1?

Отсюда следует, что прерывание должно ЗАПОМНИТЬ контекст F1, при выходе из прерывания - заменить контекст F1 на ЗАРАНЕЕ ПОДГОТОВЛЕННЫЙ контекст F2.

И после завершения F2 - F2 - должно восстановить контекст F1.

===
Это по сути - "обычный" переключатель задач.
Это можно попытаться сделать для частного конкретного случая именно с F1 и F2.

Но по затратам кода и прочего - ничем не будет отличаться от нормального переключателя.
Ссылку на пример я приводил.

Для кортекса - у которого есть два стека, есть два режима работы процессора - можно посметреть переключать от соот. порта FreeRtos, к примеру.

Мой переключатель со всеми функциями занимает 40 строк кода на Си, и два десятка строк на ассемблере.
И это очень хорошая цена за простую многозадачность.
===============

Но правильное решение - от тов. Борща.
Если алгоритм строго детерминирован, то текст функции следует прямо вставить в обработчик.
И все страхи по поводу такого расположения должны быть исключены смыслом самого алгоритма.


Сообщение отредактировал DpInRock - Mar 2 2014, 10:48


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post



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

 


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


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