simark1979 0 11 апреля, 2019 Опубликовано 11 апреля, 2019 (изменено) · Жалоба Прошивка написана под управлением FreeRTOS. Подскажите как правильно организовать сброс сторожевика? На эту тему информации маловато. Изменено 14 ноября, 2022 пользователем haker_fox Добавил теги к популярной теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба Взять и сбросить. Не понятно о чём вопрос.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 11 апреля, 2019 Опубликовано 11 апреля, 2019 (изменено) · Жалоба 19 minutes ago, jcxz said: Взять и сбросить. Не понятно о чём вопрос.... Интересная концепция) Сброс таймера в отдельном потоке, это достаточно просто, но читая материал на эту тему, сделал вывод, что это не спасёт, если застрянет или пойдет по ложному пути другая часть программы Изменено 11 апреля, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 51 minutes ago, simark1979 said: Прошивка написана под управлением FreeRTOS. Подскажите как правильно организовать сброс сторожевика? На эту тему информации маловато. Использую такое решение: аппаратный оконный вотчдог (внутренний, внешний или сразу оба), отдельная задача с минимальным приоритетом для сброса этого таймера через равные интервалы времени. Поторопился сбросить - ресет, завис в другой задаче - ресет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 27 minutes ago, Forger said: Использую такое решение: аппаратный оконный вотчдог (внутренний, внешний или сразу оба), отдельная задача с минимальным приоритетом для сброса этого таймера через равные интервалы времени. Поторопился сбросить - ресет, завис в другой задаче - ресет. А если заткнется другая задача? ИМХО это не спасет от косяков в ПО Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 3 minutes ago, simark1979 said: А если заткнется другая задача? 33 minutes ago, Forger said: завис в другой задаче - ресет. В чем проблема? 3 minutes ago, simark1979 said: ИМХО это не спасет от косяков в ПО Искать 100% панацею в вотчдоге - это уже "тревожный звоночек" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 1 minute ago, Forger said: Тогда вочдог сбросит проц. В чем проблема? С чего вдруг он сбросит? Задача сбрасывающая вотчдог продолжит работу. и ничего об это не узнает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 8 minutes ago, simark1979 said: С чего вдруг он сбросит? Задача сбрасывающая вотчдог продолжит работу. и ничего об это не узнает Читайте внимательно: 41 minutes ago, Forger said: отдельная задача с минимальным приоритетом От "косяков в ПО" может спасти, например, замена программиста на другого, более опытного Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба У меня ПО работает вроде надежно, сомнений пока не имею. но зарекаться не буду) читал https://barrgroup.com/Embedded-Systems/How-To/Advanced-Watchdog-Timer-Tips с чего решил, что контролировать вотчдог с одного потока не достаточно надежно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 21 minutes ago, simark1979 said: с чего решил, что контролировать вотчдог с одного потока не достаточно надежно Изначально вопрос звучал совсем другой: Подскажите как правильно организовать сброс сторожевика? Теперь оказывает вам нужно совсем другое: контролировать вотчдог (из кода), хотя по логике все должно происходить с точность наоборот. Определитесь уже :) Кстати, в статье по ссылке все расписано вполне доступно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 2 часа назад, simark1979 сказал: А если заткнется другая задача? Заведите одну задачу, которая будет проверять (пинговать) остальные задачи. И если все они нормально отвечают, то только тогда сбрасывайте WDT. У меня именно так сделано. И приоритет её не важен, лишь бы только она не тормозилась свыше допустимого другими задачами. Цитата ИМХО это не спасет от косяков в ПО Сторожевик ещё никого от багов в ПО не спасал. Так как пока не придумали сторожевиков, умеющих искать баги в коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 12 апреля, 2019 Опубликовано 12 апреля, 2019 · Жалоба 4 hours ago, simark1979 said: Прошивка написана под управлением FreeRTOS. Подскажите как правильно организовать сброс сторожевика? На эту тему информации маловато. Я разрешил хук от задачи IDLE, в этом хуке сбрасываю псину. Минус такого решения, что иногда высокоприоритетные задачи не дают управления IDLE, и происходит ложные сброс системы. Решается либо увеличением таймаута таймера (если допустимо), либо сбросом собаки в высокоприоритетных задачх. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 12 апреля, 2019 Опубликовано 12 апреля, 2019 (изменено) · Жалоба 13 hours ago, Forger said: Изначально вопрос звучал совсем другой: Подскажите как правильно организовать сброс сторожевика? Теперь оказывает вам нужно совсем другое: контролировать вотчдог (из кода), хотя по логике все должно происходить с точность наоборот. Определитесь уже :) Кстати, в статье по ссылке все расписано вполне доступно. Да, наверное не совсем точно сформулировал вопрос. Интересует конечно, как контролировать собаку из кода В статье расписано, но хотел бы узнать, кто и как это делает, может есть другие подходы. Изменено 12 апреля, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 12 апреля, 2019 Опубликовано 12 апреля, 2019 (изменено) · Жалоба 12 hours ago, jcxz said: Заведите одну задачу, которая будет проверять (пинговать) остальные задачи. И если все они нормально отвечают, то только тогда сбрасывайте WDT. У меня именно так сделано. И приоритет её не важен, лишь бы только она не тормозилась свыше допустимого другими задачами. Сторожевик ещё никого от багов в ПО не спасал. Так как пока не придумали сторожевиков, умеющих искать баги в коде. А что вы понимаете под пингованием задачи? И как вы это делаете? Разумеется, собака не для поиска багов, но может спасти...всё-таки не случайно родились трейсеры для RTOS, иногда баги бывают крайне сложные и неочевидные, редко проявляющиеся. Еще слышал, что программа может сбиться в результате влияния электромагнитных помех на RAM и "ходить" по ложному пути, хотел бы узнать, есть ли такая опасность или выдумки? Изменено 12 апреля, 2019 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 12 апреля, 2019 Опубликовано 12 апреля, 2019 · Жалоба 13 минут назад, simark1979 сказал: А что вы понимаете под пингованием задачи? И как вы это делаете? Любая задача ОС у меня это: цикл в котором ждётся какой-то объект синхронизации ядра (мэйлбокс, семафор, ...), когда он переходит в сигнальное состояние (получает событие или я называю "пинг"), он обрабатывает это событие (опрашивает очереди данных и другие входные переменные), записывает результаты своей работы и опять возвращается к ожиданию этого мэйлбокса. Так вот - после каждого выхода из ожидания мэйлбокса, я проверяю - не проверяет ли нас сейчас WDT-задача и, если да - проснувшаяся задача посылает её уведомление "я жива". А потом продолжает делать свои дела. Подобно: while (1) { MboxPend(japiMbox, ms2tkt(100)); jtaskReq = 0; ILivePing(ILIVE_JAPI); //сообщаем WDT-задаче что мы живы ... //делаем полезные дела } static u8 volatile iliveFaza = ILIVE_START * 2; void ILivePing(int sender) { uint i; if ((i = iliveFaza) != sender * 2 + 1) return; //WDT-задача проверяет нас? iliveFaza = i + 1; //сообщаем WDT-задаче что мы живы } А WDT-задача проходит по списку всех задач, проверяя так каждую, потом начинает сначала. Для каждой задачи в списке WDT-задача знает максимальное время реакции задачи на пинг и ждёт, дёргая WDI, не более этого времени. Потом дёргать WDI перестаёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться