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

 
 
> Cortex и гонки при сне
ataradov
сообщение Mar 28 2016, 17:12
Сообщение #1


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

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



Я никогда раньше на сон внимания не обращал, все проекты были с нормальным питанием. А тут нужно сделать спящее устройство с просыпанием по кнопке.

При просыпании нужно выполнить много действий (пересылка данных через радио), так что все обработчик прерывания не засунуть точно.

Проблема видится в следующем: если сразу перед вызовом __WFI() происходит прерывание, которое начинает эту долгую работу. Но как только обработка прерывания завершится, все уйдет в сон.

Что я пропустил? Как правильно обрабатывать такие ситуации?

Edit:
Похоже __WFI() проснется даже если прерывания заблокированы, так что правильная последовательность:

__disable_irq();
// подготовка ко сну
__WFI();
__enable_irq();

Сообщение отредактировал ataradov - Mar 28 2016, 17:13
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Kabdim
сообщение Mar 29 2016, 06:30
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Вчера уткнулся ровно в ту же задачу. Кмк большинство отвечающих слишком привыкли к ртосам. Самому писать кусок с переключением контекстов при отсутсвии ртос - саму написать кусок ртос, непрактично. Мне приходили на ум 2 варианта:
1. Основной цикл перенести в SVC
2. Пробуждающий обработчик прерываний меняет режим энергосбережения на слип и устанавливает таймер на ~20 тактов вперед. Даже если в это время сработает WFI, то произойдет быстрый выход из сна. Выглядит как костыль, но должно работать и не потребует миграции на ртос/написания своего маленького велосипедного ядра.

А ваш вариант с запретом работает?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 29 2016, 08:22
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Kabdim @ Mar 29 2016, 12:30) *
Вчера уткнулся ровно в ту же задачу. Кмк большинство отвечающих слишком привыкли к ртосам. Самому писать кусок с переключением контекстов при отсутсвии ртос - саму написать кусок ртос, непрактично.

А что там непрактичного? Всё переключение контекста - пара десятков команд.
Да и, если бы Вы внимательнее прочитали мой пост, как я писал - необязательно даже делать переключение контекста, достаточно задачу, обрабатывающую флаг, заключить в обработчик PendSV.
Но с переключением контекста - правильнее, так как и стек для задачи будет свой и режим - непривилегированный.

Цитата(Kabdim @ Mar 29 2016, 12:30) *
1. Основной цикл перенести в SVC

Вот это как раз непрактично. Или скорее даже невозможно. Насколько помню - у SVC приоритет выше чем у любого аппаратного прерывания (хотя может путаю), к тому же это - синхронное прерывание.
Но самое главное - а что это Вам даст? Вы и WFI внутри SVC будете выполнять? А в чём тогда разница с фоновой задачей?
А если Вы собираетесь возбуждать SVC внутри ISR аппаратного прерывания - это невозможно, ибо SVC - синхронное прерывание, это не PendSV, в ISR SVC будет вход сразу же, без ожидания выхода из ISR аппаратного прерывания, и последующие аппаратные прерывания будут заблокированы. Попытаетесь запретить - получите HardFault.

Цитата(Kabdim @ Mar 29 2016, 12:30) *
2. Пробуждающий обработчик прерываний меняет режим энергосбережения на слип и устанавливает таймер на ~20 тактов вперед. Даже если в это время сработает WFI, то произойдет быстрый выход из сна.

Ничего не понял. Если он пробуждающий - почему тогда он sleep устанавливает??? Сами себе противоречите....

Не нравится PendSV по каким-то причинам, вместо него можно использовать программное возбуждение любого аппаратного прерывания с приоритетом ниже любого используемого в ПО аппаратного прерывания. Хотя это ничем не отличается от PendSV, которое как раз для таких целей и сделано.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Mar 29 2016, 11:21
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(jcxz @ Mar 29 2016, 11:22) *
А что там непрактичного? Всё переключение контекста - пара десятков команд.

Просто зачем? Если дошло до написания переключения контекста не проще ли взять готовую ртос? Вот только потом под это решение нужно переделывать всю остальную прошивку.
Цитата(jcxz @ Mar 29 2016, 11:22) *
Да и, если бы Вы внимательнее прочитали мой пост, как я писал - необязательно даже делать переключение контекста, достаточно задачу, обрабатывающую флаг, заключить в обработчик PendSV.
Но с переключением контекста - правильнее, так как и стек для задачи будет свой и режим - непривилегированный.

