如何用无限循环调用函数?

时间:2012-02-29 13:38:49

标签: c infinite-loop

我需要帮助来清除我的概念。 我有一个功能,可以在每秒后打开/关闭Led状态。现在开/关的代码在infite循环内运行。

示例:

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

现在,当我将此代码与基线集成并在其他函数中调用该函数时,它就无法正常工作。

问题:函数具有无限循环,并且它不会失控,并且在该函数不起作用之后调用的其他函数也是如此。 如果是这种情况,我需要提供单独的线程吗?

任何建议都会有所帮助。

6 个答案:

答案 0 :(得分:2)

是的,您将需要一个单独的线程或其他形式的异步执行。进入while循环后,该线程中不会运行其他代码。如初。

答案 1 :(得分:1)

如果我理解,您的集成版本中没有任何效果。在这种情况下,是的,您可能需要在单独的线程上运行无限循环,因为具有infinit循环的函数将永远不会退出,因此在该线程上不会运行任何其他代码。

答案 2 :(得分:1)

你没有说什么操作系统,但是,是的,将它设置为低优先级线程,最小堆栈大小。我在我的项目中刷了一个LED,这样我就可以很容易地看到代码是否已经到达中止处理程序了:))

void LEDflash_task_code(void *p)
{  
  while (1)
    {  
      FIO1CLR=STATUS_LED;
      OSsleep(750);
      FIO1SET=STATUS_LED;
      OSsleep(250);
    };  
};

答案 3 :(得分:1)

如果您可以访问硬件外围设备定时器(任何微控制器/微处理器应用程序),您应该使用那些硬件定时器,而不是线程或软件睡眠()。

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();
  }
}

这是民意调查的一个例子。或者,您可以使用来自定时器的硬件中断并从那里切换端口。

答案 4 :(得分:0)

正如大卫所说,你应该在一个单独的线程中运行你的LED代码。 http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#BASICS

一旦你有线程,如果你希望你的代码能够阻止你的LED闪烁,那么在每次迭代时添加一个在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);
    }
}

答案 5 :(得分:0)

我认为你需要实现看门狗功能。因为如果你使用线程,那么即使其他线程有一些问题(比如死锁),只要toggle_led线程工作,你的LED就会切换。您需要实现toggle_led()函数并在返回之前从其他每个线程/函数调用以确保所有其他线程/函数成功执行而无需持续等待某些资源

相关问题