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

 
 
> Как будить проц CxM3 переодически из Sleep?
Spider
сообщение Oct 17 2012, 13:30
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Снова здарова!

Научился таки усыплять проц, КРУТО! sm.gif А вот будить не научился.
Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать. На AVR8 было всё просто, после усыпления проца он мог просыпать по прерыванию таймера2 и продолжать с момента усыпления. Тут же я немного в замешательстве. Вроде как можно будить проц по Событиям и Прерываниям, а пот по факту не получается sad.gif
Подскажите как чего сделать то?

Помогите. ПЛЗ.

ЗЫ Видать основная проблема в том, что я не до конца разобрался в чём разница между прерываниями и событиями...
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 25)
_Артём_
сообщение Oct 17 2012, 13:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 16:30) *
Снова здарова!

Научился таки усыплять проц, КРУТО! sm.gif А вот будить не научился.
Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать.


Код
volatile uint8_t IntWas;
void SysTick_handler()
{
IntWas=1;
}
int main() {
SysTick_Config(10000);
while (1) {
  if (IntWas) {
    IntWas=0;
}
__WFI();
}
}


Наверное ещё надо смотреть какой sleep-режим - просто sleep или deepsleep. Также под отладчиком что-то может не работать.
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 13:59
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



А что проц после сна выходит в 0ой точке?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 14:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 16:59) *
А что проц после сна выходит в 0ой точке?

После неглубокого сна не от 0, просто продолжит выполнение.
Более глубокие режимы у всех производителей сделаны по разному.
Какой у вас проц?
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 14:17
Сообщение #5


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP.
т.е. как я понял из примера выше, достаточно "сотворить" любое прерывание?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 14:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 17:17) *
STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP.
т.е. как я понял из примера выше, достаточно "сотворить" любое прерывание?


Да.
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 14:28
Сообщение #7


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон CxM3?
А есть способ глобально запретить все прерывания? Или надо шерстить по периферии и запрещать, а затем по пробуждению вертать всё назад?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 14:46
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 17:28) *
другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон CxM3?

Зачем запрещать? Проснётся и опять уснёт.

Цитата(Alexey Belyaev @ Oct 17 2012, 17:28) *
А есть способ глобально запретить все прерывания?

__disable_irq();

Вот ещё пример на тему:
Код
void CMU_IRQHandler(void)
{
  /* Clear interrupt flag */
  CMU_IntClear(CMU_IF_LFRCORDY);

  /* Indicate that LFRCO is ready */
  lfrcoReady = true;
}


/***************************************************************************//**
* @brief Main function. Enables LFRCO and waits in EM1 until it is ready
******************************************************************************/
int main(void)
{
  /* Chip revision alignment and errata fixes */
  CHIP_Init();
  
  /* Enable CMU IRQ when LFRCO is ready */
  CMU_IntEnable(CMU_IF_LFRCORDY);
  
  /* Enable CMU interrupt vector in NVIC */
  NVIC_EnableIRQ(CMU_IRQn);
  
  /* Enable LFRCO but do not wait until it is ready */
  CMU_OscillatorEnable(cmuOsc_LFRCO, true, false);
  
  /* Wait in EM1 until LFRCO is ready.
   * Disable interrupts first to avoid interrupt executing between lfrcoReady
   * check and _WFI(); This would have caused the program to get stuck! */
  __disable_irq();
  while(!lfrcoReady)
  {
    __WFI(); /* Pending and enabled IRQs will wake up the CPU, but not go to ISR */
    __enable_irq(); /* ISR for any pending and enabled IRQs will be executed after this */
  }
  
  /* Wait here at the end */
  while(1);    
}
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 15:07
Сообщение #9


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 15:54
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 18:07) *
Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию?

Почитайте по ссылке.

Тут кстати у меня самого вопрос: код ИАРовский, при перекомпиляции в GCC он не заработал пока не вставил 2-3 nop-а. Почему?
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 16:00
Сообщение #11


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Уже побывал там sm.gif Интересная штуковина. Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 16:06
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 19:00) *
Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания?

Зачем? После возврата из прерывания ещё раз выполнится команда WFI и проц опять уснёт до следующего прерывания.

Или вы хотите чтобы вообще не проснулось никогда? Тогда глубжее засыпать надо.
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 16:37
Сообщение #13


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Ну смысл такой, что надо просыпаться только по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 17:20
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 19:37) *
по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее.

Что за события и шина?

PS. В посте по ссылке в сообщении 5 есть таблица, из которой следует, что можно настроить приоритеты прерываний так, чтобы пробуждение происходило только по нужным прерываниям.
Go to the top of the page
 
