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

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

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

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

車載ソフトウェア開発 = C言語 ~資源管理が大事です~

f:id:Vefortec:20200504201222j:plain

車載ソフト = C言語

 車載ソフトでは、どんなプログラミング言語が利用されているかご存じでしょうか?
既にこのページにたどり着いている時点でご存じだと思いますが、C言語です。

 そして、C言語が使われる理由は、資源管理です。

 車載ソフトにC言語が使われる理由と合わせて、知っておいてほしい車載ソフトでのC言語のポイントも伝えていきたいと思います。
新人さんがコレを押さえていれば、「コイツは、学生レベルの一個上だな!」と思われるはずです。

C言語が使われる理由は、資源管理にあり

車載ソフトは、マイコン上で動作する

 まず認識しておく必要があるのが、現在の車載ソフトが動作する環境です。
多くの車載ソフトウェアがECUと呼ばれる組込み機器上で動作しています。
このECUの中には、マイコンと呼ばれる小さなコンピュータが搭載されています。
(マイコン=マイクロコンピュータの略語,MCU=Micro ControllerUnitとも言われる)
マイコンには、パソコンやスマホとは違う二つの特徴があります。
これを考えてソフトをつくる必要あります。

f:id:Vefortec:20200505101633j:plain f:id:Vefortec:20200505101816j:plain

 一つ目は、CPU・ROM・RAMのスペックが低いことです。
パソコンやスマホのような高性能なCPUも大容量のROMやRAMが搭載されません。
クロックはMHz、ROM・RAMはMBの世界です。
PC・スマホだと、GHz・TBですよね。
※先進安全や自動運転、ナビ、社内エンタメ系製品では、もう少しリッチな資源を持つものもあります。

 2つ目の特徴としては、マイコンには、周辺機器が搭載されています。
周辺機能とは、マイコンを便利に使うための機能の総称です。

  •  外部からセンサの値を取り込むためのADコンバータ
  •  モータやLEDなどを動かすためのポート出力
  •  外部からの通信を行うためのシリアル機能
  •  時間計測するためのタイマ機能
  •  その他いろいろ

これらの周辺機能を利用し、ECUで対象のシステムを制御していきます。
周辺機能を利用するためには、レジスタと呼ばれるメモリに設定します。

   f:id:Vefortec:20200505102100p:plain   f:id:Vefortec:20200505102117p:plain



 この2つの資源を管理・制御するソフトウェアをつくる必要があり、C言語が多く利用されています。

C言語は、ハードウェアよりの記述ができる

 最近の高級言語では、変数や関数をメモリ上のどのアドレスへ配置するかを考えることはないと思います。しかし、C言語では、基本的にプログラマが自ら決定します。

 また、PythonJavaScriptのように役立つライブラリがあって、利用すればやりたいことができるなんてこともあまりありません。利用できる命令文を利用して、プログラマがやりたいことを直接記述していきます。これにより、どう動くのかわからないようなコード(暗黙のコード生成やバックグランド処理)がありません。
プログラマ記述したコード通りのプログラムのみが生成され、無駄な処理がなくなり、容量が小さく実行速度も速いものになります。

なので、マイコンの2つの特徴に対応したソフトウェアがC言語で作成できます。
これが、車載ソフト開発でC言語が採用される理由でしょう。

「過去資産の流用」という理由もあったり・・・

 最後の理由は、結局開発コストにつながるコレです。
 多くの開発が、既存ソフトを流用しながら開発を進めます。過去のソフトは、基本的にはC言語で開発されています。C言語の歴史は古く既に40年は利用されているでしょう。そのため、1から開発を行うより、既にあるものを利用するほうが開発効率もよくビジネス的にメリットがあります。 

 

新人に伝えたい車載ソフトウェア向けC言語のポイント

押さえておきたいC言語文法

キーワードだけ出します。ググれば新設丁寧に教えてくれるサイトがいっぱいあります。(サボってごめんなさい。そのうち充実させたいです。)

変数・関数

C言語に限らず出てくる箱と塊です。

四則演算・論理演算

足し算、引き算、掛け算、割り算。
AND、OR、NOT、シフト演算。

if文・switch文

選択・分岐処理。
それぞれの使い分けと、車載向けの作法を理解したい。

for文・while文

繰り返し処理。
これまた、それぞれの使い分けと、車載向けの作法を理解したい。

配列

たくさんの箱です。

構造体・共用体

たくさんの種類の箱を一つの箱に入れます。

ポインタ

C言語の難しいと言われるところ。
まずは、自分で書けなくても、読めるようになりましょう。

define・const

マクロ・定数。メモリへの配置のされ方の違いを意識して使い分ける。

Grep使ったコードリーディング(文法ではない)

 学生時代に授業で作った程度のソフトだと、一人で作れる程度のコード行数です。
どこに何が書かれているかもすぐに分かるレベルでしょう。
 しかし、小さなECUでも組織で複数人で作ったソフトになると、そうはいきません。
さらに、基本は既に昔の人が作ったソフトを流用することになります。
この時、書いてあるソースコードが読めなければいけません。
「どこでこの関数が呼ばれているのか」
「この定数はどこで定義されているのか」
など調べる際にGrep(グレップ)して、コードを読み解くスキルが必要になります。

車載C言語を書くためのガイドライン「MISRA-C」

 車載ソフトのC言語のためのソフトウェア設計標準規格「MISRA-C」というものがあります。C言語は、命令文も少なく、自由度の高い言語です。そのため、コンパイルは通るけど、動作させると思いもしない動きになることがあります。(よくある例だと、配列外アクセスなんかですかね)
 そのため、MISRA-Cでは、安全性・移植性・安全性・信頼性を確保することを目的に、書き方に対する約束事(規則、ルール)を定義しています。
 「C言語なんて学生時代に授業で習ったし、演習で電卓も作ったから問題ないぜ」という脱C言語初心者の方は、MISRA-Cの各ルールの思想を理解したうえで、コーディングができるようになるとよいでしょう。
※必ずしもすべて頭に入れる必要はありません。ツールで違反している箇所を探すこともできます。
 でも、勉強になると思うので一読しておくことをおススメします。

ちなみに2004と2012があります。2004については、ガイドが書籍化されています。
2012については、日本語に翻訳されたガイドのようなものはないようです。
(あったら教えてください)
2004で記載されている内容が理解できれば、2012でもさほど困ることはないでしょう。

おすすめ独学法

 最後に車載ソフトでC言語を使いたい人向けの独学法です。
まずは、基本の命令文を何かしらの参考書なり、授業なりで習得してください。

 その後は、正直実践あるのみです!
C言語も「言語」です。英語や日本語と同じ「言語」です。
文法・単語を教わったら、あとは繰り返し読んで、書いてを繰り返しましょう。

繰り返しの手段としては、
 実際にマイコンで動くソフトを作って遊んでみる
のがイイと思います。

 車載マイコンに近い形を構築したければ、R8CやRL78などの基板をネットで購入し、
マイコンの勉強も兼ねて実践できればベストでしょう。

 また、ArduinoやRaspberryPiをC言語で動かしてみるのもいいでしょう。
こちらであれば、オープンハードウェアなので、比較的すぐに動作させられるので、C言語の練習を重視することができそうです。

これからはじめるRL78/G13マイコン入門

これからはじめるRL78/G13マイコン入門