Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка длительных процессов в RTOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
Harvester
Имеем простую RTOS (REX, если кому интересно).
Одна из особенностей этой оси - в ней есть системный процесс сторожевого таймера.
Соответственно, в каждом процессе создается таймер, по сигналу от которого процесс "пинает" сторожевой таймер. Этот сигнал вместе со всеми остальными мониторится в теле процесса.

Собственно, я не могу решить, как следует поступать, если в процессе вызывается функция, время выполнения которой может оказаться больше периода сторожевого таймера.
Что мне приходит в голову:
1. Увеличить период стор. таймера - непонятно на сколько, т.к. время выполнения функции неизвестно;
2. Отслеживать сигнал таймера процесса и "пинать" стор. таймер в этой долгой функции - как-то некрасиво и возможность такого решения зависит от алгоритма самой функции (есть в этой функции "суперлуп" или нет);
3. Отключать сторожевой таймер для данного процесса перед вызовом функции и включать после возврата (в ОС такие функции предусмотрены) - почему-то тоже не нравится wink.gif
В общем, все три варианта мне не нравятся. Посему прошу вашего совета и других идей.
Может я вообще велосипед изобретаю и уже все давно придумано?
Russky
Цитата(Harvester @ Dec 10 2014, 19:53) *
...
В общем, все три варианта мне не нравятся. Посему прошу вашего совета и других идей.
Может я вообще велосипед изобретаю и уже все давно придумано?


Подходящих выриантов как мне кажется два:
1. Как Вы и сказали, сделать период таймера больше чем любой из возможных процессов. Это норма. Так всегда как правило и делают.
2. Запускать ф-ю долгих вычислений в задаче с меньшим приоритетом чем тред где пинается таймер. А зависла эта задача или нет, пишите свою обработку тогда.

sm.gif
megajohn
вариант 4: при вызове долгих функций лучше передавать еще указатель на callback-функцию, в которой можно смотреть процент выполнения. И вот там то и делать ваш сброс WD

пример:
Код
//------------------------------------------------------------------------------
void debug_replace_fw_cb( UINT copy, UINT total )
{
    static UINT prev = 0;
    if( ( copy - prev ) > 50000 )
    {
        prev = copy;
        dprintf( "copy %u/%u", copy, total );
    }

// тут ваш ватчдог, или еще что нужно
}

FRESULT fret = data_storage_file_copy( "firmware.bin", "firmware.old", debug_replace_fw_cb, NULL );
Russky
Цитата(megajohn @ Feb 24 2015, 08:16) *
вариант 4: при вызове долгих функций лучше передавать еще указатель на callback-функцию, в которой можно смотреть процент выполнения. И вот там то и делать ваш сброс WD


Вариант хорош!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.