2015-03-10 3 views
2

Что это значит? Я увидел ниже часть кода во встроенной программе c. Я знаю, что это бесконечный цикл, но с какой целью эта часть кода используется во встроенном c.бесконечный цикл while без оператора

while(1) 
{  
} 

Спасибо ..

+0

Чтобы сохранить код, пока не будет выполнено какое-либо другое условие. –

+0

Чтобы поддерживать процесс как занятый и ждать чего-то. –

+1

Вы имеете в виду, что поток должен ждать, пока условие '1' превратится в' 0'? Это не имеет никакого смысла ... –

ответ

10

Эта конструкция используется для двух разных целей.

  1. Когда вы обнаруживаете условие ошибки или прекращение своей задачи, вы должны поставить микроконтроллер в состояние определенного состояния. Конструкция while(1) { } останавливает дальнейшее выполнение до перезапуска (сторожевого таймера) микроконтроллера.
    Как krambo упоминает в своем комментарии, что можно использовать для прикрепления отладчика JTAG для изучения состояния микроконтроллера, переменных, регистров и т. Д.
  2. Вы можете реализовать всю логику в обработчике прерываний. Основная функция выполняет инициализацию и идет спать. Хотя основная функция может «спать», CPU не может. Он просто петли навсегда. Некоторые микроконтроллеры поддерживают низкоэнергетические режимы. Это было бы альтернативой.
+0

Я использовал пустые выражения while (1) {} в отладочных сборках, чтобы удерживать CPU в точке, где была обнаружена ошибка. Это точно так же, как и первая цель, которую вы описали, вместо того, чтобы ждать сброса сторожевого таймера, он ждет присоединения отладчика. Затем с помощью отладчика я могу остановить процессор и проверить переменные, стек и т. Д. И получить некоторые подсказки относительно того, как произошло условие ошибки. – kkrambo

+0

Дополнительно: 3. Это незанятый цикл планировщика RTOS, и работа выполняется в отдельных контекстах потоков. – Clifford

+0

@kkrambo Процессор может дождаться сброса, сторожевого таймера, сбоя питания, выхода из строя или любого источника сброса, который он может поддерживать. Но это бесконечное ожидание в контексте вашей программы. В вашем вопросе не упоминается, что у вас есть отладчик JTAG, что позволяет делать то, что вам нужно, пока процессор все еще ждет. – harper

2

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

Я бы предположил, что ваш код исходит из приложения с простым металлическим микроконтроллером, поэтому вы можете смело игнорировать все комментарии программиста ПК о спящем и многопоточном режиме; для приложения микроконтроллера не имеет смысла не потреблять 100% процессора, поскольку никто его не использует, кроме вас.

Если вы спите на встроенной системе, вы помещаете аппаратное обеспечение микроконтроллера в режим сна, если оно его поддерживает. Это делается для экономии энергии, а не для экономии циклов процессора.

+0

Вы говорите, что «определенная часть кода предназначена для цели сна»? – user6161

+0

@ user25770 Мы можем сказать вам, что код, который в настоящее время находится в вашем вопросе, предназначен для бесконечного цикла. Цель не может быть выведена без дополнительных кодовых строк вокруг этого цикла. – harper

+0

@ user25770 Нет, я говорю, что люди, которые болтают об эффективных ожиданиях, спящих, многопоточных и контекстных коммутаторах, говорят глупости со встроенной точки зрения системы. – Lundin

0

Некоторые операционные системы, такие как uC/OS, требуют выполнения незанятой задачи, когда другая задача не выполняется. Это будет иметь наименьший приоритет и будет вытеснено таймером (планировщиком) тиком, если у него когда-нибудь будет шанс на запуск. Случай, который вы описываете, может быть такой задачей.

Смежные вопросы