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

 
 
> Есть ли жизнь после 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
Ответов
Brain13
сообщение Jun 3 2015, 17:18
Сообщение #2


Участник
*

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



Цитата(zltigo @ Jun 2 2015, 02:06) *
Вы уж определитесь, что Вы делаете - сферического коня в вакууме с одим прерыванием и кучей лишних ресурсов, в том числе и таймеров, или реальную систему в которой будут и другие источники прерываний от тех-же таймеров. Не говоря уже о том, что UART тоже может быть не однм источником прерывания.

Я делаю реальную систему, но если я хочу дождаться прервания по UART причем тут прерывание по таймеру?

Цитата(Obam @ Jun 2 2015, 10:06) *
Я посмотрел ARM DDI 0403E.b - Architecture Reference Manual - стр. B1-618: TS, эта команда разве в цикле должна вызываться?

Опять же, прерывание для того и существует, чтобы событие его порождающее не ждать.

Часто бывают случаи когда нужно дождаться какого либо события и только потом действовать. А while(xxx) {} не сильно хороший вариант, ибо потребление.

Цитата(Golikov A. @ Jun 2 2015, 10:25) *
то есть если вы замаскируете прерывание, и вызовите wfi, а размаскирование стоит после нее, то это кирпич?

Вот именно, что не кирпич, ведь мы запрещаем не само прерывание, а вызов его обработчика. При появлении запроса на прерывание процессор проснется, а вызов обработчика произойдет после __enable_irq();. Я проверил, такой код работает и не виснет(STM32F3DISCOVERY):
CODE
int main(int argc, char* argv[]) {
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

GPIO_InitTypeDef gpio;

gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Pin = GPIO_Pin_9;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOE, &gpio);
GPIO_ResetBits(GPIOE, GPIO_Pin_9);

gpio.GPIO_Mode = GPIO_Mode_IN;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_Pin = GPIO_Pin_0;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &gpio);

EXTI_InitTypeDef exti;
exti.EXTI_Line = EXTI_Line0;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
exti.EXTI_Trigger = EXTI_Trigger_Rising;
exti.EXTI_LineCmd = ENABLE;

EXTI_Init(&exti);

NVIC_InitTypeDef nvic;

nvic.NVIC_IRQChannel = EXTI0_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0x0F;
nvic.NVIC_IRQChannelSubPriority = 0x0F;
nvic.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&nvic);

// Infinite loop
while (1)
{
for(;;) {
__disable_irq();
if(flag) break;
__WFI();
__enable_irq();
__NOP();
__NOP();
__NOP();
}
__enable_irq();

if(GPIO_ReadOutputData(GPIOE) & GPIO_Pin_9) {
GPIO_ResetBits(GPIOE, GPIO_Pin_9);
} else {
GPIO_SetBits(GPIOE, GPIO_Pin_9);
}
flag = 0;
}
}

void EXTI0_IRQHandler(void)
{
if((EXTI_GetITStatus(EXTI_Line0) != RESET)) {
flag = 1;
EXTI_ClearITPendingBit(EXTI_Line0);

}
}


Сообщение отредактировал IgorKossak - Jun 3 2015, 17:45
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Brain13   Есть ли жизнь после WFI?   Jun 1 2015, 18:34
- - Golikov A.   А почему вфи будет не после возврата из прерывания...   Jun 1 2015, 18:39
|- - Brain13   Цитата(Golikov A. @ Jun 1 2015, 21:39) А ...   Jun 1 2015, 18:54
|- - Brain13   Кажется, я нашел ответ: http://infocenter.arm.com/...   Jun 1 2015, 20:03
|- - zltigo   QUOTE (Brain13 @ Jun 1 2015, 23:03) Во-вт...   Jun 1 2015, 23:06
- - 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
|- - 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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