マイクロコントローラーに組み込みCを作成するための仕事に取り組んでいます。最初は、プログラミングをソフトウェアスタックに埋め込むのは低すぎると思っていたでしょうが、おそらく間違っていると考えています。
私は自分自身を電気技師とは考えていないので、通常は埋め込みコードを書く機会を遠ざけていました。これは悪い仮定ですか?組み込みシステム向けの興味深く有用なソフトウェアを作成できますか、それともソフトウェアスタックが少なすぎると気が引けますか?
私はコンピューターサイエンスの学校に行き、コンパイラーの作成、並行アルゴリズムの検討、データ構造の設計、フレームワークの開発を本当に楽しんでいました。しかし、私は現在Web開発者として働いています。これは、今説明した興味深いことを叫ぶことはありません。 (私は現在、「このチェックボックスは左に4ピクセル必要です」、「この日付の形式が正しくありません」などの問題を扱っています。)
皆様のご意見に感謝いたします。私は自分で決断しなければならないことを知っています。組み込みプログラマであることが何を意味するのか、それが私が興味深いと思うことに適合するかどうかについて、いくつかの説明をお願いします。
組み込みシステムでの作業に長けたい場合は、はい、いつかEEのように考える必要があります。一般的には、さまざまなペリフェラル(UART、SPI、I2CまたはUSBなどのシリアルバス)、8ビットおよび16ビットタイマー、クロックジェネレーター、ADCおよびDACとインターフェイスするコードを記述している場合です。マイクロコントローラの「データシート」は、すべてのレジスタのすべてのビットを説明しているため、数百ページに及ぶことがよくあります。オシロスコープまたはロジックアナライザーでボードをプローブできるように、回路図を読み取ることができます。
それ以外の場合は、ソフトウェアを作成するだけです。しかし、厳しい制約の下では、正式なOSやその他のフレームワークがなく、RAMが数KB、プログラムメモリが64 KBしかない場合があります。 (これらの制限は、8ビットまたは16ビットの小さなマイクロでプログラミングしていることを前提としています。32ビットプロセッサで組み込みLinuxを使用している場合、同じメモリ制約はありませんが、カスタムを処理する必要があります。 Linuxディストリビューションがドライバーを提供していない周辺ハードウェア)
私はEEとCSの両方のバックグラウンドがあるので、コインの両面を楽しんでいます。私はいくつかのWebプログラミング(主にPHP)とデスクトップアプリ(C#とDelphi)も行っていますが、組み込みプロジェクトでの作業は常に最も楽しんでいます。
@tcrosleyの答えは素晴らしいです。電気技師である必要はありませんが、基本を知っていると役立ちます。
「ソフトウェアスタックが少なすぎる」ことを恐れる必要はないと思います。組み込みエンジニアとして、非常に興味深い多くの問題を解決しなければなりませんでした。あなたは楽しんだタスクのリストについて言及します:
並行アルゴリズム-非同期ハードウェアレベルの割り込みの処理には、OSスレッドモデルの使用と同じくらい多くの興味深い課題があります。
データ構造の設計-チェック。コンパクトで効率的なアクセスのための設計。
フレームワークの開発-チェック。最小限のシステムでは、ミニOSを設計することになります。
コンパイラーの作成-おそらくそうではないかもしれませんが、コンパイラーのアセンブリー生成ステップと同様に、低レベルのコード最適化を行うことができます。
私はいつでもUIのコーディングよりも組み込みシステムに取り組むことを選択します。プログラミングした方法で機械が動き始めるのを初めて見たときのことを決して忘れません。ピクセルをプッシュするよりもはるかに満足です。
組み込みプログラマとしての私の仕事は、カスタムハードウェアを機能させることです。通常、開発ボードまたは以前のバージョンのハードウェアで多数のソフトウェアを開発しました。新しいボードが登場したら、私の仕事はソフトウェアをボードに置き、すべてが機能することを示すことです。
ほとんど常に何らかの問題があるため、デバッグのスキルは不可欠です。外付け周辺機器が機能しない場合、それは不良チップ、チップへの接続不良、バグのあるコード、または内蔵周辺機器の不適切な使用ですか?伝える唯一の方法は、広範なデバッグを使用することです。これは、オシロスコープ、ネットワークアナライザー、ロジックアナライザー、ターゲットデバッガーに慣れていることを意味します。デバッグプロセスはほとんど科学的になります。私は仮説を立て、自分の仮説に対するまたは反対の証拠を提供する実験を設計し、テストします。
インターンや新しい組込みエンジニアを評価する場合、このスキルは最も重要です。すべてのソフトウェアに問題がありますが、物理的な世界とのインターフェースを開始すると、それらの問題の多様性が指数関数的に増加します。私の仕事の本質は、コンセプトと現実の間の長い一連の問題を解決することです。
私の経験では、「電子技術者」の帽子よりも「ソフトウェア開発者」の帽子を使用して、組み込みシステムのソフトウェア開発にアプローチする方が良い結果が得られます。 (ハードウェアエンジニアリングではTDDやCIのようなプラクティスはあまり一般的ではありません)
一方で、組み込みシステム向けの開発経験は、それをより良くすると思います。より包括的なソフトウェア開発者。
私は約8年前に同様の状況にありました。その時点で、アプリケーション環境とサーバー環境で7年間ソフトウェアを開発していました。以前にハードウェアの低レベルを扱った私の唯一の経験は、ZXスペクトラムのティーンエイジャーとしてZ80アセンブラーでの記述でした。
それは確かに挑戦でした。アセンブラーでチップセットを扱うのはとても楽しいと思い、ハードウェアについて多くのことを確かに学びました。私の役割のかなりの部分は、ソフトウェアを使用してハードウェアをテストすることでした。そのため、プログラミングに対処する方法を学び、ソフトウェアのバグが実際にはハードウェアのバグであることを認識しました。実際には、バグがハードウェアであるかソフトウェアであるかを特定するには、ソフトウェアとハードウェアの担当者によるかなりの作業が必要になる場合があります。
私が提供できなかった1つの側面は、デバイスドライバの作業でした。私はこれを本当に理解したことはありません。これは私自身とその取締役がその理由を理解できなかったことの1つです。それはちょうど受け入れられた事実になりました。
オシロスコープとはんだ付けイオンに慣れることが不可欠です。ハードウェアの男が26と言ったとき、彼は常に0x26が有用であることを忘れないでください。ハードウェアエンジニアがソフトウェアを扱うのは非常にイライラすることに気づくと理解しますが、ソフトウェアを含まないハードウェアプロジェクトはケーブルと呼ばれます。
私はその役職に4年間在籍し、本当に素晴らしい機会を求めて密猟されただけで辞めました。
私は電気技師ではありませんが、組み込みソフトウェアの開発を少量行っています。私が見つけた最大の問題は、数学の基礎知識がはるかに多いため、高度な数学アルゴリズムの複雑な一連のコードを簡単にコードに分解する方法がわからないことです。
シグナリングで遊んだり、入力から値を読み取ったり、データを出力に送信したりするために必要なすべてのこと、およびすべてのそのようなことについて、私は、私が日常的に行っていることと概念的には少し異なっていることに気づきました昔ながらのソフトウェア開発者。ソフトウェアを書くことは本当にそれが何であるかです。ハードウェアを直接いじくる知識がないので、実際のソフトウェアを超えて外出する必要があるとき、私は物事が危険にさらされていると思います。これは通常、コードをデバッグまたはテストしようとしたときに発生します。本当に素晴らしいツールチェーンがある場合、ほとんどの痛みを取り除くためにデバッグとシミュレーションの環境を統合しているかもしれませんが、それでもすべてが役立つ場合でも、基本に戻ってコードをテストする必要がある場合があります。ある種のアナライザーであり、実際には、ほとんどの組み込みプラットフォームでは、基本的なコンパイラーとEEのOuija-Board以外の贅沢は提供されていません。
この観点から、タスクが単純で、実際のハードウェア固有の要件が最小限であれば、組み込みエンジニアにとって電気エンジニアであることは不可欠だとは思いません。さらに、組み込み環境で作業する場合、特に問題がどこにあるのかを理解するために実際の科学が必要な場合、EEになると生活がはるかに楽になると思います。
私はビジネスレベルの組み込みプログラミングを行ったことがありませんが、私の学士号は主に組み込みシステムに関するものであり、数年の実経験があります。 Atmel AVRでCを使用し、VHDLでいくつかのTexas Instrumentsチップに触れ、ARMで理論的なものをいくつか使用しました。
我々が持っていたものでは、それはおよそ50-60%プログラミング(C)、20%計画/設計(UML)であり、残りは物理的な電子機器(はんだ付け、測定、配線、ケーブルの作成など)でした。それがとても面白くて楽しかったことにも同意します。実際に、組み込みシステムでのキャリアも望んでいます。悲しいかな、組み込みシステムの市場は非常に小さいため、私は昔ながらのJava EEに頼らざるを得ませんでした。
しかし、私は余談です。私たちの教師は独自の企業を持っているので、上記のパーセンテージは実際の仕事に非常に近いと言えます。プロジェクトの途中で要件がランダムに180度変わりました。
スタックも。組み込みプログラミングを知ることで、アジアの実際のプラントで製造できる独自の非常に現実的なハードウェア製品を作成し、それらを自宅で(または自宅で)組み立てる大きなチャンスが得られます。とても面白いです!また、動きを制御するハウスライト、コーヒーマシンが朝のジョーを自動的に準備するタイマーなど、自宅で役立つ多くのガジェットを作成することもできます。確かにエキサイティングなもの!
すべてのように、それはバランスの取れたアプローチを必要とします。私は、日々の仕事で組み込みシステムを扱うのが大好きです。彼らは私を電気工学でよりよくします。物理計算と自動化は非常に刺激的です。一方、ウェブアプリを構築してクラウドコンピューティングをいじるのは素晴らしいことです。
あなたがそれを正しく行うと、あなたのソフトウェア側は物事をよりスマートにそしてより良くする方法を探すでしょう。ハードウェア側では、リソースを意識し、非常に効率的です。