Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
13.07.2005, 20:21
|
|
RETAS
Гость
|
Можно ли очистить стек?
Ребята,скажем у меня в программе для PIC16F84A есть такая подпрограмма "А":
call pp1
call pp2
- - - - - -
- - - - - -
call pp10
В подпрограммах рр1-рр10 тоже имеются команды call.
Необходимо,при исполнении подпрограммы "А" следить за портом П (это я думаю делать
во время прерываний )и при появлении сигнала на нём,бросить всё что связанно с
рр1 - рр10 и перейти на исполнение подпрограммы "Б" без возврата в подпрограмму "А".
Однако стек останется более или менее заполнен и я непредставляю есть ли какие либо
возможности его очистки или же подобную программу следует составлять вообще иначе.
Пасоветуйте кто нибудь что нибудь.
Спасибо.
|
|
|
|
14.07.2005, 09:49
|
|
Временная регистрация
Регистрация: 06.06.2005
Сообщений: 50
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Нет, стек в этих микроконтроллерах аппаратный, програмно очистить нельзя. Если необходимо большое количество вложенных подпрограмм, то советую использовать AVR. Но впринципе если обьём свободной памяти программ достаточно большой, то всегда есть способ избавиться от вызова подпрограмм, заодно и программа быстреее работать будет.
|
|
|
|
15.07.2005, 08:46
|
|
Прохожий
Регистрация: 18.04.2005
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Кстати, интересный вопрос...
В большинстве AVR, действительно, стек програмный. А можно ли его как то очищать/изменять?
|
|
|
|
15.07.2005, 09:29
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Сообщение от AVRoschNIK
|
Кстати, интересный вопрос...
В большинстве AVR, действительно, стек програмный. А можно ли его как то очищать/изменять?
|
Можно. Но это вообще говоря шаманство. Лучше строить программу так, чтобы обойтись без бубна... Как именно - трудно дать совет, не зная задачи.
Чтобы реализовать, скажем так, псевдопараллельность - существуют прерывания... Да много вариантов решения. Если обработка короткая - там в прерывании ее и сделать. Длинная - выставить флажок в головную...
|
|
|
|
15.07.2005, 14:13
|
|
Прохожий
Регистрация: 18.04.2005
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от nml
|
Сообщение от AVRoschNIK
|
Кстати, интересный вопрос...
В большинстве AVR, действительно, стек програмный. А можно ли его как то очищать/изменять?
|
Можно. Но это вообще говоря шаманство. Лучше строить программу так, чтобы обойтись без бубна... Как именно - трудно дать совет, не зная задачи.
Чтобы реализовать, скажем так, псевдопараллельность - существуют прерывания... Да много вариантов решения. Если обработка короткая - там в прерывании ее и сделать. Длинная - выставить флажок в головную...
|
Да я понимаю, что шаманство. И сам так никогда не поступал. Даже мысли не возникало, пока не прочёл это сообщение. Вот и заинтересовался. А преравания в контроллерах действительно сильная вещь! Я когда микроконтроллеры осваивать начал - никак не мог понять, как вообще программу можно для них писать, не организовав несколько разных потоков(до этого я имел опыт написания многопотоковых программ на Delphi). А теперь мне в Dilphi постоянно хочется прерывания какие-нибудь ещё, кроме таймеров
|
|
|
|
15.07.2005, 20:32
|
|
Гость
|
Всем большое спасибо.
Хочю сказать, что прерывание никак неможет помочь,ибо нужно не исполнить какую то
подпрограму при появлении сигнала на П, а перестать исполнять подпрограмму.
Команда call - вроде бы прекрасная вещь,но моими глазами она однабока - ведь в данном
случае незачем знать откуда она появилась, это сильно раздражает и я, хотя ещё очень
зелен в контролерах,начинаю думать о них с плохой стороны.
Для тех кто неочень понял чего я хочю,приведу кривоватый но наглядный пример.
Скажем,я любитель по утрам плотненько позавтракать, изготовил комбайн готовящий мне
утром: чай,суп,блины и котлеты.Но неприятность в том ,что бывают дни когда супа ну
совсем нехочется и для этого я предусмотрел кнопку после нажатия которой приготовление
супа прекращается . Комбайн пристально должен следить за кнопкой и мигом прекратить
приготовление супа - я ведь ещё и скупой и мне незачем портить продукты, а все другие
процедуры должны продолжаться с прежним рвением как ни в чём небывало.
Я сам вижу ещё такой (возможный ли?) но неприятный выход: при нажатии кнопки
1)занести в EEPROM необходимые данные о чае,блинах и котлетах,
2)запустить собаку и дать ей время сработать,
3)программа начнётся со Старта,обнаружит кнопку и всё как-бы будет нормально.
Опять-же жду вашых мнений и советов.Ещё раз всем спасибо.
|
|
|
|
15.07.2005, 21:18
|
|
Прописка
Регистрация: 29.01.2005
Адрес: Киев
Сообщений: 227
Сказал спасибо: 50
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Как-то не пойму я Вас немного... Поконкретнее задачу, если помощь требуется. В Вашем случае просто не пойму зачем стек такой громадный. Прерывание от кнопок + все время опрашиваемая переменная флагов. Операция, которая, как я понял по Вашему замыслу, висит у Вас в стеке (эмпирическая догадка) просто не выполняется, когда доходит очередь, да и зачем тут стек, не пойму. Все операции и так по порядку выполняются...
Удачи!
__________________
Невежество всегда на что-нибудь испражняется.
|
|
|
|
17.07.2005, 21:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2003
Адрес: Москва
Сообщений: 2,531
Сказал спасибо: 737
Сказали Спасибо 1,927 раз(а) в 799 сообщении(ях)
|
Стек почистить просто - 8 вложенных call и готово Только вот что дальше будет... Ба-а-аальшой вопрос...
__________________
Опыт - это школа, в которой человек узнает, каким дураком он был раньше.
|
|
|
|
17.07.2005, 23:10
|
|
Гость
|
Можно прогу написать так чтоб она иногда поглядывала за вашим событием, тока вот быстродействие остается позади. Попробуйте сменить мелкочип на другой девайс чтонить другое, тока по поводу аналога Ф84-ому ни чего сказать не могу есть ли у АВР или кого еще такой же МК по соотношению цена 8O .
|
|
|
|
21.07.2005, 00:59
|
|
RETAS
Гость
|
Хочю поправить программу приготовления завтрака. После нажатия кнопки,комбайн должнен мигом
заняьтса приготовлением меню №2 и перестать приготавливать блюда первого меню. Утром комбайн приступает к приготовлению блюд первого меню-каждого блюда с самого начала .Задача как-бы не столько в том,что-бы быстренько заняться меню №2,а в том, чтоб недопустить исполнения далее той подпрограммы
(никогка!!!),вовремя которой была нажата кнопка.
Все подпрограммы ,исполняются паралельно (точнее,паралельно будет исполнятся завтрак),т.е. исполнив один пункт в первой ПП,идём во вторую ПП также выполнить какой-то один пункт и т.д.,прокручивая
все ПП кругом,пока все пункты во всех ПП небудут исполнены.
Бооольшое спасибо DK за "отличное" предложение-долговато мне недошло как им воспользоваться,
однако если таким образом и можно сделать очистку,то,по моему,в каждой точке программы придётся
указывать разные количества команд call (чтобы набрать ,а т.к. попадутся точки в которые можно
прийти из разных мест,то и скаким-то фиксированным каличеством call обойтись невыдет.Если признать такой путь пригодным,то после него я бы поставил goto и все дела.
Спасибо всем и примите извинения за корявые примеры.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:46.
|
|