自動車エンジニアのアップデート

自動車エンジニアのアップデート

自動車部品メーカー勤務ソフトエンジニアの情報発信ブログ

~ 車載 ソフト エンジニア の 情報発信 ブログ ~

<C言語入門/車載ソフト> while文

f:id:Vefortec:20200504201222j:plain

こんにちは、レオハルです。

車載ソフトで利用するC言語入門シリーズ「while文」です。

※通常のC言語解説とは、異なり組込み・車載ソフトに特化した記載があります。ご注意ください。

基本的な使い方

今回は、C言語の「反復」を実現する1つであるwhile文です。
同じ処理を複数回繰り返し実行するために使う構文になります。

「反復」を実現できるもう一つの構文にfor文があります。大体の参考書では、for文が先に紹介されているかと思いますが、組込み・車載ソフトをメインとしている自分はwhile文を先に紹介したいと思います。

まず、while文の使い方は、以下のようになります。

while( 条件式 ){
  実行処理;
}

条件式が「真」の間、{ }内の処理が実行されます。
while文では、条件式の判定がまず行われます。そのため、最初から条件式が非成立の場合には、{ }内の処理は、一回も実行されないまま、処理を終えることもあります。

組込みに必要な無限ループの実現方法:while(1)

車載ソフトを含めた組込みソフトの場合、電源投入後は、電源が切られるまでずっとプログラムが実行されている必要があります。これを実現するために、無限ループが用いられ、while(1)で記述されてるのをよく見ます。使い方の中でも説明しましたが、条件が「真」の場合、ループが繰り返されます。「真」というのは、イコール1であることを示します。なので、while(1)の記述では、ずっとループを抜けることはなくなるわけです。

while文を利用したLチカサンプルプログラム

while文、while(1)を利用した、サンプルプログラムを示してみます。

/* 関数プロトタイプ宣言 */
static void vos_wait_TimrCnt( void ) ;
/* グローバル変数定義 */
u1 u1g_output_LED ;

/* メイン関数 */
void vog_main( void ){
  u1g_output_LED = 0 ;
  /* メインループ */
  while(1){
    /* 待機関数 */
    vos_wait_TimrCnt() ;

    /* LED反転 */
    if( 0 == u1g_output_LED ){
      u1g_output_LED = 1;
    }
    else{
      u1g_output_LED = 0 ;
    }
  }
}

/* 待機関数 */
static void vos_wait_TimrCnt( void )
{
  u2 u2a_cnt ;

u2a_cnt = 0 ; while( u2a_cnt <= 1000 ){ u2a_cnt++ ; } }

上記プログラムは、一定時間毎にLEDの点灯・消灯を繰り返すプログラムをイメージして作成しています。
vog_main内には、while(1)で無限ループをつくっています。これにより、このwhile内の処理が電源が投入されている限りずっと続くようになっています。
vos_wait_TimrCnt内のwhile文では、u2a_cntが、1000を超えるまでループを繰り返し、ループ内で1ずつ加算する処理を行っています。

組込みの"Hello World"的なLEDチカチカ=Lチカをwhile文で試してみましょう!

 

C言語学習におススメの書籍

【C言語/プログラミング初心者の方】

スッキリわかるC言語入門

スッキリわかるC言語入門

  • 作者:中山 清喬
  • 発売日: 2018/06/22
  • メディア: 単行本(ソフトカバー)
 

【入門卒業レベルの方】

苦しんで覚えるC言語

苦しんで覚えるC言語

  • 作者:MMGames
  • 発売日: 2011/06/24
  • メディア: 単行本
 
新・明解C言語 入門編 (明解シリーズ)

新・明解C言語 入門編 (明解シリーズ)

  • 作者:柴田 望洋
  • 発売日: 2014/08/09
  • メディア: 単行本
 
独習C 第4版

独習C 第4版

 

 【組込み向け】

組込みエンジニアの教科書

組込みエンジニアの教科書