|
Cortex и гонки при сне |
|
|
|
Mar 30 2016, 13:02
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(ataradov @ Mar 30 2016, 15:23)  Разумный совет как всегда нашелся на англоязычном форуме. А как оно выглядит-то? ваше англоязычное решение. Цитата(jcxz @ Mar 30 2016, 14:41)  Не понимаю - Вы чего доказать-то пытаетесь? Чистый новый проект, три прерывания от кнопок с разными уровнями 2, 3, 4. Жму 4, запрет прерываний и цикл, жму 2 ,3 , Выхожу из цикла, снимается запрет - попадаю в 2 ( нормально), Выхожу из цикла 2 - попадаю в 4 и майн. Без запрета прерываний - попасть в 3 можно. Наверное я что-то делаю не так, может у меня камень с дефектом, но команда __disable_irq(); - мне не нравится.
|
|
|
|
|
Mar 30 2016, 15:32
|

Профессионал
    
Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202

|
QUOTE (AVI-crak @ Mar 30 2016, 06:02)  А как оно выглядит-то? ваше англоязычное решение. http://electronix.ru/forum/index.php?showt...t&p=1415165QUOTE (AVI-crak @ Mar 30 2016, 06:02)  Чистый новый проект, три прерывания от кнопок с разными уровнями 2, 3, 4. Жму 4, запрет прерываний и цикл, жму 2 ,3 , Выхожу из цикла, снимается запрет - попадаю в 2 ( нормально), Выхожу из цикла 2 - попадаю в 4 и майн. Не поянл. QUOTE (AVI-crak @ Mar 30 2016, 06:02)  Без запрета прерываний - попасть в 3 можно. Наверное я что-то делаю не так, может у меня камень с дефектом, но команда __disable_irq(); - мне не нравится. Ну если не нравятся отдельные инструкции процессора, то это не ко мне. Выполнять все в прерывании не получится, так как обработка флага - это отправка кадра через радио, процесс, который может занять от нескольких мс до нескольких секунд. Перед сном радио усыпляется и перед отправкой кадра его тоже нужно разбудить. Это тоже решается элементарно кодом выше.
|
|
|
|
|
Mar 31 2016, 06:21
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ataradov @ Mar 31 2016, 12:01)  Ну не могу я весь этот код засунуть в прерывание - это огромный беспроводный стек, который сам использует другие прерывания для работы. Я имею в виду не то прерывание, которое случается по аппаратному событию и по которому ставится флаг, а отдельное, возбуждаемое программно, из любого прерывания ставящего флаг и имеющее приоритет заведомо ниже любого аппаратного. И фоновый процесс, в котором очевидно работает Ваш огромный стек в виде суперцикла, как раз и должен выполняться внутри этого программного прерывания. Любое аппаратное прерывание прервёт это программное прерывание (для него это будет как фоновый процесс, только на стеке прерываний). Выход из этого программного прерывания - когда работа вся сделана и флаг не установлен заново - выход из ISR. Если между проверкой флага и выходом из ISR произойдёт новое аппаратное прерывание, устанавливающее флаг, но будет новый вход в ISR программного прерывания - так что потери события установки флага не будет даже если не запрещать прерывания. И даже фоновый процесс, крутящий WFI в цикле, можно не прописывать - можно воспользоваться флагом описанным Viko (всегда спать в фоне). Хотя можно конечно и как Вы писали - уходить в сон при запрещённых прерываниях в фоновом процессе и крутить весь суперцикл в нём-же. Судя по докам, Cortex-M должен прерывать состояние сна по любому незамаскированному прерыванию вне зависимости от состояния флага разрешения прерываний. Мне мой вариант кажется удобнее, так как позволяет в фоновый процесс крутящий WFI, более просто добавить какой-то дополнительный функционал, например - периодическое измерение загрузки процессора (периодически, вместо цикла while (1) WFI;, в течение фикс. времени выполнять цикл икрементирования некоего счётчика). Я именно так всегда и строю ПО, пусть даже там всего одна задача: знать насколько занят CPU - очень полезная вещь. Но дело Ваше.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|