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

 
 
> Поммогите с setjmp, Не смог разобраться самостоятельно
SasaVitebsk
сообщение Jan 24 2007, 02:37
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Не ругайте сильно и не отсылайте пожалуйста к литературе. Перечитал всё что мог, но не смог разобраться полностью. Наверное тупею с годами. К тому же не очень очевидно, ну и хочу заметить себе в оправдание, что IAR жутко скупится на примеры. Те же примеры которые я нашёл, оставили некоторые вопросы.

Сначала опишу задачу. Может её кто по другому решал и я зря огород горожу.
Стоит M8. Обслуживает некоторые датчики и часы реального времени. На вход Int0 поступает сигнал от внешнего (не батарейного) питания. Мне надо чтобы она заснула как можно быстрее. Опрос не проходит, так как в теле очень много временных интервалов формируется и везде вставлять выход на точку засыпания не получается. Короче формирую прерывание по провалу питания.

Хочу из обработчика прерывания перейти на сон. Естественно с сохранением стеков. Остальное не волнует. После сна инициализация по новый.

Вопросы такие
1) возможно ли это (написано что из более высокоуровневой только).
2) Как это сделать

я пробую так

Код
....
// Голова. Вот сюда я хочу перейти по провалу питания
  setjmp(Adr_sleep);

  if((INT0_PIN & (1<<INT0))==0) {                        // При нормальном питании - не выполнять
    // Вырубание переферии для уменьшения потребления
......
......

#pragma    vector=INT0_vect                                // Пропадание питания
__interrupt    static void    Power(void)
{
//=========================================
  if((INT0_PIN & (1<<INT0))==0){
    PWR_BAT_ON;                                            // Если питание пропало, то включить батарейку
    #if __ATmega88__
      EIMSK=0;                                            // прерывание от INT0 запретить
    #else
      GICR=0x0;                                            // прерывание от INT0 запретить
    #endif
    longjmp(Adr_sleep,1);                                // И перейти на сон
  }
}
....


Пожалуйста не обращайте внимание на мелочи. Просто правлю по живому.
Go to the top of the page
 
+Quote Post



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

 


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


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