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

 
 
> TEventFlag. порт под msp430, возвращаемое значение IsSignaled()
Sergey Bold
сообщение May 20 2009, 07:55
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 20-05-09
Из: Харьков
Пользователь №: 49 299



Здравствуйте.

Пробую использовать в проекте на msp430 scmRTOS.
Возник вопрос.
Использую событие TEventFlag, проверяю установленно или нет, ну и далее там.

======== Пример ==============
Код
extern OS::TEventFlag g_SF_Initialization;

OS_PROCESS void TTaskZonesDetection::Exec()
{
//    ждем пока наш модуль не будет сконфигурирован
      if( !g_SF_Initialization.IsSignaled() )
    {
        g_SF_Initialization.Wait();
    }

============================

Функция g_SF_Initialization.IsSignaled() всегда возвращает "false", даже если событие установлено.
Немного проясняет листинг, сперва идёт сравнение, потом восстанавливается регистр SR, где флаги после сравнения.
Естественно флаги портятся, и команда JEQ выполняется как душе угодно.

======== Листинг ==============
Код
26          OS_PROCESS void TTaskZonesDetection::Exec()
   \   __code __task void OS::process<OS::pr4, (word)56U>::Exec()
   \                     ??Exec:
     27          {
   \   000000   2183         SUB.W   #0x2, SP
     28          //    ждем пока наш модуль не будет сконфигурирован
     29                if( !g_SF_Initialization.IsSignaled() )
   \   000002   81420000     MOV.W   SR, 0x0(SP)
   \   000006   32C2         DINT
   \   000008   0343         NOP
   \   00000A   D293....     CMP.B   #0x1, &g_SF_Initialization + 2
   \   00000E   2241         MOV.W   0x0(SP), SR
   \   000010   0524         JEQ     ??Exec_3
     30              {
     31                  g_SF_Initialization.Wait();
   \   000012   0E43         MOV.W   #0x0, R14
   \   000014   3C40....     MOV.W   #g_SF_Initialization, R12
   \   000018   B012....     CALL    #??Wait
     32              }

==========================================

IAR пробовал и 3.41 и 4.20.1 - ведут себя одинаково.
Только если выключить всю оптимизацию, в листинге будет правильно работающий код,
но тогда scmRTOS не работает, нужны inline - функции.
Как заставить компилятор генерить работоспособный код?
Или что-то я не понимаю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sergey Bold
сообщение May 21 2009, 09:59
Сообщение #2





Группа: Участник
Сообщений: 7
Регистрация: 20-05-09
Из: Харьков
Пользователь №: 49 299



Я согласен, что вызывать сервисы оси до OS:Run() не корректно.
Хотя в тексте OS:Run() пока ничего не мешало мне установить событие до вызова OS:Run(),
при следуюющем развитии оси что-то может измениться.
Но,
у меня 10 процессов, 5 из них ожидает событие сразу при запуске процесса, то все равно сперва будут выполняться самые приоритетные процессы. И установка события, например в первом процессе, в объекте-событии никак не будет отмечено, что процессы "такие-то" ждут его (они ведь ещё ни разу не вызывались). Проснуться только те процессы, которые до установки события успели вызвать Wait().
А другие когда вызовут Wait(), событие уже будет сброшено. А оно устанавливается всего один раз.
Они будут "ждать" вечно.

Мне кажеться было бы удобно иметь 2 вида событий: со сбросом событий, и без сброса.
Я бы тогда применил второе.
Go to the top of the page
 
+Quote Post
dxp
сообщение May 21 2009, 11:42
Сообщение #3


Adept
******

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



Цитата(Sergey Bold @ May 21 2009, 16:59) *
Мне кажеться было бы удобно иметь 2 вида событий: со сбросом событий, и без сброса.
Я бы тогда применил второе.

Можно создать объект флага с установленными значениями карты ожидающих процессов. Посмотрите на определение конструктора - там можно передать аргумент. Этот аргумент соответствует карте процессов, находящихся в в ожидании. Попробуйте этот способ, возможно все остальные "пляски" и не понадобятся. 


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



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

 


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


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