Тот пост был всё таки не ответом на ваш пост. sm.gif
Цитата(jcxz @ Mar 29 2016, 11:22) *
Вот это как раз непрактично. Или скорее даже невозможно. Насколько помню - у SVC приоритет выше чем у любого аппаратного прерывания (хотя может путаю), к тому же это - синхронное прерывание.
Но самое главное - а что это Вам даст? Вы и WFI внутри SVC будете выполнять? А в чём тогда разница с фоновой задачей?
А если Вы собираетесь возбуждать SVC внутри ISR аппаратного прерывания - это невозможно, ибо SVC - синхронное прерывание, это не PendSV, в ISR SVC будет вход сразу же, без ожидания выхода из ISR аппаратного прерывания, и последующие аппаратные прерывания будут заблокированы. Попытаетесь запретить - получите HardFault.

На моем камне приоритет - Configurable, но не суть важно. Это была мысль представленная на обсудить, а не конкретная реализация. Да, вы правы, PendSV уместей SVC для этой реализации этого решения.
Цитата(jcxz @ Mar 29 2016, 11:22) *
Ничего не понял. Если он пробуждающий - почему тогда он sleep устанавливает??? Сами себе противоречите....

Что б при если после выхода вывалились на команду WFI заснули не в какой-нибудь deep power down, а в более гуманный ко времени просыпа sleep. Впрочем решение не слишком удачное, с этим я не спорю.
Цитата(jcxz @ Mar 29 2016, 11:22) *
Не нравится PendSV по каким-то причинам, вместо него можно использовать программное возбуждение любого аппаратного прерывания с приоритетом ниже любого используемого в ПО аппаратного прерывания. Хотя это ничем не отличается от PendSV, которое как раз для таких целей и сделано.

Нравится, нравится. sm.gif Но решение с просыпанием с pend прерыванием нравится больше, чем возможность навелосипедить собственный кусочек ртос.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 29 2016, 12:13
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Kabdim @ Mar 29 2016, 17:21) *
Нравится, нравится. sm.gif Но решение с просыпанием с pend прерыванием нравится больше, чем возможность навелосипедить собственный кусочек ртос.

