組み込みソフトウェア開発者になるには?


22

優れた組み込みソフトウェア開発者になりたい、またはこの分野で改善したい人のために、いくつかのヒントが欲しいです。

ハードウェア、ソフトウェアについて何を学ぶ必要がありますか?

どの本が最もお勧めですか?ブログ?

最後に、初心者の愛好家から優秀な専門家にどのようにすればいいですか?

回答:


39

これまでのところ、すべての回答は良好でしたが、2セントを投入します。

ひねりを加えたいくつかのヒントを繰り返します。

  • Learn C:まだポータブルなハードウェアの基本的な言語(ある程度)。単に学ぶだけでなく、volatileなどのすべての機能の専門家になり、デバイスドライバーを作成することがなぜ重要なのかを理解してください。
  • Arduinoのような優れた開発キットから始めますが、前に言ったように、他のアーキテクチャを理解したら、他のアーキテクチャを学びます。幸いなことに、他のプロセッサで構築されたArduino互換ボードがいくつかあります。これにより、同じデザインを別のuCで書き換えることができます。
  • 学習段階では、デバイスドライバーやその他のコードで車輪を自由に再発明してください。誰か他の人のドライバーコードをそこに落とすだけではありません。学習中に車輪を再発明することには価値があります。
  • 速度とメモリ使用量の観点から、コードをより効率的に書き直すことに挑戦してください。
  • さまざまなスタイルの組み込みシステムソフトウェアアーキテクチャに精通する。基本的な割り込み駆動型/バックグラウンドループ処理から開始し、バックグラウンドスケジューラー、リアルタイムオペレーティングシステムに進みます。
  • 適切なソース管理を入手してください!私は自分でMercurialを好みます。
  • Sourceforge.netBitbucket.orgなどの無料のソース管理ホスティングサイトにサインアップして、あなただけがプロジェクトに取り組んでいる場合でもプロジェクトをホストできます。彼らはあなたのコードをバックアップするので、その時々のハードドライブのクラッシュがすべてを破壊することを心配する必要はありません!分散VCSを使用すると便利です。ハードドライブの変更をチェックインし、準備ができたらホストサイトにアップロードできるからです。
  • 作業中のチップに合わせてツールをよく学んでください!コンパイラがアセンブリを作成する方法を知ることは不可欠です。アセンブリで書き直す必要がある場合があるため、コードがどれほど効率的であるかを把握する必要があります。リンカファイルの使用方法を理解し、メモリマップ出力を解釈することも重要です。書いたばかりのルーチンがROM / Flashを大量に使用している原因であるかどうか、他にどのように知りますか?
  • 新しいテクニックを学び、デザインで試してみてください!
  • デバッグ時には何も想定しません。確認してください!
  • エラーをキャッチして仮定を検証するために防御的にプログラムする方法を学ぶ(アサートの使用など)
  • メモリ消費量の出力やタイマーを使用したコードのプロファイリング、またはuCの予備ピンを使用してOスコープの割り込みレイテンシを切り替えて測定するなど、デバッグ情報をコードに組み込みます。

ここにいくつかの本があります:

ここにいくつかのウェブサイトがあります:

  • 組み込みの達人
  • Ganssle Group Jack Ganssleには、すばらしい歴史的な物語があります。記事を読んでください。しかし、彼はいくつかのことについて少し説教します。
  • Embedded.com Ganssle、Barr、およびその他の業界専門家からの最新のテクニックとヒントに関する良い情報。

1
@アダム:私はその本が大好きです!実用的なプログラマー!忘れたなんて信じられない!
ジェイアトキンソン

1
Mercurialの場合は+1。私は気に入っていますが、gitの習熟度がより価値があると感じています。SVNで基本を知ることは、他のプロジェクトに貢献したり、他のプロジェクトからプルしたい場合に非常に重要です。
tyblu

17
  • 「特効薬はありません」ということを忘れないでください。すべての問題を解決できるツール、方法論、言語、またはシステムが1つあると信じ込まないでください。
  • Cのエキスパートになる
    • malloc()およびPOSIXを使用せずに取得する方法を学ぶ
  • 1つのアーキテクチャにこだわらないでください。偶然PICやAVR、ARMのファンボーイになるのは簡単です
  • ビルド、デバッグ、動作させる。練習が完璧になります
  • 少なくとも1つのソース管理システム(SVN / git / etc)を学習して使用する
  • 常に仮定をテストする準備をしてください。バグは通常、動作していると想定しているものにあります
  • デバッガーに頼りすぎないでください。デバッガーはシステムごとに異なり、信頼性も異なります。
  • fru約します。問題解決の際には、コードフットプリント、RAMフットプリント、ハードウェアコストを考慮してください

本については、歴史を掘り下げることをお勧めします。今日の組み込みソフトウェア技術のほとんどは、昨年の最先端から来ています。

何でもそうですが、毎日練習してください。


5
私が学んだすべてのことのうち、バージョン管理(現在はsubversionを使用しています)は私の生産性にとって最も価値のあるものです。私がここで始めたとき、マイクロソフトによるソースセーフがあったので、私は悪い解決策を使い、それから良い解決策を使いました。
Kortuk

