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

 
 
> scmRTOS и MSP430 low power mode
Dr.NoA
сообщение Sep 7 2006, 10:07
Сообщение #1


Местный
***

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



Использую операционную систему scmRTOS на микроконтроллерах MSP430 (в основном F169 и F1611), все замечательно, но есть одна проблема.
Хотелось бы переводить МК в режим пониженного энергопотребления (например, LPM3), когда ему нечем заняться. Насколько я понимаю, для этого достаточно в теле функции void OS::IdleProcessUserHook() выполнить команду _BIS_SR(LPM3_bits). В результате МК "заснет" до следующего прерывания от сторожевого таймера, от которого тактируется планировчик задач ОС. В обработчике прерывания нужно выполнить _BIC_SR_IRQ(LPM3_bits), чтобы МК нормально вернулся в активный режим. Но проблема в том, что код обработчика прерывания от сторожевого таймера является частью scmRTOS, а добавление одной строчки "_BIC_SR_IRQ(LPM3_bits)" приведет к нарушению условий лицензии на scmRTOS.
В общем вопрос в следующем. Решал ли кто-нибудь эту задачу без внесения изменений в исходники операционки? Если да, то поделитесь рецептом.

P.S.
Я, конечно, понимаю, что проблема несколько надуманная, но все таки хочется хоть что-то использовать без нарушения лицензии.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dr.NoA
сообщение Sep 7 2006, 16:36
Сообщение #2


Местный
***

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



Цитата(dxp @ Sep 7 2006, 17:11) *
Цитата(Dr.NoA @ Sep 7 2006, 19:38) *

Цитата

Вы как будто не в России. smile.gif

Тем более что автор scmRTOS денег за нее не хочет, а просит просто не курочить.

Ну, думается, что сломать Вы там ничего не сломаете так, чтоб нанести ущерб автору. smile.gif И потом, я знаю, что народ рихтует под себя, не боится. Никто еще не пострадал от гнева автора. biggrin.gif

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

Да, проблема с совместимостью тоже является одной из причин нежелания делать "тюнинг" операционки.
Но думаю, что в данном случае можно обойдись штатными средствами, воспользовавшись вашим советом. Правда пока не проверял.

Кстати, по поводу "рихтования". Вы случайно не встречали порта scmRTOS на 51-семейство?
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 8 2006, 05:31
Сообщение #3


Adept
******

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



Цитата(Dr.NoA @ Sep 7 2006, 23:36) *
Но думаю, что в данном случае можно обойдись штатными средствами, воспользовавшись вашим советом. Правда пока не проверял.

Должно работать - этот хук там для того и предназначен, чтобы пользователь мог выполнить какие-то действия внутри обработчика прерывания от системного таймера, не модифицируя исходный код.

Цитата(Dr.NoA @ Sep 7 2006, 23:36) *
Кстати, по поводу "рихтования". Вы случайно не встречали порта scmRTOS на 51-семейство?

Нет, все порты лежат вместе. Для 51-го оно врядли появится по причине того, что на оный МК даже С ложится плохо, а уж С++... К тому же, не помню, чтобы для 51-го вообще был С++, может быть ошибаюсь.


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


Участник
*

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



Цитата(dxp @ Sep 8 2006, 08:31) *
Должно работать - этот хук там для того и предназначен, чтобы пользователь мог выполнить какие-то действия внутри обработчика прерывания от системного таймера, не модифицируя исходный код.

Задача переходит в режим пониженного потребления функцией _BIS_SR (LPM3_bits+GIE).
Попробовал выйти из пониженного режима энергопотребления, используя вызов функции _BIC_SR_IRQ (LPM3_bits) в хуке системного таймера ОС. При компиляции выдает ошибку This intrinsic function can only be used in interrupt or monitor function. Посмотрел в исходники операционки - действительно хук не имеет модификатора __inline или __monitor. Как тогда выйти из режима power down?
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 16 2010, 11:05
Сообщение #5


Adept
******

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



Цитата(Hamster1979 @ Jan 16 2010, 00:14) *
Задача переходит в режим пониженного потребления функцией _BIS_SR (LPM3_bits+GIE).
Попробовал выйти из пониженного режима энергопотребления, используя вызов функции _BIC_SR_IRQ (LPM3_bits) в хуке системного таймера ОС. При компиляции выдает ошибку This intrinsic function can only be used in interrupt or monitor function. Посмотрел в исходники операционки - действительно хук не имеет модификатора __inline или __monitor. Как тогда выйти из режима power down?

