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

 
 
> Помоги найти мой косяк. Функция Sleep перестает работать.
a9d
сообщение Dec 26 2010, 22:00
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



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

Контролер ATmega8A 16MHz. Всего два процесса.
В какой то момент времени перестает работать правильно функция Sleep(). Т.е Sleep(500) начинает работать как Sleep(1) . При этом ОС работает замечательно.

Вот не могу понять. Что приводит к такому дивному эффекту? Или как эту хрень отловить.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
BAT
сообщение Mar 9 2011, 15:54
Сообщение #2


Участник
*

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



Нащупал точку проблемы. Похоже я неправильно использую средства оси. Или это такая особенность.
Есть некая очередь сообщений. По некоему сообщению проваливаемся в обработчик, и там в одном месте есть ожидание флага. Теперь пока мы ждем флага в очередь сообщений приходит новое. И система воспринимает это, как событие, по которому пора разбудить процесс. Более внимательно посмотрел в отладчике. После вынимания из очереди очередного элемента не чистится флаг в ConsumersProcessMap. Соответственно приход нового элемента будит процесс и Wait у Event проваливается сразу. Это баг или так и должно быть и сам подход использования неверен?

Код
  if (SystemMsg.pop(sysmsg,100))
  {  
   switch(sysmsg.msg)
   {
   case KEY_PRESSED:
      {
    // перешли в новое     
    // здесь ожидаем некоего флага    
        Rquest_done.Wait(5000);    

      }break;

    ...
   }//switch
  } else {
        // делать что-то     

         }


Вот еще один момент. Такое проявляется при приходе сообщения (push элемента chanal) из более высокоприоритетного потока. В момент проверки ожидающих потоков, стоит бит, что он ready (вполне возможно просто прерван верхним потоком) и при этом ConsumersProcessMap указывает, что этот самый готовый поток ждет сообщения. Чудеса. Из менее приоритетного ConsumersProcessMap обнуляется, там таких странных вещей не наблюдается. Пробовал поймать, где застревает флаг ожидания. Не получается.

Сообщение отредактировал BAT - Mar 9 2011, 17:13
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- a9d   Помоги найти мой косяк. Функция Sleep перестает работать.   Dec 26 2010, 22:00
- - dxp   Цитата(a9d @ Dec 27 2010, 07:00) Вот не м...   Dec 27 2010, 03:04
- - a9d   Все нашел. Для меж процессорного обмена использов...   Dec 30 2010, 16:56
- - BAT   Добавлю свой вопрос сюда. Есть ощущение, что из то...   Mar 6 2011, 11:24
- - Rusoil   Как понимаю функция ожидания эвента должна возвращ...   Mar 6 2011, 14:13
- - BAT   В данном случаи возврат идет с результатом false, ...   Mar 6 2011, 17:12
- - BAT   Ну вроде похоже отловил причину. Не знаю как назва...   Mar 9 2011, 17:48
|- - dxp   Цитата(BAT @ Mar 9 2011, 23:48) Процесс с...   Mar 10 2011, 07:45
|- - BAT   Цитата(dxp @ Mar 10 2011, 10:45) Не понял...   Mar 10 2011, 09:35
|- - dxp   Цитата(BAT @ Mar 10 2011, 15:35) По повод...   Mar 10 2011, 11:51
|- - 501-q   Цитата(dxp @ Mar 10 2011, 17:51) Мы спори...   May 17 2011, 09:59
|- - dxp   Цитата(501-q @ May 17 2011, 16:59) Н...   May 17 2011, 12:28
- - BAT   Поменял местами. Как и ожидалось, проблема ушла. ...   Mar 10 2011, 12:03
- - dxp   Цитата(BAT @ Mar 10 2011, 18:03) Поменял ...   Mar 10 2011, 12:36


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:30
Рейтинг@Mail.ru


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