+Quote Post
kan35
сообщение Oct 18 2012, 15:37
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Был бы у вас FreeRTOS (или другая прямая ось), то просто напросто в IdleHook поставили бы WFI и никаких больше забот не нужно.
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 18 2012, 15:42
Сообщение #16


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



усыпить я и тут могу, и тоже в ИдлХук, а проснуться то как?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 18 2012, 15:49
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 18 2012, 18:42) *
усыпить я и тут могу, и тоже в ИдлХук, а проснуться то как?

Так прерывание и разбудит.
Чем такой вариант не устраивает?
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 18 2012, 15:53
Сообщение #18


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Прерываний то тма тмущая, в любой ОС есть же SysTick прерывания.
А надо только по КОНКРЕТНОМУ прерывания, от таймера через 200ms например.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 18 2012, 15:56
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 18 2012, 18:53) *
Прерываний то тма тмущая, в любой ОС есть же SysTick прерывания.
А надо только по КОНКРЕТНОМУ прерывания, от таймера через 200ms например.

Цитата
2.5.2.1 Wakeup from WFI or sleep-on-exit
Normally, the processor wakes up only when it detects an exception with sufficient priority to cause
exception entry.
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. For more information about PRIMASK and FAULTMASK see Section 2.1.3.6 (p. 11)

Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 19 2012, 10:43
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Артём, можно вопрос по коду в сообщении #8?

Что-то до меня не доходит необходимость флажка и while'а. Или это задел под несколько прерываний, по которым работу продолжать не надо (проснулись - отработали - сразу уснули) ?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 19 2012, 11:32
Сообщение #21


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(esaulenka @ Oct 19 2012, 16:43) *
Или это задел под несколько прерываний, по которым работу продолжать не надо (проснулись - отработали - сразу уснули) ?

Думаю, что да. Мало ли какие ещё прерывания разрешены к этому моменту.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 19 2012, 11:35
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(esaulenka @ Oct 19 2012, 13:43) *
Или это задел под несколько прерываний, по которым работу продолжать не надо (проснулись - отработали - сразу уснули) ?

По сути - да (хотя прерывание в примере только одно).
В примере запускается RC-генератор и процессор засыпает пока не произойдёт wake-up по готовности RC. Таже можно запустить несколько прерываний, например SysTick и измерить время установления RC.

PS. Что странно в GCC такой код не заработал - пришлось добавить пару NOP-ов после __enable_irq. Или так и надо делать, а пример с ошибкой?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Oct 19 2012, 15:48
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата
код не заработал - пришлось добавить пару NOP-ов после __enable_irq


Я наблюдал похожие грабли:
Код
void TIMER0_IRQHandler (void) __irq
{
  // что-то полезное
  T0IR = 0x01;                                // Clear match 0 interrupt
}

Влетал в прерывание два раза - до контроллера прерывания не доходило, что флаг прерывания сброшен.
Нашёл рекомендации использовать инструкции для синхронизации (ISB, кажется), но сделал проще - перенёс сброс флага в начало. Конкретное место, в котором есть проблема, раскапывать поленился.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 19 2012, 18:18
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(esaulenka @ Oct 19 2012, 18:48) *
Я наблюдал похожие грабли:

Да, ситуация похожая.
Цитата(esaulenka @ Oct 19 2012, 18:48) *
Влетал в прерывание два раза - до контроллера прерывания не доходило, что флаг прерывания сброшен.
Нашёл рекомендации использовать инструкции для синхронизации (ISB, кажется), но сделал проще - перенёс сброс флага в начало. Конкретное место, в котором есть проблема, раскапывать поленился.

Хотелось бы знать какой барьер правильней ставить...
Помогает в общем-то любой, и даже NOP.

Мне кажется более правильным использовать DSB, но так ли это...
Go to the top of the page
 
+Quote Post
nx6310
сообщение Nov 23 2012, 09:03
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



Можно процессор переводить в STOP режим, Просыпаться по будильнику RTC ALARM. Из STOP можно выйти только по по внешнему прерыванию или по прерыванию будильника ALARM RTC, в этом режиме отключается вся периферия кроме внешних прерываний и часов реального времени. Потребление уменьшится и другие прерывания не надо будет отключать.
Go to the top of the page
 
+Quote Post
MK2
сообщение Nov 23 2012, 11:20
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



Можете запретить прерывания и будить когда вам надо по нужному event
инструкция __WFI
Go to the top of the page
 
+Quote Post

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

 


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


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