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

 
 
> Использование семафоров до старта планировщика
turnon
сообщение Mar 17 2016, 08:33
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207



При использовании семафоров наткнулся на HardFault и задумался, а можно ли их использовать до старта планирощика?

Или перед использовением (xSemaphoreTake(Recursive) / xSemaphoreGive(Recursive)) нужно проверять xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED ?

Подробности такие. До старта планировщика задач (vTaskStartScheduler()) создается семафор _semaphore = xSemaphoreCreateRecursiveMutex() и потом используется в виде пары:

xSemaphoreTakeRecursive(_semaphore, (portTickType)portMAX_DELAY)
...
xSemaphoreGiveRecursive(_semaphore)

Конечно смысла в семафорах до старта задач нет, до старта задач поток один. Но это унифицированный код, он используется и из задач, и до старта планировщика.

Все работало нормально, но вчера вылез HardFault, трассировка привела к этому участку в queue.c:

if( xTaskResumeAll() == pdFALSE )
{
portYIELD_WITHIN_API();
}

При вызове portYIELD_WITHIN_API() вылетает в HardFault.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AleksBak
сообщение Mar 17 2016, 09:22
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(turnon @ Mar 17 2016, 12:33) *
...
Конечно смысла в семафорах до старта задач нет, до старта задач поток один. Но это унифицированный код, он используется и из задач, и до старта планировщика.
Все работало нормально, но вчера вылез HardFault, трассировка привела к этому участку в queue.c:

if( xTaskResumeAll() == pdFALSE )
{
portYIELD_WITHIN_API();
}

При вызове portYIELD_WITHIN_API() вылетает в HardFault.

А это Ваш код? В смысле Вы так придумали или это код совместной работы в команде? А зачем так извращаться вообще? Мне, можно сказать новичку, итак ясно, что при вызове portYIELD_WITHIN_API() работа перейдет к планировщику. А как оно у Вас до сих пор работало интересно? sm.gif Конечно в мире разные бывают любители и пр. Но вот зачем иногда не совсем понятно.


Сообщение отредактировал AleksBak - Mar 17 2016, 09:29
Go to the top of the page
 
+Quote Post
turnon
сообщение Mar 17 2016, 09:55
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207



Цитата(AleksBak @ Mar 17 2016, 13:22) *
А это Ваш код?

Нет, это код из queue.c, привел его для понимания что вызывает HardFault
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Mar 17 2016, 11:47
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(turnon @ Mar 17 2016, 13:55) *
Нет, это код из queue.c, привел его для понимания что вызывает HardFault

Да это понятно. Я неправильно выразился - имел ввиду, что код/проект/структуру программы Вы сами придумали или кто-то "заставляет"(совместная команда, код какой задачи закрытый и пр.) именно так поступить (использовать семафоры до старта). Уже тут esaulenka и написал к чему пришел и как получше тут будет.
Go to the top of the page
 
+Quote Post
turnon
сообщение Mar 17 2016, 13:41
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207



Цитата(AleksBak @ Mar 17 2016, 15:47) *
Да это понятно. Я неправильно выразился - имел ввиду, что код/проект/структуру программы Вы сами придумали или кто-то "заставляет"(совместная команда, код какой задачи закрытый и пр.) именно так поступить (использовать семафоры до старта). Уже тут esaulenka и написал к чему пришел и как получше тут будет.

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

Цитата(esaulenka @ Mar 17 2016, 15:17) *
Я поначалу кинулся расставлять проверки "планировщик работает" прямо в код операционки (мне кажется, это правильнее, чем тыкать во все возможные места xTaskGetSchedulerState() ), но потом просто перенёс большую часть кода в задачи (до того у меня вся инициализация железа была в main() - осталось только самое необходимое).

У меня в main только одноразовые инициализации, требующие много стековой памяти. Чтобы не выделять много стека под каждую задачу. А так тоже все остальное в задачах. Также реализовано отслеживание зависания задач.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 17 2016, 13:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (turnon @ Mar 17 2016, 15:41) *
потому в коде семафоры.

Некоторое количество лет назал, где-то в районе появления FreeRTOS 2.0 я начал с ней копаться. До этого имел за плечами работу с операционными сисиемами, как с чужими, так и со своими. Удивило тогда меня, что всякие семафоры и иже с ними сделаны через макросы очередей. Призадумался я да и понял, что семафоры и иже с ними в общем-то есть ЛИШНЯЯ сущность. И с тех пор не пользую. За ненадобностью.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
turnon
сообщение Mar 17 2016, 13:55
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207



Цитата(zltigo @ Mar 17 2016, 17:48) *
Некоторое количество лет назал, где-то в районе появления FreeRTOS 2.0 я начал с ней копаться. До этого имел за плечами работу с операционными сисиемами, как с чужими, так и со своими. Удивило тогда меня, что всякие семафоры и иже с ними сделаны через макросы очередей. Призадумался я да и понял, что семафоры и иже с ними в общем-то есть ЛИШНЯЯ сущность. И с тех пор не пользую. За ненадобностью.

А как вы решаете проблему с одновременной работой участка кода из нескольких задач? Конечно в случае если участок кода критичен чтобы к нему не обращались из нескольких задая одновременно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- turnon   Использование семафоров до старта планировщика   Mar 17 2016, 08:33
|- - zltigo   QUOTE (turnon @ Mar 17 2016, 15:55) А как...   Mar 17 2016, 14:13
|- - turnon   Цитата(zltigo @ Mar 17 2016, 18:13) Как о...   Mar 17 2016, 14:36
|- - zltigo   QUOTE (turnon @ Mar 17 2016, 16:36) Это с...   Mar 17 2016, 14:50
|- - turnon   Цитата(zltigo @ Mar 17 2016, 18:50) Если ...   Mar 17 2016, 16:33
|- - zltigo   QUOTE (turnon @ Mar 17 2016, 18:33) Не об...   Mar 17 2016, 18:26
|- - turnon   Цитата(zltigo @ Mar 17 2016, 22:26) Ведь ...   Mar 17 2016, 18:49
|- - zltigo   QUOTE (turnon @ Mar 17 2016, 20:49) Это э...   Mar 17 2016, 19:02
|- - turnon   Цитата(zltigo @ Mar 17 2016, 23:02) Потом...   Mar 17 2016, 20:35
|- - zltigo   QUOTE (turnon @ Mar 17 2016, 22:35) Мне к...   Mar 17 2016, 21:05
|- - turnon   Цитата(zltigo @ Mar 18 2016, 01:05) Следу...   Mar 17 2016, 21:43
|- - zltigo   QUOTE (turnon @ Mar 17 2016, 23:43) А где...   Mar 17 2016, 22:02
- - esaulenka   Да, очереди/семафоры/sleep() с остановленным шедул...   Mar 17 2016, 11:17
|- - zltigo   QUOTE (esaulenka @ Mar 17 2016, 13:17) (д...   Mar 17 2016, 12:20
- - SMaster   Я вот жду релиза версии 9.0, в нем запилили возмож...   Apr 8 2016, 11:23
- - zltigo   QUOTE (SMaster @ Apr 8 2016, 14:23) Я вот...   Apr 8 2016, 12:14


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

 


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


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