Alechek 0 30 марта, 2016 Опубликовано 30 марта, 2016 · Жалоба Я тоже не понял, к чему весь этот треп. Последовательность в первом сообщении верна. Сам использую такую конструкцию. Только для других целей: так как __wfi не очень то и сильно уменьшает потребление ядра, приходится перед отправкой его в сон уменьшать тактовую, а сразу по пробуждению - восстанавливать. Экономия приличная (LPC175x). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 30 марта, 2016 Опубликовано 30 марта, 2016 · Жалоба Разумный совет как всегда нашелся на англоязычном форуме. А как оно выглядит-то? ваше англоязычное решение. Не понимаю - Вы чего доказать-то пытаетесь? Чистый новый проект, три прерывания от кнопок с разными уровнями 2, 3, 4. Жму 4, запрет прерываний и цикл, жму 2 ,3 , Выхожу из цикла, снимается запрет - попадаю в 2 ( нормально), Выхожу из цикла 2 - попадаю в 4 и майн. Без запрета прерываний - попасть в 3 можно. Наверное я что-то делаю не так, может у меня камень с дефектом, но команда __disable_irq(); - мне не нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ataradov 0 30 марта, 2016 Опубликовано 30 марта, 2016 · Жалоба А как оно выглядит-то? ваше англоязычное решение. http://electronix.ru/forum/index.php?showt...t&p=1415165 Чистый новый проект, три прерывания от кнопок с разными уровнями 2, 3, 4. Жму 4, запрет прерываний и цикл, жму 2 ,3 , Выхожу из цикла, снимается запрет - попадаю в 2 ( нормально), Выхожу из цикла 2 - попадаю в 4 и майн. Не поянл. Без запрета прерываний - попасть в 3 можно. Наверное я что-то делаю не так, может у меня камень с дефектом, но команда __disable_irq(); - мне не нравится. Ну если не нравятся отдельные инструкции процессора, то это не ко мне. Выполнять все в прерывании не получится, так как обработка флага - это отправка кадра через радио, процесс, который может занять от нескольких мс до нескольких секунд. Перед сном радио усыпляется и перед отправкой кадра его тоже нужно разбудить. Это тоже решается элементарно кодом выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 марта, 2016 Опубликовано 30 марта, 2016 · Жалоба Не имеет значения, как долго тянется прерывание, если, кроме него, делать нечего, и можно поспать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 31 марта, 2016 Опубликовано 31 марта, 2016 · Жалоба Не имеет значения, как долго тянется прерывание, если, кроме него, делать нечего, и можно поспать. Я это уже сколько раз пытался объяснить ТСу, но без толку, он упёрся :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ataradov 0 31 марта, 2016 Опубликовано 31 марта, 2016 · Жалоба Я это уже сколько раз пытался объяснить ТСу, но без толку, он упёрся :crying: Ну не могу я весь этот код засунуть в прерывание - это огромный беспроводный стек, который сам использует другие прерывания для работы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 31 марта, 2016 Опубликовано 31 марта, 2016 · Жалоба Ну не могу я весь этот код засунуть в прерывание - это огромный беспроводный стек, который сам использует другие прерывания для работы. Я имею в виду не то прерывание, которое случается по аппаратному событию и по которому ставится флаг, а отдельное, возбуждаемое программно, из любого прерывания ставящего флаг и имеющее приоритет заведомо ниже любого аппаратного. И фоновый процесс, в котором очевидно работает Ваш огромный стек в виде суперцикла, как раз и должен выполняться внутри этого программного прерывания. Любое аппаратное прерывание прервёт это программное прерывание (для него это будет как фоновый процесс, только на стеке прерываний). Выход из этого программного прерывания - когда работа вся сделана и флаг не установлен заново - выход из ISR. Если между проверкой флага и выходом из ISR произойдёт новое аппаратное прерывание, устанавливающее флаг, но будет новый вход в ISR программного прерывания - так что потери события установки флага не будет даже если не запрещать прерывания. И даже фоновый процесс, крутящий WFI в цикле, можно не прописывать - можно воспользоваться флагом описанным Viko (всегда спать в фоне). Хотя можно конечно и как Вы писали - уходить в сон при запрещённых прерываниях в фоновом процессе и крутить весь суперцикл в нём-же. Судя по докам, Cortex-M должен прерывать состояние сна по любому незамаскированному прерыванию вне зависимости от состояния флага разрешения прерываний. Мне мой вариант кажется удобнее, так как позволяет в фоновый процесс крутящий WFI, более просто добавить какой-то дополнительный функционал, например - периодическое измерение загрузки процессора (периодически, вместо цикла while (1) WFI;, в течение фикс. времени выполнять цикл икрементирования некоего счётчика). Я именно так всегда и строю ПО, пусть даже там всего одна задача: знать насколько занят CPU - очень полезная вещь. Но дело Ваше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться