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

 
 
> Есть ли жизнь после WFI?, атомарность WFI
Brain13
сообщение Jun 1 2015, 18:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Здравствуйте!
Я тут задумался о такой потенциальной проблеме при использовании инструкции WFI: Предположим, что программа должна дождаться получения байта по UART, логичным был бы код
Код
while(!Uart.DataAvailable()) {
    __WFI();
}
// тут обработка данных

Но проблема в том что искомый байт может придти между Uart.DataAvailable() и __WFI(), вызовется обработчик прерывания, после которого вызовется __WFI() и МК больше никогда не проснется.

Вставка критических секций:
Код
__disable_irq();
// тут что-то
__enable_irq();
__WFI();

не спасет ситуацию, так как между __enable_irq(); и __WFI(); может проскочить нужное прерывание(а может не проскочить).

Поиски вывели меня на вот эту англоязычную тему: http://community.arm.com/message/8927 и доку http://infocenter.arm.com/help/index.jsp?t...a/BIHBFEIB.html
Но я так и не понял, что есть решение проблемы.
Так есть ли в Cortex-M гарантированный способ проснуться после WFI?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Jun 1 2015, 18:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А почему вфи будет не после возврата из прерывания и по новому не проснеться?
Go to the top of the page
 
+Quote Post
Brain13
сообщение Jun 1 2015, 18:54
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(Golikov A. @ Jun 1 2015, 21:39) *
А почему вфи будет не после возврата из прерывания и по новому не проснеться?

Не уверен, что понял Ваш вопрос, но постараюсь расписать поподробнее.

В крайнем случае имеем код типа
Код
__disable_irq();
// тут проверки на наличие принятого байта
__enable_irq();
__WFI();

Если проверка покажет, что байт еще не пришел, то исполнение дойдет до строчки __enable_irq. Если искомый байт придет вот в этот момент - исполненится прерывание. После возвращения из прерывания исполнится инструкция WFI, которая будет ожидать нового прерывания, соответственно ядро не проснется. (понятное дело, других прерываний в примере нет)

Вопрос: как дождаться прерывания с использованием WFI и гарантированно проснуться?
Go to the top of the page
 
+Quote Post
Brain13
сообщение Jun 1 2015, 20:03
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Кажется, я нашел ответ: http://infocenter.arm.com/help/index.jsp?t...a/BABGGICD.html
Цитата
Some embedded systems might have to execute system restore tasks after the processor wakes up, and before it executes an interrupt handler. To achieve this set the PRIMASK bit to 1 and the FAULTMASK bit to 0. If an interrupt arrives that is enabled and has a higher priority than current exception priority, the processor wakes up but does not execute the interrupt handler until the processor sets PRIMASK to zero.


Т. е. код должен быть примерно таким:
Код
while(1)
{
  __disable_irq();
  if(Uart.DataAvailable()) {
    break;
  }
  __WFI();
  __enable_irq();
  __NOP();
}

Соотетственно если байт придет перед инструкией WFI, то произойдет запрос прерывания, но обработчик не вызовется(прерывания запрещены), потом вызовется WFI, но он не усыпит прессор так как есть запрос на прерывание, потом исполнится enable_irq, после которого(в течение 0-2 инструкций) вызовется обработчик прерывания.

Теперь осталось это проверить.

Цитата(RabidRabbit @ Jun 1 2015, 22:59) *
Таки в обработчике прерывания от UART можно взвести таймер на пару десятков тиков клока, тады и проснётесь...

Во-первых, это - костыль.
Во-вторых, еще не хватает мне таймер на это тратить, они же не бесплатно в МК даются - это ценный ресурс.

Сообщение отредактировал Brain13 - Jun 1 2015, 20:02
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 1 2015, 23:06
Сообщение #5


Гуру
******

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



QUOTE (Brain13 @ Jun 1 2015, 23:03) *
Во-вторых, еще не хватает мне таймер на это тратить, они же не бесплатно в МК даются - это ценный ресурс.

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


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

