2016-04-23 7 views
0

Я работаю над проектом для автомобильной системы, где мы используем MCU MPC5748. Приложение использует RTOS на основе ОС AUTOSAR, и эта цель MPC поддерживает два типа сторожевых устройств; программного обеспечения и аппаратного обеспечения (они использовали мягкую WDT).Как отключить таймер WatchDog для определенной задачи во встроенной системе

Моя миссия состоит в том, чтобы подгонять алгоритм в этом приложении, разработка алгоритма выполнена, проблема в том, что в задаче, в которой работает алгоритм, есть 1ms-задача, и алгоритму требуется гораздо больше времени, чем время, посвященное этой функции.

Я новичок во встроенном мире. Кстати, в основной функции алгоритма программа сбрасывает себя, и это похоже на timeOut, порожденное истечением сторожевого таймера.

Мои вопросы:

  1. Могу ли я отключить сторожевой таймер для этой заданной функции (которые не должны быть отключены, но только для целей тестирования)? Можно использовать больше timeOut для сторожевого таймера для указанной функции?

  2. Должен ли я разработать другую задачу с большой задержкой в ​​других для запуска алгоритма? Но проблема в том, что алгоритм должен быть синхронизирован с задачей 1ms, так как мы получаем CAN-команды.

  3. Могу ли я добавить сон (< 1ms) на нужную функцию для того, чтобы немного подождать witout затрагивая другие задачи

  4. Какие другие варианты, чтобы попробовать?

NB: Это общая проблема с таймером сторожевого таймера, и любая полезная информация будет полезна для меня. Извините, потому что я не могу поделиться этим кодом.

+1

