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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> scmRTOS и MSP430 low power mode
dxp
сообщение Jan 18 2010, 04:16
Сообщение #16


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Hamster1979 @ Jan 18 2010, 02:38) *
Вобщем буду рад примеру работаещему с low power и scmRTOS (в любом виде хоть с правками исходов ОС, хоть с вставками на асме) ))) оч надо!

А у вас там, часом, нет ли переключения на стек прерываний в прерывании от системного таймера? Если оно есть, то все эти потуги с SR в прерывании идут лесом. Посмотрите на конфигурацию - определение макроса:

#define scmRTOS_ISRW_TYPE TISRW_SS // это из примера - тут оно как раз есть

Ну, и на симуляторе можно по шагам это место пройти - где интринсик копию в стеке изменяет и потом посмотреть, что стек не переключен.

Сообщение отредактировал rezident - Jan 18 2010, 06:27
Причина редактирования: Нарушение п.3.4 Правил форума.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 18 2010, 08:26
Сообщение #17


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(dxp @ Jan 18 2010, 06:16) *
#define scmRTOS_ISRW_TYPE TISRW_SS // это из примера - тут оно как раз есть

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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 18 2010, 09:39
Сообщение #18


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ReAl @ Jan 18 2010, 14:26) *
и понял так, что это было "внеосевое" прерывание без TISRW* вообще.

Если "внеосевое", то тогда вообще разницы быть не должно. В каком-то процессе "заснули", в прерывании "проснулись" и при выходе оказались в том же процессе (с тем же стеком, никаких перепланирований не производилось). Т.е. ситуация ровно такая, как без ОС.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 18 2010, 11:36
Сообщение #19


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Я тут подумал...
Когда процессор должен уходить в спячку? Когда ему нечем заняться.
При очередной перепланировке выясняется что других готовых к исполнению процессов нет и управление получает IdleProcess, а уже в нём процессор усыпляют. Тут всё правильно.

А вот в обратную сторону логично было бы что процессор пробуждается когда планировщик обнаружил готовый к исполнению процесс и передал управление ему. Заметим, что прерывание от системного таймера не единственное такое событие, другие прерывания также могут привести к перепланировке.

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 18 2010, 12:00
Сообщение #20


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(SSerge @ Jan 18 2010, 17:36) *
Получается, что попытка выходить из спячки в обработчике прерывания от таймера есть подход идеологически неправильный.

А тут мы не знаем, как у автора задумано - может, ему надо именно так, и все остальные источники событий принудительно заблокированы. Кстати, я тоже в свое время делал так, когда работал с АЦП - лочил все источники событий, чтобы ничего не пробуждало процессор во время АЦ преобразования, и АЦП спокойно работал в тишине, загружая регистры данных результатами преобразований (до 16 штук). Иначе, когда работает ядро, сложно было получить результат, близкий к 12 битам. Вроде, этот режим (многократное АЦ преобразование с усыплением процессора и пробуждением по окончании) - штатная задумка TI.

Правда, в том случае пробуждение делалось в прерывании от АЦП, что логично. А системный таймер наоборот блокировался. Дождемся автора темы, может он объяснит. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Jan 18 2010, 13:58
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976



Цитата(SSerge @ Jan 18 2010, 14:36) *
Получается, что попытка выходить из спячки в обработчике прерывания от таймера есть подход идеологически неправильный.

Цитата(dxp @ Jan 18 2010, 15:00) *
Дождемся автора темы, может он объяснит. smile.gif

Если вы ждете меня, то могу пояснить.

Рассуждения SSerge совершенно верные. Переход в спящий режим выполняется в функции IdleProcessUserHook(), если выясняется, что процессору делать нечего. В частности, при переходе в спящий режим MCLK переключается на DCO, а высокочастотный генератор выключается, при выходе из спящего режима мы опять переключаемся на XT2. Естественно, было бы глупо выполнять выход из спящего режима при каждом прерывании от системного таймера, так как накладные расходы на переключение нивелировали бы всю экономию от спящего режима, поэтому для выхода из спящего режима пришлось завести еще одну функцию - IdleProcessExitUserHook(), которая вызывается планировщиком перед тем, как передать управление от Idle-процесса к какому-либо нормальному процессу. Именно в IdleProcessExitUserHook() выполняется восстановление системы тактирования и прочие действия для перехода в активный режим работы.
Go to the top of the page
 
