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

 
 
> вопрос по Си небольшой.
Метценгерштейн
сообщение Sep 6 2006, 06:13
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



У меня организован такой цикл case:

switch(State) {
...
case IDLE: // этот код выполняется если снято с охраны
off(LED);

if( one_wire_main () ) { //если что-то приложили (ключ)

if(USER_KEYS()) {
State = IDLE_HAS_KEY;
}
}

break;

case IDLE_HAS_KEY:
...

Вопрос- вот иду я по проге, приложили USER_KEYS, я сразу прыгаю на метку IDLE_HAS_KEY? Или дохожу до оператора break, потом компилятор анализирует что там было раньше и после break прыгает уже на метку?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xemul
сообщение Sep 14 2006, 15:39
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



2 Метценгерштейн
имхо, было бы неплохо нарисовать граф состояний устройства с условиями переходов, а то, похоже, Вы уже действительно запутались.

Большинство моих программ для контроллеров вписываются в примерно такую структуру:
Код
void main(void) {
// startup - разбор причины сброса, соответствующая инициализация
...
   for(;;) {
// синхронные события
      if(Flags.b._10ms) {
         Flags.b._10ms = 0;
         GetSlowInputs();            // опрос и фильтрация медленных входов и датчиков
         if(DoorLockTmr) {
            if(!--DoorLockTmr) {
               ODoorLock = 0;
               ODoorUnlock = 0;
            }
         }
         ...
      }
      if(Flags.b._500ms) {
         Flags.b._500ms = 0;
         if(MKeyBtn0HoldTmr) {
            if!--MKeyBtn0HoldTmr) {
               Mode.b.Prog = 1;
               ProgModeTmr = 30 sec;
            }
         };
         if(SirenOnTmr) {
            if(!--SirenOnTmr) OSiren = 0;
         };
         if(LightOnTmr) {
            LightOnTmr--
            if(!LightOnTmr) {
               OLight = 0;
               LightPtrn = 0;
            }
            else {
               if(LightPtrn & 1) OLight = 1;
               else OLight = 0;
               сsr(LightPtrn)        // циклический сдвиг вправо
            }
         }
         else if(LightPtrn) {
            if(LightPtrn & 1) OLight = 1;
            else OLight = 0;
            lsr(LightPtrn)          // логический сдвиг вправо
         }
         ...
      }

// обработка изменений по медленным входам из GetSlowInputs()
// - вынесена из if(Flags.b._10ms){} для удобства восприятия
      if(PortAChg.b.ShockSens) {
         if(PortA.b.ShockSens) {      // сработал датчик удара
            if(Mode.b.Armed && SensSts.b.SensEn) {
               SirenOnTmr = 15 sec;
               LightOnTmr = 25 sec;
               LightPtrn = 0xaa;
               ...
            }
         }
      }
      

// асинхронные события:
// быстрые входы обрабатываются или своими прерываниями или в быстрых
// таймерных прерываниях с выставлением флагов событий;
      if(RcvSts.b.ValidPktRcvd) {
         if(RcvSts.b.BtnPressed) {
            if(RcvSts.b.MasterKey) {
               if(BtnPrsd.b._0) {
                  MKeyBtn0HoldTmr = 5 sec;
                  ...
               }
               if(BtnPrsd.b._1) ...
               ...
            }
            else {
               if(BtnPrsd.b._0) {
                  if(Mode.b.Prog) {
                     // сформировать очередь для записи в EEPROM кода брелока
                  }
                  else {
                     if(Mode.b.Armed) {
                        Mode.i = 1<<MDisarmed;
                        DoorLockTmr = DoorUnlockTime;
                        ODoorUnlock = 1;
                        LightPtrn = 0x05;
                     }
                     else if(Mode.b.Disarmed) {
                        Mode.i = 1<<MArmed;
                        DoorLockTmr = DoorLockTime;
                        ODoorLock = 1;
                        LightPtrn = 0x01;
                     }
                     ...
                  }
               }
               if(BtnPrsd.b._1) ...
               ...
            }
            ...
         }
         if(RcvSts.b.BtnReleased) {
            if(RcvSts.b.MasterKey) {
               if(BtnRlsd.b._0) MKeyBtn0HoldTmr = 0;
               ...
            }
            else {
               if(BtnRlsd.b._0) ...
               ...
            }
         }
         RcvSts.b.ValidPktRcvd = 0;
      }
// обработка очереди записи в EEPROM
      if(!EEQueue->EESts.b.Busy) {
         ...
      }
      ...
   } // end for(;;)
} // end main()

// в синтаксисе PICC и для PIC'ов - мне пока так проще:)
interrupt void isr(void) {
   do {
      if(TMR0IF) {
         TMR0 += по потребностям;  
         TMR0IF = 0;
//         Flags.b._100us = 1;
         здесь обрабатываем быстрые входы, н-р, приемник
         желательно, на ассемблере:)
         if(!RcvSts.b.ValidPktRcvd) {
         ...
         }
      };
      if(TMR1IF) {
         TMR1ON = 0;
         TMR1 += по потребностям;  
         TMR1ON = 1;
         TMR0IF = 0;
         Flags.b._10ms = 1;  // 10 ms только для примера
      };
      if(...IF) {
      ...
         Flags.b.xxx = 1;
      };
      ...
   } while(any (IF & IE));    // do{}while, естесно, по вкусу/необходимости
}


Компилировать это, естесно, не стоит.

hints:
Используйте count-down программные таймеры - проще обрабатывать, код короче, можно использовать как признак состояния.
Не злоупотребляйте switch'ами - код для них что от PICC (для PIC'ов, естесно), что от WinAVR и IAR трудно назвать оптимальным. Но если места и времени (контроллераsmile.gif не жалко, то вперед.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   вопрос по Си небольшой.   Sep 6 2006, 06:13
- - KRS   Что значит цикл case??? на case IDLE_HAS_KEY: вы ...   Sep 6 2006, 06:24
|- - Harvester   Цитата(KRS @ Sep 6 2006, 10:24) Что значи...   Sep 6 2006, 06:55
|- - Метценгерштейн   ясно, с этим вроде разобрался, вот ещё не ясно как...   Sep 6 2006, 08:29
|- - Метценгерштейн   так корректно будет? CntT0= 0; if( !o...   Sep 6 2006, 09:22
|- - Harvester   Цитата(Метценгерштейн @ Sep 6 2006, 12:29...   Sep 6 2006, 11:41
|- - Метценгерштейн   немного конкретизирую задачу- при приложении масте...   Sep 8 2006, 07:35
|- - Harvester   Цитата(Метценгерштейн @ Sep 8 2006, 11:35...   Sep 8 2006, 12:41
|- - Метценгерштейн   while ( MasterKey () ) { //пока ещё приложен ключ ...   Sep 11 2006, 10:23
|- - PaulS   Цитата(Метценгерштейн @ Sep 11 2006, 14:2...   Sep 11 2006, 10:54
- - Shurmas   Пример с сетью 1-wire с "таблеткой" и др...   Sep 11 2006, 13:41
|- - Метценгерштейн   ещё вопрос по Си (простой) в таком виде case ARME...   Sep 14 2006, 11:17
- - dezzer   ЦитатаНе понятно по скобкам, этот таймер у меня вн...   Sep 14 2006, 11:44
|- - Метценгерштейн   всё правильно, я немного не так выразился, по прер...   Sep 14 2006, 12:02
|- - _Bill   Цитата(Метценгерштейн @ Sep 14 2006, 15:0...   Sep 14 2006, 12:21


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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 19:20
Рейтинг@Mail.ru


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