[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Я не знаю структуры Вашей программы, но предположу,
что бОльшую часть времени прога находится в разных
циклах в ожидании событий.
В этом случае все циклы необходимо "вскрыть", а логику
программы представить в виде машины состояний.
Простой пример.
Предположим, что по ходу программы необходимы
точные выдержки времени. Наиболее типичное решение
в таком случае примерно такое:
volatile char tim;
// прерывание по таймеру
void timer0(void){
if (tim) tim--;
}void main(void){
// супер луп
while(1) {
// bla-bla-bla
// ...
tim=20; // mS например
while(tim);
// ...
// bla-bla-bla
}}
Понятно, что основной цикл в этом случае
на это время не способен реагировать на
изменение ситуации.Выход может быть следующим:
char state;
volatile char tim;
// прерывание по таймеру
void timer0(void){
if (tim) tim--;
}void main(void){
// супер луп
while(1) {
if (new_data) {
// выставился флаг новых данных
state=0;
}
swith (state) {
case 0 :
// bla-bla-bla
// ...
tim=20; // mS например
state=1;
break;
case 1 :
if (tim) state=2;
break;
case 2 :
// ...
// bla-bla-bla
}
}
}В этом случае супер-луп молотит постоянно, и у Вас есть
возможность вмешаться в ход процесса в любой момент и из
любого места.Возможно, это потребует вывернуть своё сознание наизнанку,
но ничего, оно того стоит :-). Нужно только проанализировать
все места, где программа может "застрять".PS Пример НАМЕРЕННО упрощён.
PS Если я излагаю нечто тривиальное, то заранее извиняюсь,
я ведь не знаю Вашей подготовки.
Составить ответ ||| Конференция ||| Архив
Ответы
E-mail: info@telesys.ru