10

私は組み込みソフトウェア エンジニアで、経験は 3 年未満です。継続的に「鋸を研ぐ」ことを目指しています。C/C++ コーダーが熟達しなければならない、低レベルのプログラミングに固有のものがあるかどうか疑問に思っていました。

私の頭に浮かぶのは、ハードウェアのアーキテクチャと命令セットに精通していることです。ビットをいじる方法を知ることも重要です。リソース管理とパフォーマンスは私の仕事の一部です。他に何かありますか?

編集: 組み込み Linux ではなく、社内でカスタマイズされた RTOS を使用しています。

4

9 に答える 9

13

ここには高レベルのオペレーティングシステムの回答がたくさんありますが、具体的には低レベルとおっしゃっていました。

いくつかの散らばった考え:

  • テスト用に設計します。問題を解決するときは、テストごとに一度に1つだけ変更してください。
  • バスとインターフェース、spi、i2c、usb、イーサネットなどを理解する必要があります。今日、昨日、そして明日、uart、シリアルのナンバーワンのインターフェース。
  • フラッシュのプログラミングに関連する手順。
  • 製品を簡単にブリック可能にしないための秘訣。
  • 一般的なブートローダー。
  • パーツのさまざまなファミリでの上記のインターフェイスのビットバンギング(さまざまなチップベンダーが、ioピン、プルアップ、方向制御などについてさまざまなアイデアを持っています)。
  • ボードとチップが起動します。最初の電源投入時に数万行のコードプログラムを起動する必要はありません(リードオン、リードオフを考えてください)。
  • テスト機器(ロジックアナライザーとスコープ)をあまり使用せずに製品をデバッグする方法と同時に、デバッグにスコープを使用する方法を学ぶ必要があります。技術者やエンジニアがいなくても、はるかに価値があります。あなたと一緒にラボで。
  • 現場でユニットをどのように再プログラムしますか?ユーザーがユニットをフィールドアップグレードできるようにするときに、人的エラーを最小限に抑えるために何をしますか?フィールドのダウングレードも忘れないでください。
  • ハッキング(バイナリなど)を阻止するために何をしますか。
  • フラッシュ/ROMの効率的な使用(1つのバンクまたはセクションを磨耗させたり、磨耗を広げたり、フラッシュがそれを行っているかどうかを確認したりしないでください)。
  • ウォッチドッグタイマーをいつどのように使用するか。
  • ステートマシンは、バイトストリーム(シリアルおよびイーサネット)で非常に役立ち、適切にストリーミングされ、ステートマシンに合わせて調整され、部分的なパケットまたはランダムデータを良いパケット。
于 2009-07-07T22:14:22.167 に答える
11

次のような特定の概念

  1. エンディアン(このリンクは古いが良いlinuxjournalの記事へのリンクです)
  2. マルチスレッドアーキテクチャの効果的な使用(組み込みサイトは一般的に優れています)
  3. 組み込みシステムとマルチスレッドシステムのデバッグ
  4. 優れたプログラミング手法を理解し、学び、従う(リンクは非常に古く、要点は非常に一般的で主観的ですが、それについて考えてください)
  5. その他のこと(組み込みLinuxに関するこのIBMページは、私が言いたい他のほとんどのポイントを要約しています)
  6. もう1つ、テストを過小評価しないでください。または、テストケースの計画!!

私がコンセプトとして提供しているリファレンスリンクを使用して
ください。より深い知識を得るために、さらにフォローアップしてください。

于 2009-07-07T12:11:03.343 に答える
9

実際のチップのエレクトロニクスを研究したいと思います。それらが内部でどのように機能するか (アーキテクチャなど)、周辺機器とのインターフェイス、電気的およびタイミング特性などを学びます。

基本的に、データシートを最初から最後まで数回読んで、これまでに見たことのないものや使用したことのないものを掘り下げてください。

ところで、どんなチップを使っていますか?

于 2009-07-07T12:06:51.840 に答える
7

ブライアンが言ったことと同様に、単体テスト自動ビルドを作成する方法を学びます。

これらのスキルは、すべてのレベルのソフトウェアエンジニアが習熟している場合に適しています。これらのスキルは、コードの品質を向上させると同時に、コードベースのリファクタリングと改善を容易にします。

于 2009-07-07T12:17:46.480 に答える
4

まだ読んでいない場合は、すべてのソフトウェアエンジニアがThe Pragmatic Programmer andCodeCompleteを読む必要があると思います。これらは低水準プログラミングに固有のものではないことは知っていますが、すべてのサブ分野に適用できる豊富な知識があります。

于 2009-07-07T12:09:55.967 に答える
3

ポインタに精通しているため、これらの言語があまり機能しないチェック(バッファオーバーフローなど)、デジタル電子機器。運用システムの内部も役立つ場合があります。

ものが内部でどのように表現されているか、特に既製のデータ構造を理解してください(独自のデータ構造を構築しないと仮定します)。

何よりも、たくさん練習してください。それをすることはそれについて読むだけではなくあなたにはるかに多くをもたらします;)

于 2009-07-07T12:09:38.667 に答える
2
  • ビット操作
  • プロセッサ アーキテクチャ (キャッシュなど)
  • wcet 分析
  • スケジューリング

編集:言及するのを忘れていたのは、モデルベースの開発です。今日、制御アルゴリズムは、後で C コードが生成されるある種のオートマトンとして実装されることがよくあります。市販のツールには、MATLAB/SimulinkASCETSCADEなどがあります。

于 2009-07-07T12:44:05.957 に答える
1

良い質問。言及されていないものもあります...

低レベルのマルチタスクを実現するためのさまざまなオプションを学びます。基本的なラウンド ロビン (非プリエンプティブ) スケジューラから、ハードウェア タイマーのタイミング ティック、プリエンプティブ RTOS まで。RTOS が必要な理由と必要でない理由を学びましょう。RTOS を使用している場合は、PC のバックグラウンドを持つ初心者は、おそらくあまりにも多くのタスクを作成したいと考える傾向があることを知っておいてください。

デバッグのために内部を可視化することは困難な場合があります。通常は画面がないため、必要な場所に「printf」呼び出しをスローする必要はありません。エミュレーターまたは JTAG インターフェイスが理想的です。ブレークポイントを設定し、プログラムをステップ実行できます (ただし、ロボット アームを全速力で振り回すように、マイクロを停止してもハードウェアが異常にならないようにする必要があります)。エミュレーター/JTAG が利用できない場合は、いくつかの簡単なメモリ ピーク/ポーク コマンドを使用して、デバッグ チャネル用に予備のシリアル ポートを使用する方法 (またはシリアル ポートを作成するためにピンをビット バッシングする方法) を学びます。

于 2009-07-08T11:52:31.697 に答える
1

MISRA-Cブックを入手してください。もともとは自動車業界のメンバーによって作成されたもので、C で作成されたソフトウェアをより堅牢にするために、多くの (かなりの数!) の規則とガイドラインを適用しようとしています。

次に、PC-Lint (または別の静的解析ツール) を購入して、MISRA やその他のルールについてコードをチェックします。

これらは、特に低レベルおよび組み込み C に関連しています。これらの間では、ポインタ、メモリ リーク、整数昇格に関連する問題など、そのようなソフトウェアの多くのバグの原因を扱っているためです (これについては、 MISRA 本)、エンディアン、および未定義の動作。

于 2009-07-07T20:20:24.223 に答える