|
Есть ли жизнь после WFI?, атомарность WFI |
|
|
|
Jun 1 2015, 18:34
|
Участник

Группа: Участник
Сообщений: 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?
|
|
|
|
|
 |
Ответов
|
Jun 1 2015, 18:54
|
Участник

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

|
Цитата(Golikov A. @ Jun 1 2015, 21:39)  А почему вфи будет не после возврата из прерывания и по новому не проснеться? Не уверен, что понял Ваш вопрос, но постараюсь расписать поподробнее. В крайнем случае имеем код типа Код __disable_irq(); // тут проверки на наличие принятого байта __enable_irq(); __WFI(); Если проверка покажет, что байт еще не пришел, то исполнение дойдет до строчки __enable_irq. Если искомый байт придет вот в этот момент - исполненится прерывание. После возвращения из прерывания исполнится инструкция WFI, которая будет ожидать нового прерывания, соответственно ядро не проснется. (понятное дело, других прерываний в примере нет) Вопрос: как дождаться прерывания с использованием WFI и гарантированно проснуться?
|
|
|
|
|
Jun 1 2015, 20:03
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 1 2015, 23:06
|

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

|
QUOTE (Brain13 @ Jun 1 2015, 23:03)  Во-вторых, еще не хватает мне таймер на это тратить, они же не бесплатно в МК даются - это ценный ресурс. Вы уж определитесь, что Вы делаете - сферического коня в вакууме с одим прерыванием и кучей лишних ресурсов, в том числе и таймеров, или реальную систему в которой будут и другие источники прерываний от тех-же таймеров. Не говоря уже о том, что UART тоже может быть не однм источником прерывания.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|