2012-02-29 108 views
0

我需要帮助来清除我的概念。 我有一个功能,每秒钟后打开/关闭LED状态。现在,on/off的代码在infite循环中运行。如何用无限循环调用函数?

例子:

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

现在,当我融入这个代码基线,并呼吁其他功能内部的功能,它只是不工作的软件作品,没有其他功能。

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

任何建议都会有帮助。

+0

正确执行,如果你希望你的应用程序来负责,而之前从每个其他线程/函数调用使用无限循环,你应该使用单独的线程为该循环代码 – kingpin 2012-02-29 13:47:01

回答

0

正如David所说,你应该在一个单独的线程中运行你的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); 
    } 
} 
+0

我的目标是切换LED就软件正在运行。如果由于某种原因软件停止运行,则停止LED开关。我想知道是有其他方法可以让我做,没有使用多线程 – samantha 2012-02-29 13:58:15

+0

@samantha如果App有规律的脉冲,然后你可以,但线程是最好的解决办法 – 2012-02-29 14:03:20

+0

@大卫,我与FTDI芯片的播放。所以我猜这肯定是一个发送高/低信号的脉冲?我对吗? – samantha 2012-02-29 14:18:19

2

是的,你将需要一个单独的线程,或者异步执行的一些其他形式。一旦你输入while循环,那个线程中就不会运行其他代码。永远。

1

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

1

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

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

OS是fedora 12,我正在尝试配置FTDI芯片的GPIO。 – samantha 2012-02-29 14:03:33

1

如果你有机会获得硬件外设定时器(任何micrcontroller /微处理器应用程序),应该使用那些硬件定时器,而不是线程或软件sleep()。

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

这是一个轮询的例子。或者,您可以使用定时器的硬件中断并从那里切换端口。

0

我认为你需要实现的监督功能。因为如果你使用线程,那么即使其他线程有一些问题(如死锁),只要toggle_led线程工作,你的LED就会切换。您需要实现一个toggle_led()功能和返回,以确保所有其他线程/功能越来越成功,而不继续等待一些资源

+0

@马克,我猜这是我正在寻找的。请您详细说明我将如何检查所有或任何软件功能是否正常工作。如果任何功能正在工作,我需要发送信号打开Led。 – samantha 2012-03-01 08:40:40

+0

@Mark,请你给我提示一下如何实施看门狗。我正在尝试配置FTDI芯片。 – samantha 2012-03-01 15:41:29

+0

我不确定。我只编辑了格式化的答案,使其更具可读性。在这种情况下,您需要依靠Srinivas Paluru来做出回应。 – 2012-03-01 15:53:55