Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.12.2011, 20:54
|
|
Частый гость
Регистрация: 22.09.2008
Сообщений: 25
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 9 сообщении(ях)
|
Как прервать функцию?
вопрос ламерский, но... Как перевать функцию не теряя ее данных?
в некой функции вызваной по прерыванию я сортирую масив. В процессе сортировки необходимо разрывать выполнение функции и передавать управление обработчику задач. потом возвращатся и продолжать обработку масива. Как разорвать функцию сортировки так, чтобы после возврата не потерять значения индексов масива, результат и .т. и (желателно) вернутся в туже точку выполнения.
Грубо говоря сделать програмный аналог прерывания. Делать все переменные глобальными не могу.
LPC1768 + Keil 4.22a
|
|
|
|
27.12.2011, 21:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 23.09.2008
Адрес: Козьмодемьянск. Это на Волге.
Сообщений: 2,368
Сказал спасибо: 5,520
Сказали Спасибо 1,042 раз(а) в 599 сообщении(ях)
|
Re: Как прервать функцию?
По любому придется запоминать в глобальных переменных, например, в массиве (структуре). При входе в функцию проверяете - это новый вход или возврат из основной функции и соответственно инициализируете локальные переменные.
|
|
|
|
27.12.2011, 21:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от fFerum
|
вопрос ламерский, но... Как перевать функцию не теряя ее данных?
в некой функции вызваной по прерыванию я сортирую масив. В процессе сортировки необходимо разрывать выполнение функции и передавать управление обработчику задач. потом возвращатся и продолжать обработку масива. Как разорвать функцию сортировки так, чтобы после возврата не потерять значения индексов масива, результат и .т. и (желателно) вернутся в туже точку выполнения.
Грубо говоря сделать програмный аналог прерывания. Делать все переменные глобальными не могу.
LPC1768 + Keil 4.22a
|
Наверное, не совсем хорошо в теле обработчика выполнять сортировку. Надо стремится к минимизации обработчиков. Пусть они семафорят фоновой задаче, а та уже разложит приоритеты. И тогда проблем прерывания не будет. А в вашем случае от сохранения контента никуда не деться.
Не совсем понятно "разорвать функцию сортировки". Что ее должно разрывать? Кроме другого прерывания? Или ваша сортировка следит за какими-то флагами, и увидев флаг бегом делать что-то важнее сортировки? Непонятно.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
27.12.2011, 21:44
|
|
Частый гость
Регистрация: 22.09.2008
Сообщений: 25
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 9 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от ut1wpr
|
Наверное, не совсем хорошо в теле обработчика выполнять сортировку. Надо стремится к минимизации обработчиков. Пусть они семафорят фоновой задаче, а та уже разложит приоритеты. И тогда проблем прерывания не будет. А в вашем случае от сохранения контента никуда не деться.
Не совсем понятно "разорвать функцию сортировки". Что ее должно разрывать? Кроме другого прерывания? Или ваша сортировка следит за какими-то флагами, и увидев флаг бегом делать что-то важнее сортировки? Непонятно.
|
Обработчик запускает функцию сортировки.
Да, вы правы, необходимо отслеживать ряд флагов, причем сортировка имеет не самый высокий приоритет т.е. имеет место подобие ОС. Касательно сохранения понял.. попробую конечно извратится на асме, посмотрю что получится.
(Таймеры уже заняты, их использовать не получится.)
|
|
|
|
27.12.2011, 22:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от fFerum
|
(Таймеры уже заняты, их использовать не получится.)
|
Пересмотрите концепцию таймеров. Если у вас по одному таймеру на задачу, это расточительство. Впрочем, это уже даже не мое дело.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
27.12.2011, 22:51
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от fFerum
|
Таймеры уже заняты, их использовать не получится
|
Остался SYSTICK...
На его основе вполне можно замутить... целую ОС...
|
|
|
|
28.12.2011, 02:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,534
Сказал спасибо: 5,378
Сказали Спасибо 24,642 раз(а) в 5,542 сообщении(ях)
|
Re: Как прервать функцию?
Зачем переменные делать глобальными?? Чем не устраивает тип STATIC ? Все сохраняются внутри функции нетронутыми..
|
|
|
|
28.12.2011, 07:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от Eddy71
|
Зачем переменные делать глобальными?? Чем не устраивает тип STATIC ? Все сохраняются внутри функции нетронутыми..
|
А по сути, чем GLOBAL от STATIC отличаются? Я имею ввиду по расходу памяти. И то и другое - суть статические переменные, отнимающие место и не допускающие затирания, в отличие от динамических, располагающихся на стеке (стеках) и существующие только на время выполнения функций.
Разве что разными способами обращения к ним, да и то, на усмотрение компиляторов...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
28.12.2011, 07:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Как прервать функцию?
В прерывании устанавливайте флаг прерывания и все, в основном цикле неторопливо сортируйте все что надо
|
|
|
|
28.12.2011, 12:37
|
|
Частый гость
Регистрация: 22.09.2008
Сообщений: 25
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 9 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от st_1
|
Остался SYSTICK...
На его основе вполне можно замутить... целую ОС...
|
Благодарю! вроде как и пойдет даже. У нас и есть подобие ОС, только асинхронное. Проект не мой, я просто пишу его часть, потому кто, куда и зачем(!) прихоботил память и остальные таймеры - "не мое дело, мне надо было. я забрал", потому вот так
Переменные сохранил передавая указатель на них как аргумент обработчику(собрал в структуру) таская такой себе буфер туда/обратно. Тогда они не теряются, и память по окончанию сортировки будет освобождена.
Всем спасибо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Как выключить функцию
|
sdsrem |
Микроконтроллеры, АЦП, память и т.д |
33 |
07.12.2010 15:23 |
как написать макрос-функцию в Си Winavr
|
serb-radio |
Микроконтроллеры, АЦП, память и т.д |
7 |
30.09.2008 11:08 |
Знатокам С! Как передать в функцию порт?
|
arkbox |
Микроконтроллеры, АЦП, память и т.д |
52 |
26.02.2008 17:06 |
CVAVR передача в функцию PORTА.X как переменную
|
woroba |
Микроконтроллеры, АЦП, память и т.д |
5 |
10.12.2007 12:49 |
Знатоки Си, помогите: Как обьявить функцию?
|
Hoksmur |
Микроконтроллеры, АЦП, память и т.д |
4 |
09.10.2007 19:36 |
Часовой пояс GMT +4, время: 19:54.
|
|