Как вызвать функцию с бесконечным циклом? - PullRequest
0 голосов
/ 29 февраля 2012

Мне нужна помощь, чтобы прояснить мои концепции.У меня есть функция, которая включает / выключает статус Led через каждую секунду.Теперь код для включения / выключения выполняется внутри цикла infite.

Пример:

  void ToggleLed( int pin_number)     
  {      
      // some code  
      while(1)    
      {    
          // code to execute the Led status    
      }   
  }     

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

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

Любое предложение будет полезным.

Ответы [ 6 ]

2 голосов
/ 29 февраля 2012

Да, вам понадобится отдельный поток или какая-то другая форма асинхронного выполнения. Как только вы введете этот цикл while, в этом потоке не будет запущен другой код. Когда-либо.

1 голос
/ 29 февраля 2012

Если у вас есть доступ к аппаратным периферийным таймерам (любым микроконтроллерным / микропроцессорным приложениям), вы должны использовать эти аппаратные таймеры, а не потоки или программный спящий режим ().

void init_toggle_led (uint32_t interval)
{
  setup_hardware_timer(interval);
}

void toggle_led (void)
{
  if( (hardware_timer_register & flag) > 0 )
  {
    port = port ^ pin_mask; 
  }
}

main()
{
  init_toggle_led(1000);

  for(;;)
  {
    do_stuff();
    toggle_led();
  }
}

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

1 голос
/ 29 февраля 2012

Вы не говорите, что OS, но да, установите его как поток с низким приоритетом, минимальный размер стека. Я вспыхиваю светодиодом в своих проектах, чтобы я мог легко видеть, достиг ли код обработчик прерывания:)

void LEDflash_task_code(void *p)
{  
  while (1)
    {  
      FIO1CLR=STATUS_LED;
      OSsleep(750);
      FIO1SET=STATUS_LED;
      OSsleep(250);
    };  
};
1 голос
/ 29 февраля 2012

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

0 голосов
/ 29 февраля 2012

Я думаю, вам нужно реализовать в качестве сторожевой функции. Потому что если вы используете потоки, то даже если другие потоки имеют некоторые проблемы (например, тупик), ваши светодиоды будут переключаться, пока работает поток toggle_led. Вам необходимо реализовать функцию toggle_led() и вызывать из всех других потоков / функций перед возвратом, чтобы убедиться, что все остальные потоки / функции выполняются успешно, без ожидания каких-либо ресурсов непрерывно

0 голосов
/ 29 февраля 2012

Как упоминал Дэвид, вы должны запустить свой светодиодный код в отдельном потоке. http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#BASICS

Если у вас есть потоки, если вы хотите, чтобы ваш код мог остановить мигание вашего светодиода, добавьте флаг, который проверяется в цикле while на каждой итерации, и если он установлен, то отключайте.

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void * toggle_led(void *ptr);
int stop=0;

int main (int argc, const char * argv[])
{
    printf("Hello, World!\n");

    // set up thread
    pthread_t LED_thread;
    char * message = "blink!";
    pthread_create( &LED_thread, NULL, toggle_led, (void*) message);

    // do some other work
    sleep(5);

    // ok you want to quit now
    stop=1;
    pthread_join(LED_thread, NULL);
    printf("Goodbye!\n");
    return 0;
}

void *toggle_led(void *ptr)
{
    while (!stop)
    {
        printf("%s \n", (char *)ptr);
        sleep(1);
    }
}
...