| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Как прервать функцию?
27.12.2011, 20:54
|
|
|
Частый гость
Регистрация: 22.09.2008
Сообщений: 25
Сказал спасибо: 8
Сказали Спасибо 16 раз(а) в 9 сообщении(ях)
|
Как прервать функцию?
вопрос ламерский, но... Как перевать функцию не теряя ее данных?
в некой функции вызваной по прерыванию я сортирую масив. В процессе сортировки необходимо разрывать выполнение функции и передавать управление обработчику задач. потом возвращатся и продолжать обработку масива. Как разорвать функцию сортировки так, чтобы после возврата не потерять значения индексов масива, результат и .т. и (желателно) вернутся в туже точку выполнения.
Грубо говоря сделать програмный аналог прерывания. Делать все переменные глобальными не могу.
LPC1768 + Keil 4.22a
|
|
|
|
27.12.2011, 21:17
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 23.09.2008
Адрес: Козьмодемьянск. Это на Волге.
Сообщений: 2,446
Сказал спасибо: 5,259
Сказали Спасибо 1,054 раз(а) в 614 сообщении(ях)
|
Re: Как прервать функцию?
По любому придется запоминать в глобальных переменных, например, в массиве (структуре). При входе в функцию проверяете - это новый вход или возврат из основной функции и соответственно инициализируете локальные переменные.
|
|
|
|
27.12.2011, 21:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 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.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от fFerum
|
|
(Таймеры уже заняты, их использовать не получится.)
|
Пересмотрите концепцию таймеров. Если у вас по одному таймеру на задачу, это расточительство. Впрочем, это уже даже не мое дело.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
27.12.2011, 22:51
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от fFerum
|
|
Таймеры уже заняты, их использовать не получится
|
Остался SYSTICK... 
На его основе вполне можно замутить... целую ОС...
|
|
|
|
28.12.2011, 02:03
|
|
|
Гуру портала
Регистрация: 22.02.2008
Адрес: Ukraine, Полтава
Сообщений: 10,454
Сказал спасибо: 5,999
Сказали Спасибо 26,913 раз(а) в 6,082 сообщении(ях)
|
Re: Как прервать функцию?
Зачем переменные делать глобальными?? Чем не устраивает тип STATIC ? Все сохраняются внутри функции нетронутыми..
|
|
|
|
28.12.2011, 07:26
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Как прервать функцию?
Сообщение от Eddy71
|
|
Зачем переменные делать глобальными?? Чем не устраивает тип STATIC ? Все сохраняются внутри функции нетронутыми..
|
А по сути, чем GLOBAL от STATIC отличаются?  Я имею ввиду по расходу памяти. И то и другое - суть статические переменные, отнимающие место и не допускающие затирания, в отличие от динамических, располагающихся на стеке (стеках) и существующие только на время выполнения функций.
Разве что разными способами обращения к ним, да и то, на усмотрение компиляторов...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
28.12.2011, 07:50
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
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, время: 06:50.
|
|