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

 
 
> Поммогите с 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
 
Start new topic
Ответов
zltigo
сообщение Jan 24 2007, 04:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



1. на IAR не надо пенять не должен он содержать примеры по чистому "C" - рискну smile.gif отослать к литературе.
2. Выпрыгивать хрен знает куда из обработчика прерывания это сильно "задумано" sad.gif.
Естественно абсолютно неработоспособно.
Цитата
Пожалуйста не обращайте внимание на мелочи

К вопросу о мелочах:
В давние времена когда компьютеры были большими а железо которым они управляли было очень большое и тупое, один коллега за несколько часов до торжественной сдачи объекта начиненного
герконовыми реле коммутирующими "вcухую" по 7,5A решил слегка подправить программу....
Фраза произнесенная им после залипания нескольких сотен герконов стала крылатой -
"Странно, один бит и ничего не работает".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



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

 


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


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