|
scmRTOS и MSP430 low power mode |
|
|
|
Jan 18 2010, 04: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 Правил форума.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 18 2010, 08:26
|

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

|
Цитата(dxp @ Jan 18 2010, 06:16)  #define scmRTOS_ISRW_TYPE TISRW_SS // это из примера - тут оно как раз есть Я поначалу тоже об этом подумал, но увидел Цитата Потом сделал голое (без всяких оберток и т.п.)аппаратное прерывание вызываемое только когда нужно выйти из режима спячки, и понял так, что это было "внеосевое" прерывание без TISRW* вообще.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 18 2010, 12:00
|

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

|
Цитата(SSerge @ Jan 18 2010, 17:36)  Получается, что попытка выходить из спячки в обработчике прерывания от таймера есть подход идеологически неправильный. А тут мы не знаем, как у автора задумано - может, ему надо именно так, и все остальные источники событий принудительно заблокированы. Кстати, я тоже в свое время делал так, когда работал с АЦП - лочил все источники событий, чтобы ничего не пробуждало процессор во время АЦ преобразования, и АЦП спокойно работал в тишине, загружая регистры данных результатами преобразований (до 16 штук). Иначе, когда работает ядро, сложно было получить результат, близкий к 12 битам. Вроде, этот режим (многократное АЦ преобразование с усыплением процессора и пробуждением по окончании) - штатная задумка TI. Правда, в том случае пробуждение делалось в прерывании от АЦП, что логично. А системный таймер наоборот блокировался. Дождемся автора темы, может он объяснит.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 18 2010, 13:58
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976

|
Цитата(SSerge @ Jan 18 2010, 14:36)  Получается, что попытка выходить из спячки в обработчике прерывания от таймера есть подход идеологически неправильный. Цитата(dxp @ Jan 18 2010, 15:00)  Дождемся автора темы, может он объяснит.  Если вы ждете меня, то могу пояснить. Рассуждения SSerge совершенно верные. Переход в спящий режим выполняется в функции IdleProcessUserHook(), если выясняется, что процессору делать нечего. В частности, при переходе в спящий режим MCLK переключается на DCO, а высокочастотный генератор выключается, при выходе из спящего режима мы опять переключаемся на XT2. Естественно, было бы глупо выполнять выход из спящего режима при каждом прерывании от системного таймера, так как накладные расходы на переключение нивелировали бы всю экономию от спящего режима, поэтому для выхода из спящего режима пришлось завести еще одну функцию - IdleProcessExitUserHook(), которая вызывается планировщиком перед тем, как передать управление от Idle-процесса к какому-либо нормальному процессу. Именно в IdleProcessExitUserHook() выполняется восстановление системы тактирования и прочие действия для перехода в активный режим работы.
|
|
|
|
|
Jan 18 2010, 14:45
|
Участник

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

|
Цитата(dxp @ Jan 18 2010, 07:16)  А у вас там, часом, нет ли переключения на стек прерываний в прерывании от системного таймера? Если оно есть, то все эти потуги с SR в прерывании идут лесом. ...  опс!... вы совершенно правы! в этом и был у меня косяк..я то читал описание на на версию операционки 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
|
|
|
|
|
Feb 5 2010, 09:39
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 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, контроллер опять заснет. Я правильно понимаю все? Спасибо.
|
|
|
|
|
Feb 5 2010, 14:35
|

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

|
Цитата(jorikdima @ Feb 5 2010, 15:39)  Как только шедулер решит, что ни один таск не готов, то включится опять IDLE и восстановится его контекст, вместе с CPUOFF, контроллер опять заснет. Я правильно понимаю все? Вроде правильно. Но лучше попробовать.  Точнее, я даже пробовал (был один проект давно), но уже забыл. Точнее, не помню, чтобы были проблемы, все, вроде, работало, как задумывалось. _BIC_SR_IRQ(LPM3_bits) может потребоваться вызывать там, где хочется все-таки перевести спящий в IdleProcess процессор в активное состояние.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 5 2010, 16: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) все не так просто как вы описали. Но даже если и так, что все равно остается вопрос, например, с включением/отключением высокочастотного кварца или какой-то другой периферии для минимизации потребления.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|