ソース管理システムがなければ私の人生は想像できません。私も現在SVNを使用しています。SVNを知る前は、物事がどのように機能したのかわかりません。
ダニエルグリロ

1
「バグは通常、動作していると想定しているものにあります」
-JustJeff

「mallocを使用せずに取得する方法を学ぶ」-なぜですか?スタック/ヒープの衝突のリスクを最小限にするには?
-rzetterberg

それは、ヒープ断片化と非決定論につながる可能性として、多くの組み込みシステムは、動的なメモリ割り当ての使用を回避@rzetterberg
トビーJaffey

8

他の答えは素晴らしいですが、愛好家とプロの最大の違いは品質に関する考え方です。そのため、プロジェクトを最後まで進めてください。プロジェクトの80%が完了したときに停止しないでください。それをすべて取り、それが機能していることを証明し、正しく文書化します。

コードが読み取り可能で保守可能であることを確認してください。

そして、いくつかの楽しみも忘れないでください:)


7

Cを学び、開発者ボードから始めるなどの明白なこととは別に、マイクロコントローラーのデータシート読むこと学びたいと思うでしょう。
製造業者は、より多くの機能をマイクロコントローラーに追加しているため、より複雑になっています。データシートは、電気的特性(ソフトウェア開発者よりも電子技術者にとって興味深い)を提供するだけでなく、レジスタ、メモリマップなどの詳細な説明も提供
します。デバッグ段階でより深刻な頭痛を引き起こす可能性があります。


3

「Embedded」は少しロードされた用語です。

いくつかの点で、制御するハードウェアがある限り、単一のアプリケーションの実行専用のシステムを組み込みシステムと呼ぶことができます。ローカルI / Oモジュールを介してプロセスを制御している場合、Linux上でJavaアプリケーションを実行する2GBのRAMを持つ400MHz PPC604をほぼ間違いなく組み込みシステムと呼ぶことができます。一方で、ある種の最小限のネットワークアプリケーションを実行するだけのarduinoは、組み込みシステムではありません。しかし、おそらく「埋め込まれた」ことで、ほとんどの人は、わずか数百バイトのRAM、オペレーティングシステムのないフラッシュベースのコントローラー、そして多くのオンチップ周辺機器を考えるようになります。

そうは言っても、非組み込みプログラマが通常組み込みシステムの学習に直面する2つの最大のハードルは、I / Oレジスタと割り込みです。

割り込みは、非組み込みプログラマにとって対処しやすい2つの概念のうち実際には簡単かもしれません。これらの主な問題である並行性とイベント駆動型プログラミングは、主流のアプリケーションで頻繁に発生するためです。割り込みを苦しめるのは、割り込み処理の品質に対するシステムの極端な感度、および割り込み条件をクリアして次の条件に設定するためのハードウェアの扱いの複雑さを実現することです。GUIを使用すると、デッドロックはアプリケーションだけを殺します。割り込みハンドラを使用すると、デッドロックによりシステム全体がロックされます。

I / Oデバイスが最も困難な領域のようです。初心者にとっては、このレジスタをここで読むと、そのレジスタ影響があることを発見するのは非常に驚きです。1を書き込んでビットをクリアします。データレジスタなどの読み取り時に自身をクリアするステータスビット シリアルポート用のデバイスドライバーを作成すると、低レベルのI / Oプログラミングについて多くを学ぶことができます。

実際にこれらのことを学ぶことに代わるものはありません。袖をまくり、ベアメタルでCやアセンブリ言語をプログラミングします。前述のJavaベースの組み込みシステムでさえ、最終的にはI / O用のデバイスドライバーが必要になります。これは、最終的にCを扱うことを意味します。経験が最高の教師です。マイクロコントローラを選び、MSP430、TMS320、AVR、ARM、PIC、68HC11など、評価キットを見つけて、いくつかのシステムを構築します。


3

$50to$しかし、あなたはプロミニのためにはんだ付けする必要があります。私はPICファミリーのファンではありませんが、歴史の教訓として何かを手に入れたいかもしれません、8051についても同じことが言えます。両方のファミリーはまだ人気があり、使用されていますが、あまり効率的ではなく、他のアーキテクチャに引き継がれています。ARMと親指、おそらくMIPS(これはpic-32であり、古いオリジナルのPICアーキテクチャと混同しないでください)を絶対に学んでください。ARMmite ProはエントリーレベルのARMボードとしては優れていますが、Stellarisも同様です。

ここで学びたいのは、さまざまなプラットフォーム用のアセンブラです。C. Cとアセンブラーの相互作用。さまざまなツールGCCと非GCC。データシート/プログラマーのリファレンスを読む方法(およびそれらすべてに何らかのエラーがあるか、誤解を招く可能性があること、それらを信頼しない、ハードウェアがドキュメントに勝つ)および回路図の読み取りまたは使用方法。これらは通常、複雑な回路図ではありません。多くのボードは、プロジェクトのインターフェイスに適しています。つまり、ボードにゴミがなく、I / Oピンに直接アクセスするだけです。しかし、それは学習には最適ではありません。ステラリスのようなものプロジェクトに苦労するボードには、組み込みの学習や、ドライバーの借用/使用やデータシートから独自の記述を学ぶための楽しいものがたくさんあります。Atmel AVRバタフライは、利用可能な場合でも優れたボードです。プログラムするために独自のシリアルポートにはんだ付けするか、穴にいくつかのワイヤを詰める必要がある場合があります。それが提供するのは、プログラミングを学べる周辺機器です。