Я верю [этот ответ] (http://stackoverflow.com/questions/14758045/strategy-for-feeding-a-watchdog-in-a-multitask-environment/14780682#14780682) (и вопрос) будет полезно для вас. – kkrambo

+1

Было бы полезно, возможно, знать, как долго «алгоритм» на самом деле берет на себя выполнение - исправлено ли это? Он детерминирован? Задача 1ms напрямую использует результат алгоритма? Какова цель алгоритма? Что такое ответственность за задание (кроме упоминания CAN Rx)? Вы не можете использовать этот код, но псевдокод, описывающий архитектуру задачи, может помочь. – Clifford

+0

, проблема в том, что алгоритм декомпрессии имеет определенное время и зависит от содержимого сжатого файла ... Я измерил прошедшее время, и я обнаружил, что алгоритм может передавать 10us (MicroSeconds) для декодирования один кадр и для другого кадра, который будет декодирован до большого количества данных, до 800 мкс, а в худшем случае - более 1 мс и более .... –

ответ

2

Я не думаю, что вы можете отключить/задержать таймер WATCHDOG, и даже если бы вы могли это сделать, это не очень хороший вариант.

Проблема, которая заключается в том, что задача, которую вы вызываете, составляет 1ms, что очень мало для чтения сообщений CAN, а затем работает на одном и том же. Минимальное время задачи, которое я думаю, должно быть 5ms, а оптимальное время должно быть 10ms.

+0

Нет минимальной задачи, которая может считывать кадры с кадрами каждые 1 мс но алгоритм (который будет распаковывать входящие кадры и выполнять флеш-операцию, занимает больше времени). Так вы думаете, что мне нужно разработать еще одну задачу, которая занимает гораздо больше времени? спасибо –

+0

да на самом деле операция вспышки занимает много времени. поэтому было бы лучше, если бы вы могли создать подзадачу с более длительной продолжительностью, содержащей очередь, которая работает для записи на флеш. где очередь будет обновляться заданием «1ms». – codeDEXTER

2

Могу ли я отключить сторожевой таймер для этой заданной функции (которая не должна быть отключена, но только для целей тестирования)? Можно использовать больше timeOut для сторожевого таймера для указанной функции?

Давайте забудем об этом - это действительно плохая идея. Если можно победить сторожевого пса, то это можно сделать по ошибке, а затем вся точка сторожевого пса проиграна. Кроме того, вопрос XY - вопрос о вашем предлагаемом решении другой проблемы - вы должны спросить о проблеме напрямую.

Должен ли я разработать другую задачу с большой задержкой в ​​других для запуска алгоритма? Но проблема в том, что алгоритм должен быть синхронизирован с задачей 1ms, так как мы получаем CAN-команды.

Да, вам нужно другое задание, но вы не должны добавлять «большую задержку», и это, вероятно, не нужно и, безусловно, плохой дизайн. Если задача 1ms требует результата алгоритма, тогда алгоритм должен запускаться в задаче обслуживания, вызванной заданием 1 мс и выполняться асинхронно с задачей 1ms, тогда задача-служба делает результаты доступными для задачи 1ms, когда она доступна (по совместному возможно, память или сообщение). В качестве альтернативы, если результат не нужен конкретной задачей 1ms, задача обслуживания может принимать необходимые действия независимо от задачи 1ms.

Существует много вариантов, но по сути кажется, что разделение задач не подходит; ваша задача CAN Rx должна отвечать за получение CAN-сообщений только и любые действия, требуемые в ответ на сообщения CAN, отложенные на одну или несколько других задач, возможно, из очереди сообщений.

Какие еще варианты можно попробовать?

Разработка программного обеспечения не должна быть предметом проб и ошибок - получите право на проектирование, внесите дизайн. Однако вы можете подумать, подходит ли 1ms; возможно ли, что период может быть расширен, чтобы охватить наихудшее время исполнения, не вызывая сбоя в соблюдении сроков вообще? Если ответ «нет», то алгоритм не принадлежит к этой задаче.

+0

Спасибо за ваш ответ, поэтому позвольте мне объяснить вам больше алгоритм, просто прочитав входящие кадры, распакуйте каждый входящий кадр и параллельно прочитайте следующий, хост продолжает отправлять фреймы .... результат декомпрессии будет использоваться с помощью Flash-модуля, чтобы замаскировать эти данные в соответствующие им адреса ... Проблема не возникает при распаковке файла с малой степенью сжатия, но когда коэффициент сжатия очень большой: –

+0

предположим, что цель получит 200 байт и нуждается в распаковке что байты до 200 КБ или более (в случае, если все файлы содержат одно повторяющееся слово). В этом конкретном случае флэш-модулю требуется больше времени для прошивки соответствующих данных, поэтому декомпрессор должен дождаться окончания вспышки, но должен продолжать считывать кадры записи, извините, если я не был ясен, но я могу возобновить это в следующих кадре CAN ==> Декомпрессор ==> Модуль Flash ... большое спасибо –

1

Могу ли я отключить сторожевой таймер для этой заданной функции (которая не должна быть отключена, но только для целей тестирования)? Можно использовать больше timeOut для сторожевого таймера для указанной функции?

Вы никогда не должны отключать сторожевой таймер в любом месте вашего кода.

Возможно, в семействах MPC5x вы, как правило, настроили сторожевой таймер, а затем по соображениям безопасности все регистраторы сторожевого таймера переходят в регистры только для чтения.

Должен ли я разработать другую задачу с большой задержкой в ​​других для запуска алгоритма? Но проблема в том, что алгоритм должен быть синхронизирован с задачей 1ms, так как мы получаем CAN-команды.

В идеале вы должны обслуживать сторожевой таймер только из одного места в программе. В вашей периферии CAN будет FlexCAN, у которого есть много доступных «почтовых ящиков» для сообщений CAN. В большинстве случаев вам не нужно его опроса, но при появлении желаемого сообщения будет установлен флаг.

Так что для меня не очевидно, зачем вам ждать, чтобы ждать их. Просто сделать:

void the_task (void) 
{ 
    wdog_refresh(); 

    ... // do other things 

    if(can_message_available) 
    { 
    // do something with the message 
    } 

    ... // do other things 
} 

вместо

// BAD: 
while(!can_message_available) 
    ; // do nothing 

Даже если вам нужно использовать CAN как FIFO и опрашивать его повторно, вы все еще используют один и тот же подход. Вам просто нужно убедиться, что задача выполняется достаточно часто, чтобы никогда не было переполнения в буфере FIFO.

+0

Команды FIFO для can уже внедрены, чтобы дать вам пример: мне нужно распаковать входящий кадр (в худшем случае, с 8 байт до 40 кб), контроллеру Flash требуется больше времени, чтобы записать все эти данные во флэш-память поэтому мне нужно ПАУЗА алгоритма по частям, чтобы каждые 10 кб вспыхнули, а затем завершили операцию декодирования ... –

+0

@Frankenstein загрузчики всегда являются особыми случаями, обычно не имеет смысла запускать приложение, как обычно, в то время как вспышка программирование. Кроме того, время стирания флеш-памяти обычно длиннее стандартного тайм-аута сторожевого таймера, поэтому вам нужно либо адаптировать сторожевой таймер к времени стирания флэш-памяти, либо создать специальный режим загрузчика после сброса. – Lundin