Что там велосипедить? rolleyes.gif
CODE
OS_CPU_PendSVHandler:
CPSID I ;Prevent interruption during context switch
MRS R0, PSP ;PSP is process stack pointer
LDR R1, =OSGlobalV
CBZ R0, OS_CPU_PendSVHandler_pop ;Skip register save the first time
STMFD R0!, {R4-R11} ;Save remaining regs r4-11 on process stack
LDR R2, [R1, #OSTCBCur] ;OSTCBCur->OSTCBStkPtr = SP;
STR R0, [R2] ;R0 is SP of process being switched out
;At this point, entire context of process has been saved
OS_CPU_PendSVHandler_nosave:
#if OS_CPU_HOOKS_EN > 0 && OS_TASK_SW_HOOK_EN > 0
PUSH {LR} ;Save LR exc_return value
LDR R0, =OSTaskSwHook ;OSTaskSwHook();
BLX R0
POP {LR}
LDR R1, =OSGlobalV
#endif

LDRB R0, [R1, #OSPrioHighRdy] ;OSPrioCur = OSPrioHighRdy;
STRB R0, [R1, #OSPrioCur]
LDR R0, [R1, #OSTCBHighRdy] ;OSTCBCur = OSTCBHighRdy;
STR R0, [R1, #OSTCBCur]

LDR R0, [R0] ;R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
LDMFD R0!, {R4-R11} ;Restore r4-11 from new process stack
MSR PSP, R0 ;Load PSP with new process SP
ORR LR, LR, #0F4h ;;;#4 ;Ensure exception return uses process stack
CPSIE I
BX LR ;Exception return will restore remaining context

OS_CPU_PendSVHandler_pop:
ADDS SP, SP, #(8 * 4)
B OS_CPU_PendSVHandler_nosave
END

Вот и всё. А если не нужно сохранять контекст FPU, то содержимое #if/#endif тоже можно опустить (если нужно - надо ещё добавить сохранение регистров FPU сюда).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ataradov   Cortex и гонки при сне   Mar 28 2016, 17:12
- - jcxz   А что собственно смущает? И зачем запрещать прерыв...   Mar 28 2016, 17:34
|- - ataradov   QUOTE (jcxz @ Mar 28 2016, 10:34) А что с...   Mar 28 2016, 17:48
|- - jcxz   Цитата(ataradov @ Mar 28 2016, 23:48) Обр...   Mar 28 2016, 17:55
|- - ataradov   QUOTE (jcxz @ Mar 28 2016, 10:55) А кто д...   Mar 28 2016, 18:05
|- - KnightIgor   Цитата(ataradov @ Mar 28 2016, 19:05) whi...   Mar 28 2016, 19:16
|- - ataradov   QUOTE (KnightIgor @ Mar 28 2016, 12:16) К...   Mar 28 2016, 19:23
|- - KnightIgor   Цитата(ataradov @ Mar 28 2016, 20:23) И п...   Mar 28 2016, 19:45
|- - ataradov   QUOTE (KnightIgor @ Mar 28 2016, 12:45) П...   Mar 28 2016, 19:51
- - aaarrr   Еще можно так: Код /* Clear event register */ __s...   Mar 28 2016, 19:41
- - AVI-crak   Цитата(ataradov @ Mar 29 2016, 00:12) Что...   Mar 28 2016, 20:01
|- - ataradov   QUOTE (AVI-crak @ Mar 28 2016, 13:01...   Mar 28 2016, 20:12
|- - jcxz   Цитата(ataradov @ Mar 29 2016, 02:12) Это...   Mar 28 2016, 23:48
|- - ataradov   QUOTE (Kabdim @ Mar 28 2016, 23:30) А ваш...   Mar 29 2016, 06:33
|- - AVI-crak   Цитата(jcxz @ Mar 29 2016, 19:13) Что там...   Mar 29 2016, 23:31
|- - GetSmart   Цитата(AVI-crak @ Mar 30 2016, 03:31...   Mar 30 2016, 01:59
||- - AVI-crak   Цитата(GetSmart @ Mar 30 2016, 08:59) Что...   Mar 30 2016, 03:30
|- - jcxz   Цитата(AVI-crak @ Mar 30 2016, 05:31...   Mar 30 2016, 05:32
|- - AVI-crak   Цитата(jcxz @ Mar 30 2016, 12:32) Бред...   Mar 30 2016, 06:38
||- - jcxz   Цитата(AVI-crak @ Mar 30 2016, 12:38...   Mar 30 2016, 07:41
|- - ataradov   QUOTE (jcxz @ Mar 29 2016, 22:32) Полност...   Mar 30 2016, 07:54
|- - jcxz   Цитата(ataradov @ Mar 30 2016, 13:54) Все...   Mar 30 2016, 08:19
|- - ataradov   QUOTE (jcxz @ Mar 30 2016, 01:19) Вы даже...   Mar 30 2016, 08:23
|- - AVI-crak   Цитата(ataradov @ Mar 30 2016, 15:23) Раз...   Mar 30 2016, 13:02
|- - ataradov   QUOTE (AVI-crak @ Mar 30 2016, 06:02...   Mar 30 2016, 15:32
- - Alechek   Дейсвтельно мутно. Как оно может ПОТЕРЯТСЯ? Особен...   Mar 30 2016, 04:24
- - ViKo   Не нашел, чтобы кто-то из участников данной дискус...   Mar 30 2016, 06:07
|- - jcxz   Цитата(ViKo @ Mar 30 2016, 12:07) Не наше...   Mar 30 2016, 06:20
- - Alechek   Я тоже не понял, к чему весь этот треп. Последова...   Mar 30 2016, 12:12
- - ViKo   Не имеет значения, как долго тянется прерывание, е...   Mar 30 2016, 16:39
- - jcxz   Цитата(ViKo @ Mar 30 2016, 22:39) Не имее...   Mar 31 2016, 05:58
- - ataradov   QUOTE (jcxz @ Mar 30 2016, 22:58) Я это у...   Mar 31 2016, 06:01
- - jcxz   Цитата(ataradov @ Mar 31 2016, 12:01) Ну ...   Mar 31 2016, 06:21


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

 


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


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