А если написать свою __inline __monitor функцию, из которой звать означенный интринсик, а вызов самой этой функции поместить в хук?


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


Участник
*

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



Цитата(dxp @ Jan 16 2010, 14:05) *
А если написать свою __inline __monitor функцию, из которой звать означенный интринсик, а вызов самой этой функции поместить в хук?

Пробовал. Не помагает. Восстанавливается контекс задачи и вместе с ним состояние бита CPUOFF....

Дело в том что насколько я понимаю BIC_SR_IRQ функция меняет состояние битов не в самом теле функции а на выходе из нее ... Если не использовать операционную систему то применяют BIC_SR_IRQ в обработчике прерывания ... вызываемого при необходимости выхода из режима power down. Если использовать функцию BIC_SR_IRQ во вложенной в вызываемой из прерывания функции пусть даже __inerrupt и __monitor, модификация бита CPUOFF произойдет не на выходе из прерывания а внутри него..поправьте если я не прав.

Сообщение отредактировал Hamster1979 - Jan 16 2010, 11:29
Go to the top of the page
 
+Quote Post
Hamster1979
сообщение Jan 16 2010, 14:34
Сообщение #7


Участник
*

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



Даже не так. При применении _Pragma ("inline = forced") выдало warning что не может встроить мою функцию (которая с модификатором __monitor, внтури содержит _BIC_SR_IRQ(LPM3bits)).
Вот отрывок заголовочного файла power.h:
Код
#define INLINE _Pragma("inline = forced")
. . .
class PWR
{
    public:
        static void init(void);
        static void off(void);
. . .
        INLINE static inline __monitor void wakeUp(void)
        {
               _BIC_SR_IRQ(LPM3bits);
        };
};


отрывок main.cpp:

Код
void OS::SystemTimerUserHook(void)
{
       adc.read();
       adc.start();
       if(adc.reault[2] < 900)
       {
              PwrOffFlag.SignalISR();
       }
       else
       {
              wakeUp();
       }
}


Код
OS_PROCESS void TPWRProc(void)
{
       for(;;)
       {
             pwr.off();
       }
}


Код
//-------------------------------------------
// Реакция на пропадание уровня питания
//-------------------------------------------
void PWR::off(void)
{
    PowerOffFlag.Wait();
    ...
    //Выключение переферии
    ...
    BIS_SR(LPM3_bits +GIE);
}

Warning:[G004]: Could not inline function "PWR::wakeUp"
... на всякий случай, чтобы понятно было - у меня проект написан на С под msp430f449 без опреционной системы...я его переписываю с применением ОС(так как его очень трудно стало сопровождать, необходимы стали средства межпроцессоного взаимодействия, оптимизировать ресурсы и логику работы)..scmRTOS очень понравилась, перерписал почти все драйвера на ней,демку для проверки наваял все работает.. кроме power down.

Цитата(dxp @ Jan 16 2010, 16:47) *
Исходя из вышесказанного, применять этот интринсик всегда нужно только в прерывании безотносительно к тому, используется ОС или нет. ОС - это обычная программа, на логику применения обсуждаемого интринсика это влияния оказывать не должно.

И к хуку IdleProcess'а все это отношения не имеет.

Естественно не имеет . я ведь написал выше что использую хук системного таймера .А он работает по прерыванию. Устройство выключается пользователем, отключается основное питание . Устройство должно выключить узлы периферии (которые потребляют очень много, ток несколько ампер может быть) на плате, узлы перифери процессора и перейти в режим power down и работу от литиевой батареии. при этом отсаются рабочими только прерывания... гарантированным включенным прерыванием на этот момент может только системный таймер ОС . Вот я его хук и пользую.

Сообщение отредактировал Hamster1979 - Jan 16 2010, 14:54
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 17 2010, 13:52
Сообщение #8


Adept
******

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



Цитата(Hamster1979 @ Jan 16 2010, 20:34) *
Даже не так. При применении _Pragma ("inline = forced") выдало warning что не может встроить мою функцию (которая с модификатором __monitor, внтури содержит _BIC_SR_IRQ(LPM3bits)).

smile.gif Стало еще понятнее.