+Quote Post
Hamster1979
сообщение Jan 18 2010, 14:45
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 26-03-05
Пользователь №: 3 697



Цитата(dxp @ Jan 18 2010, 07:16) *
А у вас там, часом, нет ли переключения на стек прерываний в прерывании от системного таймера? Если оно есть, то все эти потуги с SR в прерывании идут лесом. ...

laughing.gif опс!... вы совершенно правы! в этом и был у меня косяк..я то читал описание на на версию операционки 2.0 там такой фичи небыло...вот и накосячил...щас поставил TISRW вместо TISRW_SS , запретил NESTED_INTERRUPTS и все заработало... dxp большое спасибо.

Цитата(Dr.NoA @ Jan 18 2010, 16:58) *
Если вы ждете меня, то могу пояснить....

а у меня ситуация не такая. я перехожу в спячку не от нечего делать (Idle процесс)а по показаниям АЦП который меряетнапряжуху на присобаченом источнике питания, т.е. когда питание отключается впадаю в спячку с выключением всего и вся(не только в процессоре но и на плате, иначе резервное питалово просядет и разрядится). Так как проверяю результаты измерения АЦП в хуке системного таймера (он достаточно часто тикает для этого ), то логично что и будиться буду в нем же (накладные расходы - один оператор сравнения if и интринсик)..
Сделано на самом деле так - процесс с навивысшим приоритетом ждет Event(событие) об отсутсвии основного питания...когда ивент получит выключает все в т.ч. и CPU (это значит что останавливается и сам процесс!! в этом месте)... дальше если питание появилось снова запускаем CPU и выполнение процесса с наивысшим приоритетом продолжится..а там дальше вся переферия включается заново и потом по циклу ..опять засыпаем до получения EVENT... оч просто.

Сообщение отредактировал Hamster1979 - Jan 18 2010, 14:48
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 18 2010, 15:03
Сообщение #23


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Dr.NoA @ Jan 18 2010, 19:58) *
Если вы ждете меня, то могу пояснить.

Прошу прощения, это я внес путаницу. Я имел в виду автора обсуждаемого вопроса, а не темы, конечно. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Feb 5 2010, 09:39
Сообщение #24


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



В качестве результата обсуждения, как в итоге-то надо организовывать low power mode в случаях, когда нечего делать?
Я вообще рассуждал, что единственное, что требуется, это написать одну строчку в OS::IdleProcessUserHook() , а именно _BIS_SR(LPM3_bits).
Зачем где-то вызывать _BIC_SR_IRQ(LPM3_bits)? Ведь войдя в обработчик прерывания от системного таймера, в случае если надо будет переключить задачу, то восстановится полностью контекст этой задачи, в том числе и регистр SR, в котором не будет уже стоять битов CPUOFF и пр., соответственно таск продолжит выполняться. Как только шедулер решит, что ни один таск не готов, то включится опять IDLE и восстановится его контекст, вместе с CPUOFF, контроллер опять заснет. Я правильно понимаю все?
Спасибо.
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 5 2010, 14:35
Сообщение #25


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(jorikdima @ Feb 5 2010, 15:39) *
Как только шедулер решит, что ни один таск не готов, то включится опять IDLE и восстановится его контекст, вместе с CPUOFF, контроллер опять заснет. Я правильно понимаю все?

Вроде правильно. Но лучше попробовать. smile.gif Точнее, я даже пробовал (был один проект давно), но уже забыл. Точнее, не помню, чтобы были проблемы, все, вроде, работало, как задумывалось.

_BIC_SR_IRQ(LPM3_bits) может потребоваться вызывать там, где хочется все-таки перевести спящий в IdleProcess процессор в активное состояние.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Feb 5 2010, 16:26
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976



Цитата(jorikdima @ Feb 5 2010, 12:39) *
Я вообще рассуждал, что единственное, что требуется, это написать одну строчку в OS::IdleProcessUserHook() , а именно _BIS_SR(LPM3_bits).

Дело было давно и я уже не помню деталей, но, кажется, что с _BIS_SR(LPM3_bits) и _BIC_SR(LPM3_bits) все не так просто как вы описали. Но даже если и так, что все равно остается вопрос, например, с включением/отключением высокочастотного кварца или какой-то другой периферии для минимизации потребления.
Go to the top of the page
 
+Quote Post

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

 


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


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