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

 
 
 
Reply to this topicStart new topic
> sleep блоирует поток, Регулярно намертво блокируется один из потоков, где используется sleep
BAT
сообщение May 14 2018, 15:50
Сообщение #1


Участник
*

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



Приветствую всех.

В проекте регулярно застывает задача при входе в sleep. Т.е. она бежит некоторое время, а потом перестает выходить из слипа одного из потоков.
При этом Timeout потока висит в нуле. Если его в отладчике снова выставить на какое-либо число, то поток отмерзает и снова работает некоторое время.
Стека там достаточно. Время на выполнение потока точно есть (все сидит в IDLE).

CPU stm32h7. За основу взят порт для stm32F3 для IAR + порт для stm32f4 FPU для GCC

Грешу на кэши, но оно работало вполне успешно на stm32F7, где это тоже присутствует.

Есть подозрение, что встал на те же грабли, но не могу их разглядеть. Может кто сможет поделиться идеей, куда покопать.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 15 2018, 12:38
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 372
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А у вас нигде случайно не получается вызов sleep(0)?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
BAT
сообщение May 16 2018, 07:29
Сообщение #3


Участник
*

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



Точно нету.
Но есть сборная солянка кода из разных кусков своих проектов.
Непосредственно в этом месте было подряд сначала ожидание сигнала с таймаутом внутри функции, а затем тот самый sleep снаружи.
Сейчас sleep выбросил, поток намертво больше не блокируется.
Но осадок остался. Такого быть не должно. Явно остался где-то косяк не очевидный.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 16 2018, 07:48
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 826
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (BAT @ May 16 2018, 15:29) *
Но осадок остался. Такого быть не должно. Явно остался где-то косяк не очевидный.

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


--------------------
Желаю всем гармонии с самими собой!
Go to the top of the page
 
+Quote Post
dxp
сообщение May 16 2018, 10:05
Сообщение #5


Adept
******

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



Цитата(BAT @ May 16 2018, 14:29) *
Непосредственно в этом месте было подряд сначала ожидание сигнала с таймаутом внутри функции, а затем тот самый sleep снаружи.

Не очень понятно, что такое "sleep снаружи". Не могли бы показать фрагмент этого кода?

sleep - это самая простая штука из всего, что там есть. В обработчике прерывания таймера просто проверяется значение переменной- таймаута процесса, если она не ноль, то декрементируется. Как только доехала до нуля, то данный процесс переводится в готовые к выполнению - в переменной ядра ReadyProcessMap устанавливается бит, соответствующий этому процессу.

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


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


Участник
*

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



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

Код такой

for(;;)
{
coder.process();
OS::sleep(10);
}
внутри coder.process() есть такая конструкция с OS::TEventFlag Ready;
if(Ready.wait(10))
{
...
}
Одно ожидание лишнее, наскоро лепил из разных кусков, чтоб быстрее запустить.
Но, в теории, не должно было тормозиться.
Сейчас sleep убрал, не застревает.

Go to the top of the page
 
+Quote Post
dxp
сообщение May 16 2018, 10:34
Сообщение #7


Adept
******

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



Цитата(BAT @ May 16 2018, 17:15) *
for(;;)
{
coder.process();
OS::sleep(10);
}
внутри coder.process() есть такая конструкция с OS::TEventFlag Ready;
if(Ready.wait(10))
{
...
}
Одно ожидание лишнее, наскоро лепил из разных кусков, чтоб быстрее запустить.
Но, в теории, не должно было тормозиться.

Да, ничего криминального нет, просто ещё одно безусловное ожидание.


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


Участник
*

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



Проблема так и не ушла.
В процессе отладки стало ясно, что двойное ожидание здесь ни при чем. Вылезает во всех местах, где есть ожидание со временем (sleep, event(s)). Там, где sleep или ожидание с таймаутом заменил на простой блокирующий event (раздаю события из таймерного хука), проблем не влезает.

Приоритеты прерываний? Вложенные прерывания для кортекса? Кеши в процессоре(сброс DATA не помогал)? Где еще можно поискать затык?
Как такое в принципе может возникать?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Вчера, 16:30
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 910
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(BAT @ May 22 2018, 16:28) *
. . . Где еще можно поискать затык? . . . .
Попробуйте методом трассировки. Расставьте счетчики "проходов". Если "засыпает" в одном месте (по времени) с момента рестарта - искать ТАМ.
(уже отладкой или на эмуляторе). IMHO.
Если завес (засып) устойчивый - есть гуд. Если сигнализацию засыпа можно вывести аппаратно - тоже гуд.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Вчера, 18:57
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 297
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Вчера, 19:32
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 372
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(BAT @ May 22 2018, 18:28) *
Приоритеты прерываний? Вложенные прерывания для кортекса?

Приоритеты проверьте, конечно.
Посмотрите, как у H7 реализован доступ к регистру SHP3. У M0 он разрешён только по словам, а у M3/4 - разрешён побайтный доступ. Если у H7 тоже доступ только по словам, то будет неправильная инициализация приоритетов прерываний. А это может привести к глюкам.

ЗЫ. Вот нужный дефайн в порте.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd May 2018 - 12:27
Рейтинг@Mail.ru


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