Перейти к содержанию
    

Я тоже не понял, к чему весь этот треп.

 

Последовательность в первом сообщении верна.

Сам использую такую конструкцию.

Только для других целей: так как __wfi не очень то и сильно уменьшает потребление ядра, приходится перед отправкой его в сон уменьшать тактовую, а сразу по пробуждению - восстанавливать. Экономия приличная (LPC175x).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разумный совет как всегда нашелся на англоязычном форуме.

А как оно выглядит-то? ваше англоязычное решение.

 

Не понимаю - Вы чего доказать-то пытаетесь?

Чистый новый проект, три прерывания от кнопок с разными уровнями 2, 3, 4.

Жму 4, запрет прерываний и цикл, жму 2 ,3 ,

Выхожу из цикла, снимается запрет - попадаю в 2 ( нормально),

Выхожу из цикла 2 - попадаю в 4 и майн.

 

Без запрета прерываний - попасть в 3 можно. Наверное я что-то делаю не так, может у меня камень с дефектом, но команда __disable_irq(); - мне не нравится.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как оно выглядит-то? ваше англоязычное решение.

 

http://electronix.ru/forum/index.php?showt...t&p=1415165

 

Чистый новый проект, три прерывания от кнопок с разными уровнями 2, 3, 4.

Жму 4, запрет прерываний и цикл, жму 2 ,3 ,

Выхожу из цикла, снимается запрет - попадаю в 2 ( нормально),

Выхожу из цикла 2 - попадаю в 4 и майн.

Не поянл.

 

Без запрета прерываний - попасть в 3 можно. Наверное я что-то делаю не так, может у меня камень с дефектом, но команда __disable_irq(); - мне не нравится.

 

Ну если не нравятся отдельные инструкции процессора, то это не ко мне.

 

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

 

Перед сном радио усыпляется и перед отправкой кадра его тоже нужно разбудить. Это тоже решается элементарно кодом выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не имеет значения, как долго тянется прерывание, если, кроме него, делать нечего, и можно поспать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не имеет значения, как долго тянется прерывание, если, кроме него, делать нечего, и можно поспать.

Я это уже сколько раз пытался объяснить ТСу, но без толку, он упёрся :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я это уже сколько раз пытался объяснить ТСу, но без толку, он упёрся :crying:
Ну не могу я весь этот код засунуть в прерывание - это огромный беспроводный стек, который сам использует другие прерывания для работы.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну не могу я весь этот код засунуть в прерывание - это огромный беспроводный стек, который сам использует другие прерывания для работы.

Я имею в виду не то прерывание, которое случается по аппаратному событию и по которому ставится флаг, а отдельное, возбуждаемое программно, из любого прерывания ставящего флаг и имеющее приоритет заведомо ниже любого аппаратного. И фоновый процесс, в котором очевидно работает Ваш огромный стек в виде суперцикла, как раз и должен выполняться внутри этого программного прерывания.

Любое аппаратное прерывание прервёт это программное прерывание (для него это будет как фоновый процесс, только на стеке прерываний). Выход из этого программного прерывания - когда работа вся сделана и флаг не установлен заново - выход из ISR. Если между проверкой флага и выходом из ISR произойдёт новое аппаратное прерывание, устанавливающее флаг, но будет новый вход в ISR программного прерывания - так что потери события установки флага не будет даже если не запрещать прерывания. И даже фоновый процесс, крутящий WFI в цикле, можно не прописывать - можно воспользоваться флагом описанным Viko (всегда спать в фоне).

Хотя можно конечно и как Вы писали - уходить в сон при запрещённых прерываниях в фоновом процессе и крутить весь суперцикл в нём-же. Судя по докам, Cortex-M должен прерывать состояние сна по любому незамаскированному прерыванию вне зависимости от состояния флага разрешения прерываний.

Мне мой вариант кажется удобнее, так как позволяет в фоновый процесс крутящий WFI, более просто добавить какой-то дополнительный функционал, например - периодическое измерение загрузки процессора (периодически, вместо цикла while (1) WFI;, в течение фикс. времени выполнять цикл икрементирования некоего счётчика). Я именно так всегда и строю ПО, пусть даже там всего одна задача: знать насколько занят CPU - очень полезная вещь.

Но дело Ваше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...