Сообщений в этой теме
- Brain13   Есть ли жизнь после WFI?   Jun 1 2015, 18:34
- - RabidRabbit   Таки в обработчике прерывания от UART можно взвест...   Jun 1 2015, 19:59
- - Obam   Я посмотрел ARM DDI 0403E.b - Architecture Referen...   Jun 2 2015, 07:06
- - Golikov A.   ЦитатаСоотетственно если байт придет перед инструк...   Jun 2 2015, 07:25
- - sensor_ua   Предложу взглянуть на статью Use an MCU's low-...   Jun 2 2015, 08:50
- - Brain13   Цитата(zltigo @ Jun 2 2015, 02:06) Вы уж ...   Jun 3 2015, 17:18
|- - zltigo   QUOTE (Brain13 @ Jun 3 2015, 20:08) Я дел...   Jun 3 2015, 17:28
|- - Brain13   Цитата(zltigo @ Jun 3 2015, 20:28) Еще ра...   Jun 3 2015, 18:01
||- - zltigo   QUOTE (Brain13 @ Jun 3 2015, 21:01) Тема ...   Jun 4 2015, 00:40
||- - aaarrr   Цитата(zltigo @ Jun 4 2015, 03:40) К част...   Jun 4 2015, 01:05
|- - _4afc_   Цитата(zltigo @ Jun 3 2015, 21:28) Еще ра...   Jun 3 2015, 20:33
|- - aaarrr   Цитата(_4afc_ @ Jun 3 2015, 23:33) Неужто...   Jun 3 2015, 20:49
- - Golikov A.   ЦитатаВот именно, что не кирпич, ведь мы запрещаем...   Jun 3 2015, 19:42
- - ViKo   А в чем, собственно, проблема? Ставьте WFI после о...   Jun 4 2015, 04:00
- - Golikov A.   Проблема понятна, можно даже не брать UART и проче...   Jun 4 2015, 06:26
|- - Obam   Цитата(Golikov A. @ Jun 4 2015, 10:26) По...   Jun 4 2015, 08:07
|- - ViKo   Цитата(Golikov A. @ Jun 4 2015, 09:26) По...   Jun 4 2015, 08:12
- - Golikov A.   О чем собственно и есть эта тема. Как я понял __W...   Jun 4 2015, 09:30
|- - ViKo   Цитата(Golikov A. @ Jun 4 2015, 12:30) Ка...   Jun 4 2015, 10:12
|- - aaarrr   Цитата(ViKo @ Jun 4 2015, 13:12) Где тако...   Jun 4 2015, 10:14
|- - ViKo   Цитата(aaarrr @ Jun 4 2015, 13:14) См. No...   Jun 4 2015, 10:34
|- - aaarrr   Цитата(ViKo @ Jun 4 2015, 13:34) А что в ...   Jun 4 2015, 10:51
|- - ViKo   Цитата(aaarrr @ Jun 4 2015, 13:51) Действ...   Jun 4 2015, 11:45
|- - Obam   Цитата(ViKo @ Jun 4 2015, 15:45) …(устано...   Jun 4 2015, 12:22
|- - ViKo   Цитата(Obam @ Jun 4 2015, 15:22) Вспомнил...   Jun 4 2015, 12:31
- - aaarrr   Можно применить еще такой вариант: Код__SEV(...   Jun 4 2015, 09:50
- - Obam   Всё, согласен. Мир устоял.   Jun 4 2015, 09:57
- - Brain13   ЦитатаЭто говорит о том, что любое запрещенное пре...   Jun 4 2015, 18:22
- - Golikov A.   А вот и последняя часть пазла http://infocenter.a...   Jun 5 2015, 04:38
|- - DmitryM   Цитата(Golikov A. @ Jun 5 2015, 08:38) и ...   Jun 5 2015, 04:46
|- - Obam   Цитата(Golikov A. @ Jun 5 2015, 08:38) и ...   Jun 5 2015, 05:46
- - Golikov A.   Да я о чем-то своем думал, естественно имел ввиду ...   Jun 5 2015, 10:58
- - jcxz   Имхо - у ТС изначально неверно построен алгоритм. ...   Jun 6 2015, 07:14


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

 


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


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