|
Неожиданное обнуление семафора, Указатель семафора сам по себе становится NULL |
|
|
|
Sep 29 2015, 12:01
|
Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207

|
Использую рекурсивный семафор. Иногда (1-2 раза в неделю при работе 7*24) указатель семафора становится NULL сам по себе. Определяю это срабатыванием ассерта, FreeRTOS\Source\queue.c, line 491. FreeRTOS V8.2.2, IAR. Не пойму, что может такого происходить, что приводит к обнуления переменной ассерта? Переполнение стека? Это контролируется vApplicationStackOverflowHook и vApplicationMallocFailedHook. И от HighWaterMark до конца стека еще больше 20%. Создание семафора: _semaphore = xSemaphoreCreateRecursiveMutex(); assert(_semaphore != NULL); _semaphore объявлена volatile. Использование семафора: assert(xSemaphoreTakeRecursive(_semaphore, (portTickType)portMAX_DELAY) == pdTRUE); ... assert(xSemaphoreGiveRecursive(_semaphore) == pdTRUE); Или так: assert(xSemaphoreTakeRecursive(_semaphore, (portTickType)portMAX_DELAY) == pdTRUE); ... assert(xSemaphoreTakeRecursive(_semaphore, (portTickType)portMAX_DELAY) == pdTRUE); ... assert(xSemaphoreGiveRecursive(_semaphore) == pdTRUE); ... assert(xSemaphoreGiveRecursive(_semaphore) == pdTRUE);
|
|
|
|
|
 |
Ответов
|
Sep 29 2015, 14:25
|
Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207

|
Цитата(den_po @ Sep 29 2015, 15:26)  Потому что assert это макрос, который в релизных конфигурациях обычно разворачивается в "ничто", то есть содержимое скобок в релизе просто игнорируется. Ну как бы я знаю что у меня в assert, и assert - это уже мой вариант, по умолчанию идет макрос с именем assert_param. И даже по умолчанию там есть реализация - бесконечный цикл.
|
|
|
|
|
Sep 30 2015, 09:46
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(turnon @ Sep 29 2015, 18:25)  Ну как бы я знаю что у меня в assert, и assert - это уже мой вариант, по умолчанию идет макрос с именем assert_param. И даже по умолчанию там есть реализация - бесконечный цикл. Если речь об исходниках FreeRTOS, то там используется макрос configASSERT, и именно по умолчанию там реализация - "ничего". FreeRTOS\Source\include\FreeRTOS.h: Код #ifndef configASSERT #define configASSERT( x ) #define configASSERT_DEFINED 0 #else #define configASSERT_DEFINED 1 #endif Да, исправляюсь, в assert и подобные макросы заворачивают вызовы функций, но только те, удаление которых не влияет на ход работы программы. Это точно не ваш случай. В вашем случае нужно сохранять результат вызова в переменные и в ассертах использовать именно их. Попробуйте скомпилировать ваш проект в релизной конфигурации (с объявленным в настройках препроцессора макросом NDEBUG) и убедитесь.
|
|
|
|
|
Sep 30 2015, 10:44
|
Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207

