問題タブ [firmware]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mobile - 中国のモバイルソフトウェア開発?
私の推測 () によると、何億もの中国の携帯電話 (またはブランドの携帯電話のクローン) が存在します。そして、これらの携帯電話のファームウェアと OS は同じようです。これらの電話機は設計が異なるだけで、ハードウェアである可能性があります。
それらの携帯電話用の開発キットまたはソフトウェア開発サポートがあるかどうか疑問に思っていました. それらの電話内のOSおよび/またはファームウェアは何ですか? それらはオープンソースですか、それともオンラインで入手できますか? これらの電話は Java をサポートしていますか? これらの電話とそのソフトウェアに関する詳細情報は、オンラインでどこで入手できますか?
よろしくお願いします。
git - 新しいプロジェクトの git repo レイアウトの提案が必要
私は、git リポジトリに保持する予定の新しいプロジェクトに取り組んでいます。CVSでこれを行う方法は知っていますが、gitには少し慣れていないため、いくつかの提案を使用できます。
このプロジェクトは、互いに通信し、ペアとしてパッケージ化された 2 つの組み込みデバイス用のファームウェアです。両方のデバイスに、コードの生産バリアントと製造バリアントがあります。両方のデバイス プロジェクトには、ハードウェアのさまざまなビット (LED の点滅など)、またはハードウェア関連のコード (ドライバーなど) を実行するためのサブ/兄弟プロジェクトが多数あります。ほとんどのコードはすべて共通です。
また、検証によって一方の変更が他方に送り返されるのを防ぐために、本番用と製造用のファームウェアを互いに独立して改訂できるようにする必要があります。
以下は私の既存のディレクトリレイアウトです。それは有機的に成長し、私が git を使用することになる前に大部分が敷設されました。より良い方法があれば、全体を再編成することを嫌いません。
- プロジェクトルート
- 含む
- ソース
- デバイスA
- 製造
- 製造業
- まばたき
- ボタン
- ...
- デバイスB
- 製造
- 製造業
- まばたき
- ボタン
- ...
私はブランチにプロダクションとマニュファクチャリングを配置したいと思っていますが、通常、特定の日に両方の作業を行っており、git では一度に 1 つのブランチしかアクティブにできません。そして、まばたきやボタンなどは実際には製造や生産ではないため、どうすればよいかわかりません。提案?
説明:
コードの製造バージョンは、製造ラインでハードウェアをテストするために使用されます。製品コードは、ハードウェアがテスト ステーションを通過した後に読み込まれ、顧客に出荷されます。この 2 つは少なくとも 75% は似ていますが、製造ラインを停止することなく生産コードのバグを修正できるように、独立している必要があります。
DeviceA と DeviceB はペアであるため、両方のコード セットがタグ付けされ、同じリリース バージョン番号で同時にリリースされます。
linux-kernel - Linuxカーネルはどのようにしてドライバーファームウェアを探す場所を知るのですか?
Ubuntuでカスタムカーネルをコンパイルしていますが、カーネルがファームウェアを探す場所を認識していないように見えるという問題が発生しています。Ubuntu 8.04では、ファームウェアはドライバーモジュールと同じようにカーネルバージョンに関連付けられています。たとえば、kernel 2.6.24-24-genericは、カーネルモジュールを次の場所に格納します。
およびそのファームウェア:
「代替ビルド方法:昔ながらのDebianWay」に従って2.6.24-24-genericUbuntuカーネルをコンパイルすると、適切なモジュールディレクトリが取得され、Intelワイヤレスカード(ipw2200)などのファームウェアを必要とするデバイスを除くすべてのデバイスが機能します。モジュール)。
カーネルログは、たとえば、ipw2200がファームウェアをロードしようとすると、ファームウェアのロードを制御しているカーネルサブシステムがファームウェアを見つけられないことを示しています。
errno-base.hは、これを次のように定義しています。
(ENOENTを返す関数は、その前にマイナスを置きます。)
カーネルの名前が2.6.24-24-genericディレクトリを指すシンボリックリンクを/lib/firmwareに作成しようとしましたが、同じエラーが発生しました。このファームウェアは非GPLであり、Intelによって提供され、Ubuntuによってパックされています。特定のカーネルバージョンと実際に結びついているとは思いません。cmp
は、さまざまなディレクトリのバージョンが同一であることを示しています。
では、カーネルはどのようにしてファームウェアを探す場所を知るのでしょうか?
アップデート
私が抱えている問題に対するこの解決策を見つけましたが、Ubuntuが排除され/etc/hotplug.d
、ファームウェアがに保存されなくなったため、機能しなくなりました/usr/lib/hotplug/firmware
。
Update2
さらにいくつかの調査により、さらにいくつかの答えが見つかりました。のバージョン92まではudev
、プログラムfirmware_helper
はファームウェアがロードされる方法でした。93以降、udev
このプログラムは、私が知る限り同じ機能を提供するfirmware.shという名前のスクリプトに置き換えられました。これらは両方とも、ファームウェアパスをにハードコードします/lib/firmware
。Ubuntuはまだ/lib/udev/firmware_helper
バイナリを使用しているようです。
ファームウェアファイルの名前は、パスに連結されてファームウェアのロードに使用されるfirmware_helper
環境変数で渡されます。$FIRMWARE
/lib/firmware
ファームウェアをロードする実際の要求は、システムコールを介してドライバー(私の場合はipw2200)によって行われます。
これで、ドライバーが環境変数を呼び出して確認する間のどこかでrequest_firmware
、カーネルパッケージ名がファームウェア名の前に追加されます。firmware_helper
$FIRMWARE
それで、誰がそれをしているのですか?
file - ファームウェア内のファイルを変更するには、新しいチェックサムが必要です
変更したい画像フレームのファームウェア ファイルがあります。この変更の目的は、起動時にデバイスにカスタム イメージを表示させることです。
既存の JPEG ファイルを独自のカスタム ファイルに切り替えることはできましたが、この新しいファームウェア ファイルでデバイスをフラッシュすることはできません。デバイスは無効なチェックサムについて不平を言っていますが、再計算していないので正しいようです。
これを進める方法についてのヒントはありますか?ファイル内のチェックサムを探してみましたが、これまでのところ成功していません。
オリジナルの変更されていないファームウェアとカスタム変更されたファームウェアが 1 つの zip ファイルに含まれています
c - 組み込みデバイスに適したシリアル通信プロトコル/スタック?
さまざまなプロジェクトのためにいくつかの異なるカスタムシリアルプロトコルを作成した後、私は毎回車輪の再発明をすることに不満を感じ始めました。すべてのプロジェクトのカスタムソリューションを開発し続ける代わりに、私はより一般的なソリューションを探していました。次の要件を満たすシリアルプロトコル(またはさらに良いのは実装)を誰かが知っているかどうか疑問に思いました。
- 複数のデバイスをサポートします。RS485バスをサポートできるようにしたいと考えています。
- 配達保証。ある種の確認応答メカニズムと、いくつかの単純なエラー検出(CRC16はおそらく問題ありません)。
- マスター/スレーブではありません。理想的には、スレーブはデータを非同期で送信できます。これは主に美的理由によるものであり、各スレーブをポーリングするという概念は私には正しく感じられません。
- OSの独立性。理想的には、プリエンプティブなマルチタスク環境にまったく依存しません。他のものを手に入れることができれば、私はこれを認めるつもりです。
- ANSIC.いくつかの異なるアーキテクチャ用にコンパイルできる必要があります。
速度はそれほど問題ではありません。他のニーズのいくつかを満たすために、速度をあきらめるつもりです。ただし、必要なリソースの量を最小限に抑えたいと考えています。
ピギーバックACKを使用し、選択的な繰り返しを使用せずにスライディングウィンドウプロトコルの実装を開始しようとしていますが、おそらく誰かが私に問題を解決できると考えました。私が活用できる既存のプロジェクトを知っている人はいますか?またはおそらくより良い戦略?
更新
私はTCP/IPの実装を真剣に検討しましたが、もっと軽量なものを本当に望んでいました。TCP / IPの機能の多くは、私がやろうとしていることには行き過ぎです。私は(しぶしぶ)、おそらく私が欲しい機能がより軽いプロトコルに含まれていないことを喜んで受け入れます。
UPDATE2CAN
に関するヒントをありがとう。私は過去にそれを見たことがあり、おそらく将来それを使用するでしょう。ただし、確認応答、バッファリング、再試行などをライブラリで処理することを本当に望んでいます。データリンク/物理層ではなく、ネットワーク/トランスポート層を探していると思います。
UPDATE 3
つまり、この分野の最先端技術は次のように思えます。
- 縮小されたTCP/IPスタック。おそらくlwIPやuIPのようなものから始めます。
- CANベースの実装では、おそらくCANバスに大きく依存するため、他の物理層では役に立ちません。CANフェスティバルのようなものが途中で役立つかもしれません。
- HDLCまたはSDLCの実装(このような)。これはおそらく私たちがたどるルートです。
この質問に出くわした場合は、お気軽に回答を投稿してください。
networking - (無料の) 組み込み TCP / IP スタックの経験はありますか?
次の組み込み TCP / IP スタックのいずれかで特に良い (または悪い) 経験をした人はいますか?
- uIP
- lwIP
- Bentham のTCP/IP リーン実装
- この本の TCP/IP スタック
私のニーズは、堅牢で移植しやすいスタックです。コードサイズはそれほど重要ではなく、パフォーマンスは比較的重要ですが、使いやすさと移植性は非常に重要です。
システムはおそらく RTOS を使用しますが、これは未定ですが、私の経験では、ほとんどのスタックは RTOS の有無にかかわらず使用できます。ほとんどの場合、プラットフォームは ARM バリアント (ARM7 または CM3 の可能性が高い) になります。
スタックをイーサネット ドライバーにボルトで固定することについてはあまり心配していないため、選択の優先順位は高くありません。
Linux、RTEMS などの OS からスタックを抽出することにはあまり興味がありません。
また、Interniche、Micrium などの商用サービスにも興味がありません...
スタックにはあらゆる種類の付属品は必要なく、IPv6 も必要なく、その上に何か (Web サーバー、FTP サーバーなど) も必要ありません。 UDP のみを使用しますが、TCP が望ましいいくつかのシナリオを想定できます。
もちろん、私が見逃した他のスタックでの経験も非常に興味深いものです。
お時間とご意見をお寄せいただきありがとうございます。
embedded - ファームウェア エンジニアは、ソフトウェア エンジニアから何を学べますか?
ファームウェア エンジニアリング ツール、プラクティスなどの歴史に関する私の知識から判断すると、ソフトウェア エンジニアリングの分野では一貫して数年遅れをとっています。たとえば、ファームウェアの世界では、アプリケーションに C++ を実際に使用する価値があるかどうかについて、まだかなりの議論があり、一部の C++ コンパイラは明らかに欠けています (マイクロチップ?!?)。これは主に、ファームウェアとソフトウェアの要件の違いによるものだと思います。繰り返しますが、歴史から判断すると、適切に精査されたツールと技術がファームウェアの世界に登場するのは時間の問題のようです.
現代のソフトウェア エンジニアが定期的に使用している方法、ツール、ベスト プラクティスなどは何ですか?ファームウェア エンジニアも技術を向上させるために活用できますか?
具体的には、次の軸に沿って考えています (ただし、制限しないでください)。
- コードのクリーン度/保守性の向上
- 欠陥の導入を減らし、検出を改善する
- ドキュメントの改善
- 要件管理
- 再利用性の向上
また、組み込みショップが理論的な実現可能性、さらには個人的な経験についてフィードバックを提供するために、回答または回答にコメントするのを楽しみにしています.
更新
私は特に、時代を少し先取りすることに興味があります。つまり、C++、TDD など、かなりよく吟味された (ほとんどの人にとってうまく機能する) 比較的新しいものです。
更新 2
これまでの回答で、一般的なプログラミングに関する優れたアドバイスをたくさん得ています。私は、アジャイルの実践者、TDD 担当者、および何かを試してみて、それが大きな成果を上げたり、ひどく失敗したりするのを見た他の人たちをからかおうとしています。ソフトウェア エンジニアとして、過去数年間に採用したツールやプラクティスで、非常にプラスまたはマイナスの影響がありましたか?
synchronization - 2つのタスク間の同期
これは実際には、組み込みシステムのファームウェアの設計上の質問です。2つのISR(同じ優先度)を個別に実行しています。これらのISRは、h/wがデータを生成するときにトリガーされます。task1とtask2を同期するために配置する必要のあるメカニズムが必要です。タスク2は、タスク1で計算された特定の値について知っている必要があります。この値は、タスク2で特定の値を計算するときに考慮する必要があります。使用するOSプリミティブがありません。つまり、システムにオペレーティングシステムがありません。Task1はISR1のコンテキスト内で実行され、task2はISR2のコンテキスト内で実行されます。私たちが使用しているプロセッサはSTMicroelectronics32コントローラです
編集:追加情報プロセッサは、データの準備ができたときに割り込みをトリガーする特定のIPに接続されています。これらのIPは、入力ストリーミングフレームデータの一種のアキュムレータとして機能します。
language-agnostic - ファームウェア開発の開始
私はソフトウェア開発者です。最近、私が働いている会社がその領域に参入しようとしているので、いくつかのファームウェア開発を試してみることを考えていました. ファームウェアの開発に関して、次のような質問がたくさんあります。
- IDE などのツールは何を使用していますか?
- ほとんどのコードはどの言語で書かれていますか?
- コードをマイクロコントローラに移植する方法は?
- さまざまなマイクロコントローラー用にコーディングする方法は?
- 特定のアプリケーションを構築するために必要なものを決定する方法 (マイクロコントローラの選択など)?
他に知っておくべきことはありますか? どこから始めればよいですか? この質問が基本的すぎる場合は申し訳ありませんが、他の場所で満足のいく答えを見つけることができませんでした.
history - ファームウェアという用語はどこから来ていますか?
ファームウェアという用語は、ハードウェアとソフトウェアの間にあると聞いています。また、ハードウェアを製造している会社(会社)からのソフトウェアを指していると聞きました。
この用語が最初に使用されたのはいつですか。また、この用語の由来は何ですか。