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

 
 
> 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
 
Start new topic
Ответов
BAT
сообщение May 16 2018, 07:29
Сообщение #2


Участник
*

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



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


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 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



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 22:41
Рейтинг@Mail.ru


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