|
Цитата(den_po @ Sep 30 2015, 12:46)  Если речь об исходниках FreeRTOS, то там используется макрос configASSERT, и именно по умолчанию там реализация - "ничего". FreeRTOS\Source\include\FreeRTOS.h: Код #ifndef configASSERT #define configASSERT( x ) #define configASSERT_DEFINED 0 #else #define configASSERT_DEFINED 1 #endif Считаю легкомысленным оставлять пустую реализацию configASSERT. configASSERT у меня равен assert. Цитата(den_po @ Sep 30 2015, 12:46)  В вашем случае нужно сохранять результат вызова в переменные и в ассертах использовать именно их. Попробуйте скомпилировать ваш проект в релизной конфигурации (с объявленным в настройках препроцессора макросом NDEBUG) и убедитесь. Понял о чем вы. О том что заворачивание в assert может привести к тому что функции вообще не вызовется. Не мой случай, у меня assert - это мой макрос, на него не влияют никакие настройки. Ну и прежде чем использовать какой-то макрос конечно надо посмотреть как он реализован и что на него влияет. Цитата(den_po @ Sep 30 2015, 12:46)  в assert и подобные макросы заворачивают вызовы функций, но только те, удаление которых не влияет на ход работы программы. assert - это проверка "контракта". Если assert не прошел - дальнейшее выполение программы не имеет смысла.
|
|
|
|
|
Sep 30 2015, 11:38
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(turnon @ Sep 30 2015, 14:44)  Понял о чем вы. О том что заворачивание в assert может привести к тому что функции вообще не вызовется. Не мой случай, у меня assert - это мой макрос, на него не влияют никакие настройки. Ну и прежде чем использовать какой-то макрос конечно надо посмотреть как он реализован и что на него влияет. assert - часть стандартной библиотеки, что на него влияет, описано в стандарте. Рассчитывать, что ваш код всегда будет работать с перепиленной вами версией макроса, - раскидывать грабли. Цитата(turnon @ Sep 30 2015, 14:44)  assert - это проверка "контракта". Если assert не прошел - дальнейшее выполение программы не имеет смысла. Во время отладки да, а при работе у конечных пользователей остановка программы зачастую гораздо хуже продолжения её выполнения.
|
|
|
|
|
Sep 30 2015, 11:50
|
Местный
  
Группа: Свой
Сообщений: 340
Регистрация: 17-10-14
Пользователь №: 83 207

|
Цитата(den_po @ Sep 30 2015, 14:38)  Во время отладки да, а при работе у конечных пользователей остановка программы зачастую гораздо хуже продолжения её выполнения. assert применяется для проверки критичных условий, выход за которые означает крах. Если assert сработал - дальнейшее выполнение программы опасно, может привести к непредсказуемым последствиям. При сработке assert правильное поведение (имхо) - фиксация файла и строки в энергонезависимой памяти и ресет.
|
|
|
|
Сообщений в этой теме
turnon Неожиданное обнуление семафора Sep 29 2015, 12:01 den_po Цитата(turnon @ Sep 29 2015, 16:01) Испол... Sep 29 2015, 12:14 turnon Цитата(den_po @ Sep 29 2015, 15:14) а вот... Sep 29 2015, 12:16      den_po Цитата(turnon @ Sep 30 2015, 15:50) asser... Sep 30 2015, 12:21 zltigo QUOTE (turnon @ Sep 29 2015, 15:01) Переп... Sep 29 2015, 15:16 turnon Цитата(zltigo @ Sep 29 2015, 18:16) Посем... Sep 29 2015, 15:46  zltigo QUOTE (turnon @ Sep 29 2015, 18:46) Спаси... Sep 29 2015, 15:47   turnon Цитата(zltigo @ Sep 29 2015, 18:47) MAP ф... Sep 29 2015, 16:37    zltigo QUOTE (turnon @ Sep 29 2015, 19:37) Что-т... Sep 29 2015, 18:08     turnon Цитата(zltigo @ Sep 29 2015, 21:08) Мне т... Sep 30 2015, 08:50      zltigo QUOTE (turnon @ Sep 30 2015, 11:50) Вот д... Sep 30 2015, 12:37       turnon Цитата(zltigo @ Sep 30 2015, 15:37) Данны... Sep 30 2015, 17:36        den_po Цитата(turnon @ Sep 30 2015, 22:36) Конеч... Sep 30 2015, 21:11         turnon Цитата(den_po @ Oct 1 2015, 00:11) Виснущ... Sep 30 2015, 21:15  megajohn Цитата(turnon @ Sep 29 2015, 18:46) Спаси... Sep 29 2015, 16:17   zltigo QUOTE (megajohn @ Sep 29 2015, 19:17) мож... Sep 29 2015, 16:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|