А зачем вам в прерывании фукнция __monitor? Только если разрешены вложенные прерывания. И, имхо, в при использовании ОС логично применять для этого критические секции (и без ОС тоже лучше не использовать эти непереносимые расширения конкретного компилятора, а лучше написать что-нибудь свое вроде критической секции). Без нее со встроенной _BIC_SR_IRQ должно работать. Насколько понимаю, этот интринсик важно вызывать с уровня самого прерывания, чтобы компилятор правильно нашел копию SR в стеке. Поэтому если интринсик "обернут" другой функцией, то эта функция должна быть встраиваемой. Таким образом, у вас и хук таймера должен быть встроенным, и wakeUp тоже. Попробуйте без __monitor. Не вижу тут никаких противоречий, связанных с использованием ОС.


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


Участник
*

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



Цитата(dxp @ Jan 17 2010, 16:52) *
А зачем вам в прерывании фукнция __monitor?
...
Попробуйте без __monitor. Не вижу тут никаких противоречий, связанных с использованием ОС.

biggrin.gif ну мы так опять покругу пойдем. __monitor - потому что просто вставить _BIC_SR_IRQ компилятор в хук системного таймера не даст (см мои посты выше), в том то и проблема что хук не ВСТРОЕННАЯ функция! Ладно я пошел дальше вкорячил этот интринсик, вызываемый тупо по глобальному флагу, непосредственно в обработчик прерывания системного таймера (это уже не хук а исходы ОС, чтобы не городить встраивание inline и _monitor)- не помогло. Потом сделал голое (без всяких оберток и т.п.)аппаратное прерывание вызываемое только когда нужно выйти из режима спячки, в обработчике - интринсик - - не работает!!! бит CPUoff всегда в еденице при возврате из прерывания .. у меня впечатление что интринсик некорректно находит копию регистра в стеке либо регистр восстанавливается для задачи из другого места(не там где интринсик правит). Причем без ОС все работает как должно.
Вобщем буду рад примеру работаещему с low power и scmRTOS (в любом виде хоть с правками исходов ОС, хоть с вставками на асме) ))) оч надо!

Сообщение отредактировал rezident - Jan 17 2010, 21:36
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 18 2010, 04:16
Сообщение #10


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

Сообщений в этой теме
- Dr.NoA   scmRTOS и MSP430 low power mode   Sep 7 2006, 10:07
- - dxp   Цитата(Dr.NoA @ Sep 7 2006, 17:07) Исполь...   Sep 7 2006, 11:24
- - Dr.NoA   Цитата(dxp @ Sep 7 2006, 15:24) Там для с...   Sep 7 2006, 12:38
|- - dxp   Цитата(Dr.NoA @ Sep 7 2006, 19:38) Цитата...   Sep 7 2006, 13:11
|- - dxp   Цитата(Hamster1979 @ Jan 16 2010, 17:23) ...   Jan 16 2010, 13:47
|- - ReAl   Цитата(dxp @ Jan 18 2010, 06:16) #define ...   Jan 18 2010, 08:26
||- - dxp   Цитата(ReAl @ Jan 18 2010, 14:26) и понял...   Jan 18 2010, 09:39
|- - Hamster1979   Цитата(dxp @ Jan 18 2010, 07:16) А у вас ...   Jan 18 2010, 14:45
- - yornik   Поправьте меня, если ошибаюсь: в изначальном виде ...   Sep 8 2006, 12:30
- - Dr.NoA   Цитата(yornik @ Sep 8 2006, 16:30) Поправ...   Sep 8 2006, 14:00
- - SSerge   Я тут подумал... Когда процессор должен уходить в ...   Jan 18 2010, 11:36
|- - dxp   Цитата(SSerge @ Jan 18 2010, 17:36) Получ...   Jan 18 2010, 12:00
- - Dr.NoA   Цитата(SSerge @ Jan 18 2010, 14:36) Получ...   Jan 18 2010, 13:58
|- - dxp   Цитата(Dr.NoA @ Jan 18 2010, 19:58) Если ...   Jan 18 2010, 15:03
- - jorikdima   В качестве результата обсуждения, как в итоге-то н...   Feb 5 2010, 09:39
- - dxp   Цитата(jorikdima @ Feb 5 2010, 15:39) Как...   Feb 5 2010, 14:35
- - Dr.NoA   Цитата(jorikdima @ Feb 5 2010, 12:39) Я в...   Feb 5 2010, 16:26


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

 


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


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