moto blog

組み込みソフトエンジニアってどんなことやってるの?これまでやってきたことを振り返る

f:id:nmmmk:20180511000552j:plain

自分のエンジニアとしてのキャリアが14年目に突入した。

学生時代には、ロボットの研究をしていたので、組み込み系の開発にとても興味があり、その流れで組み込み系の仕事につくことにした。

組み込みだけでなく、Winアプリ開発やWeb開発など、広く浅く経験して来たが、キャリアの大半は、組み込みエンジニアとして過ごしてきたので、必要な知識やこれまでを振り返ってみる。

あくまで、私の経験に基づくものであり、人によって、理解が異なる部分があることをご了承いただきたい。

携わった分野

組み込み開発といっても様々な分野の仕事があるが自分は、以下のようなものに携わった。

あまり細かく言ってしまうと、製品名やメーカーが分かってしまうので、ボンヤリとした感じであげてみる。

  • 飲食店向けの製品開発
  • 音響製品の開発
  • マイコン開発
  • 発電機制御システム
  • その他

BtoB向けの製品ばかりを担当してきているので、日常生活で作った製品にお目にかかることほとんどない。

飲食店向けの製品については、見かけることがあり、使われているのを見るとうれしかったりする。

経験した開発パート

  1. ファームウェア・ドライバ開発
    機器に組み込まれたハードウェアを制御するためのソフトウェア。
    マイコンのハードウェアマニュアルや製品の回路図を見ながら、レジスタの設定を行ったりする。

    レジスタの制御を誤ると、起動しなかったり、正しく動作しなかったりする。

    ノウハウを持っている人に助けてもらったり、マニュアルと長い時間、にらめっこすることもある。

    制御するデバイスは多岐にわたり、以下の様なものがある(ほんの一部)
    ・キースイッチ
    ・ LED
    LCD(ディスプレイ)
    ・ EEPROM
    ・ その他

    基板立ち上げの際は、ハードウェアの不具合もあったりするので、なかなか苦労する。

    ハートウェアも試作を繰り返して、開発を進めるため、ハードウェアテスト用のプログラムを準備することもある。

    上手く動いた時の喜びは大きい(^ ^)

  2. ミドルウェア
    OSとアプリケーションの中間に位置するソフトウェア。
    具体的にはファイルシステムやネットワークのプロトコルスタックTCP/IP)のようなモジュール。

  3. アプリケーション
    製品仕様にしたがって、シーケンス処理や各種デバイスを制御するソフトウェア。

    個人的には、作成したプログラムが動作に直結するため、このパートが一番好き。

プログラム言語

  • C言語
    間違いなく必須となる言語。

    開発時には、C言語で実装された過去の資産を流用することがほとんどであり、使わないことはありえない。
    C言語初心者が苦手とされるポインタは習得必須。
    関数ポインタも良く実装に利用される。

  • C++
    C言語に比べたら割合は少ないが、C++で実装されている製品もある。
    C言語が分かれば、どうにかなる実装になっていることが多い。

  • アセンブラ
    処理の最適化や高速化のため、また、CPU起動時の処理として使用する。
    開発時に通常、アセンブラを意識することは、ほぼない。
    自分もアセンブラ実装を見ることはあるが、書いたことはない。

  • その他(C#VBVC++)
    製品付属の設定ツールや開発を支援するためのツールとして、Winアプリを作成することが多い。

OS

使ったことのあるOSは、以下の通り。
上の2つはリアルタイムOSと呼ばれる。 リアルタイムOSは、RTOSとも呼ばれ、リアルタイム性を持ったOSである。

システムリソース

マイコンのメモリ配置方法は(RAM領域とかROM領域とか・・・)ある程度決まっており、その領域のサイズも制限されるため、グローバル変数として定義する変数のサイズにも気を使ったりする。

スタックオーバーフローが発生しない様に、関数内のローカル変数のサイズに気をつける必要があったりする。
スタックを意識せずに、関数内に定義している配列をchar data[64] から char data[255]に変更すると、落ちる様になったことがある( ;∀;)

デバッグ

デバッグには、以下の様な手法がある。

  • JTAG ICE
    PCとターゲットボート間をJTAG ICEというもので接続して、IDEデバッグする。
    Visual Studioと似た様な感覚で、デバッグすることができるが、それでも、ブレークポイントで止まらないことがあったり、苦労する面はある。

  • LED
    LEDが実装されている製品の場合、対象の処理を通過したことをLEDのON、OFFや点滅間隔で表現したりすることがある。
    過去、これでデバッグして、解決した問題もある。

  • GPIOポート
    オシロスコープを接続して、対象のGPIOポートのON、OFFで対象の処理を通過したことを判断することがある。
    また、関数の開始でON、関数の終了でOFFすることにより、オシロスコープを用いて、関数の処理時間を計測することもある。

  • printf
    シリアル(UART)やUSBにprintf出力したりする。
    専用のツールを開発したり、TeraTermを使用することが多い。

こんな処理も作ったことがある

キーの押下処理について、以下の様なパターンをGPIOのON/OFFやタイマーで条件を組み合わせて、作ったことがある。

  • キープレス
  • シングルクリック
  • ダブルクリック
  • 同時押し
  • 長押し

上手く実現できたときは、ちょっと感動した( ^ω^ )
Winアプリのキーイベント便利だなぁと思ったりする(笑)

機材

ソフトウェアエンジニアであっても使うことがある機材は、以下の様なものがある

  • はんだごて
    JTAGを繋ぐための線だとか、通信ラインをオシロスコープで確認するための線を基板から出してもらうことが多い。
    線が基板から外れてしまった場合、自分ではんだづけし直すことがある。

  • オシロスコープ
    デバッグ目的や通信波形を確認するために、使用する。

Winアプリの開発

組み込み開発では、Winアプリの開発も発生することが多い。

用途としては、製品付属の設定ツールやデバッグ支援ツールなどである.

シリアル通信やUSB通信、HTTP通信を利用して、製品に接続するツール開発となり、設定変更やソフトウェアバージョンアップの機能を持たせることが多い。

組み込み系雑誌

以下の技術雑誌がオススメです。
付録基板が付くことがあって遊べますよー

付録基板で作ったもの

何年も前になるが、インターフェースの付録基板を使って、こんなの作ったことがある。
自分で回路図書いて、部品を買い漁って、はんだづけして、プログラム作って、みたいな感じだった。

  • USB給電
  • LCD(キャラクタディスプレイ)
  • キー
  • シリアルポート
  • SDカード

f:id:nmmmk:20180513201523j:plain

今後やりたいこと

組み込み経験について書いてきたが、最近は組み込み開発はしておらず、Winアプリ開発が主な仕事となっている。

今は、Web開発に興味があり、DjangoやAngularを勉強し、投稿処理がようやくできる様になったくらいのレベルである。

自分ができないことや新しいことにチャレンジしたい性格なので、Web開発の勉強を続けていく。
(新しいことをやるのは脳にとっても良い刺激でしょう(笑))