2012-02-29 16 views
0

私のコンセプトをクリアするには助けが必要です。 私は1秒ごとにLEDの点灯/消灯を切り替える機能を持っています。ここでオン/オフのコードは無限ループ内で実行されます。無限ループで関数を呼び出す方法は?

例:

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

今私は、ベースラインで、このコードを統合し、それだけでdoesntの仕事他の関数内のソフトウェアの作品の他の機能は、その関数を呼び出していないとき。

質問:関数は無限ループを持ち、関数が機能しなくなり、関数が機能しなくなった後に呼び出されるその他の関数が制御から外れることはありません。 その場合、別のスレッドを提供する必要がありますか?

提案が役に立ちます。

+0

権利を待たずに正常に実行取得されていることを確認するために戻る前に、他のスレッド/関数のそれぞれから呼び出す必要があります無限ループを使用すると、そのループコードのために別のスレッドを使用する必要があります – kingpin

答えて

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); 
    } 
} 
+0

私の目的は、ソフトウェアが動作している限り、Ledを切り替えることです。何らかの理由でソフトウェアの実行が停止した場合は、Ledトグルを停止します。私は疑問に思って、私はマルチスレッド – samantha

+0

@samanthaを使用せずに、あなたのアプリにすることができますが、スレッドが、私はFTDIチップで遊んでいます、@デビッド最善の解決策 –

+0

あり、その後、通常のパルスを持っている場合はそれを行うことができ、他の方法があります。だから私は間違いなく高/低信号を送信するパルスがあると思いますか?私は正しい? – samantha

2

はい、あなたは別のスレッド、または非同期実行の他のいくつかのフォームが必要になります。 whileループに入ると、そのスレッドでは他のコードは実行されません。これまで

1

私はcorrecctly理解していれば何があなたの統合されたバージョンでは機能しません。その場合は、無限ループを別のスレッドで実行する必要があります。これは、無限ループの関数が決して終了しないため、そのスレッドで他のコードが実行されないためです。

1

OSはどれですか、はい、低い優先度のスレッド、最小のスタックサイズとして設定します。私は私のプロジェクトで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

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

@ Mark、これは私が探していると思います。あなたは、ソフトウェア機能のすべてまたはいずれかが機能しているかどうかをどのように確認するかを詳しく教えてください。いずれかの機能が動作している場合は、Ledをオンにする信号を送信する必要があります。 – samantha

+0

@マーク、ウォッチドッグの実装方法のヒントを教えてください。私はFTDIチップを構成しようとしています。 – samantha

+0

わかりません。私はそれを読みやすくするために、フォーマットの目的で答えを編集しました。この場合、Srinivas Paluruに応答する必要があります。 –

関連する問題