組み込みソフトエンジニアってどんなことやってるの?これまでやってきたことを振り返る
自分のエンジニアとしてのキャリアが14年目に突入した。
学生時代には、ロボットの研究をしていたので、組み込み系の開発にとても興味があり、その流れで組み込み系の仕事につくことにした。
組み込みだけでなく、Winアプリ開発やWeb開発など、広く浅く経験して来たが、キャリアの大半は、組み込みエンジニアとして過ごしてきたので、必要な知識やこれまでを振り返ってみる。
あくまで、私の経験に基づくものであり、人によって、理解が異なる部分があることをご了承いただきたい。
携わった分野
組み込み開発といっても様々な分野の仕事があるが自分は、以下のようなものに携わった。
あまり細かく言ってしまうと、製品名やメーカーが分かってしまうので、ボンヤリとした感じであげてみる。
- 飲食店向けの製品開発
- 音響製品の開発
- マイコン開発
- 発電機制御システム
- その他
BtoB向けの製品ばかりを担当してきているので、日常生活で作った製品にお目にかかることほとんどない。
飲食店向けの製品については、見かけることがあり、使われているのを見るとうれしかったりする。
経験した開発パート
ファームウェア・ドライバ開発
機器に組み込まれたハードウェアを制御するためのソフトウェア。
マイコンのハードウェアマニュアルや製品の回路図を見ながら、レジスタの設定を行ったりする。
レジスタの制御を誤ると、起動しなかったり、正しく動作しなかったりする。
ノウハウを持っている人に助けてもらったり、マニュアルと長い時間、にらめっこすることもある。
制御するデバイスは多岐にわたり、以下の様なものがある(ほんの一部)
・キースイッチ
・ LED
・ LCD(ディスプレイ)
・ EEPROM
・ その他
基板立ち上げの際は、ハードウェアの不具合もあったりするので、なかなか苦労する。
ハートウェアも試作を繰り返して、開発を進めるため、ハードウェアテスト用のプログラムを準備することもある。
上手く動いた時の喜びは大きい(^ ^)ミドルウェア
OSとアプリケーションの中間に位置するソフトウェア。
具体的にはファイルシステムやネットワークのプロトコルスタック(TCP/IP)のようなモジュール。アプリケーション
製品仕様にしたがって、シーケンス処理や各種デバイスを制御するソフトウェア。
個人的には、作成したプログラムが動作に直結するため、このパートが一番好き。
プログラム言語
C言語
間違いなく必須となる言語。
開発時には、C言語で実装された過去の資産を流用することがほとんどであり、使わないことはありえない。
C言語初心者が苦手とされるポインタは習得必須。
関数ポインタも良く実装に利用される。C++
C言語に比べたら割合は少ないが、C++で実装されている製品もある。
C言語が分かれば、どうにかなる実装になっていることが多い。アセンブラ
処理の最適化や高速化のため、また、CPU起動時の処理として使用する。
開発時に通常、アセンブラを意識することは、ほぼない。
自分もアセンブラ実装を見ることはあるが、書いたことはない。その他(C#やVB、VC++)
製品付属の設定ツールや開発を支援するためのツールとして、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アプリのキーイベント便利だなぁと思ったりする(笑)
機材
ソフトウェアエンジニアであっても使うことがある機材は、以下の様なものがある
Winアプリの開発
組み込み開発では、Winアプリの開発も発生することが多い。
用途としては、製品付属の設定ツールやデバッグ支援ツールなどである.
シリアル通信やUSB通信、HTTP通信を利用して、製品に接続するツール開発となり、設定変更やソフトウェアバージョンアップの機能を持たせることが多い。
組み込み系雑誌
以下の技術雑誌がオススメです。
付録基板が付くことがあって遊べますよー
付録基板で作ったもの
何年も前になるが、インターフェースの付録基板を使って、こんなの作ったことがある。
自分で回路図書いて、部品を買い漁って、はんだづけして、プログラム作って、みたいな感じだった。
- USB給電
- LCD(キャラクタディスプレイ)
- キー
- シリアルポート
- SDカード
今後やりたいこと
組み込み経験について書いてきたが、最近は組み込み開発はしておらず、Winアプリ開発が主な仕事となっている。
今は、Web開発に興味があり、DjangoやAngularを勉強し、投稿処理がようやくできる様になったくらいのレベルである。
自分ができないことや新しいことにチャレンジしたい性格なので、Web開発の勉強を続けていく。
(新しいことをやるのは脳にとっても良い刺激でしょう(笑))