LinuxまたはRTOSでSDKまたはAPI呼び出しを使用してアプリケーションを書く(ハードウェアに触れたり、データシートを読んだりしない)ことを伴う組み込み作業を行うことになったとしても、上記の知識はまだ先を行くでしょう。


3

この記事(ポルトガル語から英語への自動翻訳)は、組み込みソフトウェアの開発者としてのキャリア開発の概要を説明しています。注:オリジナルはこちらです。

それはあなたが開発しなければならない知識の範囲を概説することから始まります:

  1. 知識:組み込みシステムに関係する理論を知っている必要があります。これはハードウェアとソフトウェアを意味します。動作しているハードウェアアーキテクチャを知ることなく、組み込みソフトウェアの有能な開発者になることは不可能です。

  2. スキル:その地域で経験を積む必要があります。練習が必要です。すべてのPICアセンブラーのニーモニックを装飾できますが、この知識でLEDを駆動できない場合は役に立ちません。

  3. 態度:何よりも、この分野で成長するための態度が必要です。頻繁に変更や開発が行われる非常にダイナミックなものです。常にやる気にさせる必要があります(a)独学し、学習を楽しみ、「調整」し、物事の仕組みを理解する そのような態度がなければすぐにあなたに与えます。この領域は非常に永続的である必要があるためです。

次に、これらの領域を習得するための次のヒントを示します(さらにテキストで開発します。これらは単なる見出しです)。

  1. ハードウェアを学ぶために必要なもの(少なくとも)
  2. ソフトウェアを学ぶために必要なもの(少なくとも)
  3. さらに、オペレーティングシステムを研究する
  4. トレーニングが必要です
  5. 停止しないで、ネットワークの学習と開発を続けてください!

1
リンクをありがとう!Googleの翻訳は、この質問にぴったりであることを示しているようです。ただし、(1)テキストは英語(私たちの多くは少なくともバイリンガルですが、英語を話すコミュニティです)-(2)回答に含まれる必要がある場合にのみ自動翻訳することをお勧めしますリンクが機能しなくなった場合の記事の要約。これらのガイドラインに従うように投稿を編集し、賛成票をいただきました!
ケビンフェルメール

2

組み込みソフトウェアエンジニアになる前によく考えてください。私のキャリアにはいくつかの段階があります。私は、販売/マーケティングへの移行よりも最初の5年間にソフトウェアを開発し、15年間それを行い、1億ドル以上のビジネスを管理し、ソフトウェアに戻りました。

15年後にソフトウェアに戻ったとき、最初に去った理由を思い出します。それは難しい。集中する必要があり、数百行のコードが互いに接触しているので、すべてをメモリに保持する必要があります。組み込みは特に難しいです。

また、あなた自身を理解する必要があります。あなたが一般的に賢い人で、細心の注意を払い、忍耐強いなら、素晴らしいエンジニアを作るでしょう。それらのいずれかが欠けている場合、あなたはせいぜい平均になります。それについて考えてください。あなたが非常に賢く、忍耐強くない場合、あなたがどれほど賢くても、良いエンジニアリングは忍耐と細部への注意を払うので、あまり価値がありません。

また、会話せずに一度にコード時間を快適に見る必要があります。私は、優れた社会的スキルを持つ人々がこれを耐え難いものと感じることを観察します。

これらすべてをチェックアウトしたら、これらのすばらしい本をすべて読むよりも、演習を行ってください。そうすれば、すばらしいエンジニアを作ることができます。


1

他の誰もが素晴らしいことを言います。だから私はあなたに一般的なアドバイスを与えます:読んで読んで読んで読んで読んで読んで読んで読んでください!

http://embeddedgurus.comのすべての記事を読んでください 。何か理解できない場合は、調査してください。それらの説明で理解できないことが見つかった場合は、もう少し読んでください。私は組み込みソフトウェアの職に就こうとしていますが、私の経験は過去数年間のほんの一握りのプロのプロジェクトで、たくさんの読書をしています。経験は物事を試すことができますが、読書はあなたがしようとしたことが以前に行われたかどうかを知ることができます。どのような状況でも作業できる概念を紹介します。

読むだけ!


0

Cタイマーとシリアル通信を理解するCのエキスパートになります。あなたはそれで手を汚すべきです。RFプロトコルを理解し、要件に合わせて微調整します。デバッグ中に盲目的にコードの組み合わせを試してはいけません。コードは、指示どおりに実行します。ユーザーマニュアルとデータシートを読んで、何かがうまくいかない場合は変更してください。言ってやったことすべて、専門家になるための唯一の本当の方法は練習することです。アプリケーションの構築を続けます。すぐに、それは第二の性質になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.