2

複数のチップのマジック アドレスのリストをチップ メーカーから入手するにはどうすればよいですか? それがサポートする価値についてのまともな説明はありますか?

私はそれを呼び出す/検索する用語さえ理解できませんでした。

組み込みプログラミングを始めたばかりです。あらゆる種類のものに設定しなければならない魔法のビットがたくさんあります。

通常、私は何かに遭遇します:

MOV BLKMGC 0x01

また

REO034 = 0x80; // stops all onboard leds, boot freebsd, makes coffee, do laundy.
               // use 0x81 if you have more white clothes than color ones.

彼らが何をしているのかを説明するコメントが時々あります。私は主に、サンプル コードで見つけたすべてのメモを取っています。通常、msp430 ランチパッド用のものは、親切で冗長な人々によって書かれており、多くのコメントがあり、チップ ファミリ ノートでアドレス マップの一部を見つけることさえできますが、理解できるリストはほとんどありません。それを完全に理解しようとすると、Arduinosでより一般的なチップがさらに望まれます。(確かに、私はまだそれを検索する方法がわかりません:)

私がこれまでに見つけた最良の場所は、私が使用しているチップのヘッダーファイルです...しかし、それでも、次の例を見てください:

 void main(void) {
    WDTCTL = WDTPW + WDTHOLD;                 // Stop Watch Dog Timer
    // how 99% of msp430 programs start.

今ヘッダーファイル:

#define WDTCTL_               0x0120    /* Watchdog Timer Control */
sfrw(WDTCTL, WDTCTL_);
/* The bit names have been prefixed with "WDT" */
#define WDTIS0              (0x0001)
#define WDTIS1              (0x0002)
#define WDTSSEL             (0x0004)
#define WDTCNTCL            (0x0008)
#define WDTTMSEL            (0x0010)
#define WDTNMI              (0x0020)
#define WDTNMIES            (0x0040)
#define WDTHOLD             (0x0080)

#define WDTPW               (0x5A00)

/* WDT-interval times [1ms] coded with Bits 0-2 */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MDLY_32         (WDTPW+WDTTMSEL+WDTCNTCL)                         /* 32ms interval (default) */
#define WDT_MDLY_8          (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)                  /* 8ms     " */
#define WDT_MDLY_0_5        (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)                  /* 0.5ms   " */
#define WDT_MDLY_0_064      (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)           /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ADLY_1000       (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)                 /* 1000ms  " */
#define WDT_ADLY_250        (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)          /* 250ms   " */
#define WDT_ADLY_16         (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)          /* 16ms    " */
#define WDT_ADLY_1_9        (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)   /* 1.9ms   " */
/* Watchdog mode -> reset after expired time */
/* WDT is clocked by fSMCLK (assumed 1MHz) */
#define WDT_MRST_32         (WDTPW+WDTCNTCL)                                  /* 32ms interval (default) */
#define WDT_MRST_8          (WDTPW+WDTCNTCL+WDTIS0)                           /* 8ms     " */
#define WDT_MRST_0_5        (WDTPW+WDTCNTCL+WDTIS1)                           /* 0.5ms   " */
#define WDT_MRST_0_064      (WDTPW+WDTCNTCL+WDTIS1+WDTIS0)                    /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ARST_1000       (WDTPW+WDTCNTCL+WDTSSEL)                          /* 1000ms  " */
#define WDT_ARST_250        (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)                   /* 250ms   " */
#define WDT_ARST_16         (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)                   /* 16ms    " */
#define WDT_ARST_1_9        (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)            /* 1.9ms   " */

個々のビットの説明も、最も一般的なものとの既製の組み合わせもありません。

ボーナス暴言の質問

常に強力でほとんどアイドル状態のパーソナル コンピュータでコンパイルされるため、すべてのコンパイラ/IDE がベア メタルの使いやすさを模倣することを選択するのはなぜですか? それを行うためのより良いフォーマットがたくさんありませんか?パフォーマンスに夢中にならないのであれば、アドレス 0x0120 に値 0x5A80 を設定するとウォッチドッグ タイマーが停止することを平凡なコーディングで知っておく必要がありますか? ヘッダー ファイル/IDE は私にそれを作ることはできwatch_dog_timer( STOP );ませんか?

4

2 に答える 2

5

この情報は、メーカーのデータシートに記載されています。すべてのチップにデータ シートが用意されているわけではありません1

例として、ATmega48 を見てみましょう。これは、基本的な周辺機器の優れたセットを備えたシンプルなチップです。

  1. メーカーのウェブサイトにアクセスして、製品ページを見つけます。ウェブサイトで検索するか、Google を使用することもできますが、製造元のウェブページのリンクをクリックするだけで最も成功しました。ページの「ドキュメント」セクションに移動します。

    ATmega48 のドキュメントはhttp://www.atmel.com/devices/ATMEGA48.aspx?tab=documentsで入手できます。

  2. 適切な PDF ファイルをダウンロードします。これはおそらく「データシート」または「ユーザーマニュアル」と呼ばれます。「アプリケーション ノート」や「概要」ではありません。ファイルの長さが約 1 MB 未満または 100 ページ未満の場合は、適切なファイルではない可能性があります。

    ATmega48 の場合、ドキュメントは「ATmega48/88/168 完全版」と呼ばれます。

  3. 「マジックアドレス」はレジスタと呼ばれます。 これらは IO レジスタまたはペリフェラル レジスタであり、ユーザー空間プログラムを記述するときに使用する種類のレジスタではありません。レジスタは一般に一意であり、読み取り専用、書き込み専用、または読み書き可能です。

    ATmega48 については、セクション 31「レジスタの概要」ですべてのレジスタのリストを見ることができます。各レジスタの使用方法の説明は、関連するペリフェラルを説明するセクションの下にあります。たとえば、GPIO レジスタはセクション 14「I/O ポート」で説明されており、サンプル コードはアセンブリと C の両方で示されています。

おまけ:コードを書きたい場合watch_dog_timer( STOP );は、必要なマクロや関数を自分で定義することができます (組み込みシステムで時々発生する、コンパイラが良くない場合を除き、できれば関数です2 )。

また、ベアメタル プログラミングは「ユーザー フレンドリー」であると皮肉を込めて言っていただければ幸いです。

脚注:

1 : たとえば、Raspberry Pi のチップのデータシートは、大口注文と NDA なしでは入手できません。

2 : 私の経験では、既存のチップに適したコンパイラを探すよりも、コンパイラのサポートが優れているという理由でチップを選択することがよくあります。少なくとも、あなたが愛好家なら。GCC は Atmel と ARM をターゲットにしています。これは、私が使用したいくつかのくだらない IDE と比較して、明らかに豪華です。

于 2012-06-01T04:53:30.427 に答える
4

組み込みプログラマーであることは、すべてのプログラミングではありません。その大部分は、ドキュメント、回路図、およびハッキングを読むことです (ドキュメントと回路図は常に間違っているか古いものであり、それらを 100% 信頼してはなりません)。

完全混合袋です。(比較的) 優れたドキュメントを作成するベンダーもあれば、ひどいドキュメントを作成するベンダーもあり、ドキュメントにアクセスするために最初の子をあきらめなければならないことも含めて (完全ではありませんが、ほぼ)、すべてのベンダーが作成します。一部の企業は、秘密が守られていると感じており、NDA に署名する必要があります。だからと言って、適切なドキュメントが提供されるわけではありません。それは、同じ複雑な袋であり、入手するのが難しく、一度手に入れるとより多くの責任を負うだけです。営業担当者に情報 (名前、電話番号など) を渡さなければならない場合があります。最悪の場合、あなたが仕事を辞めるまで、または営業担当者が仕事を辞めるまで、毎週または毎月電話がかかってきます。あなたが尋ねたものを購入するか、新しいエキサイティングな製品について聞きたい場合. 私は、ドキュメントを取得するためにそれを必要とする会社 (彼らが製造するすべての製品) をブラックリストに載せる傾向があります。

各企業のドキュメント ソリューションは異なります。msp430について言及しましたが、部品ファミリのドキュメントの1つのセットに移動する必要があり、レジスタの名前を取得しますが、アドレスは取得しません。次に、特定の部品のデータシートに移動して、名前に対応するアドレスを取得する必要があります. Atmel が人気を博している大きな理由は、ドキュメント全体が優れていること、情報がそこにあること、時には最高のドキュメントではないこともあるが、大量のドキュメント、大量のアプリケーション ノート、他の企業が簡単に提供しない情報があるためだと固く信じています。競合他社よりも何光年も先を行っているわけではなく、数パーセントしか優れていないこともありますが、時間の経過とともに、彼らがちょうど先を行っていると感じるだけです。他の人の。ARM、同じ答え、一般的に非常に優れたドキュメント (ただし、チップではなくコア、そのため、悪いチップ ベンダーの製品に優れた ARM コア ドキュメントが含まれている可能性があります)。物事を見つけるためにサンプルプログラムを掘り下げなければならない他の会社、ドキュメントがサンプルソフトウェアと一致しないなど。

あなたは基本的に私たちと同じことをしています。コンパイラ/アセンブラ ソース (実際には、アセンブラ データ ファイルで見つけるのが困難だった atmel に関する情報を見つけた後、最終的に atmel doc で見つけた情報)、回路図、サンプル プログラム、ヘッダー ファイルなど、利用可能なものを掘り下げます。最終的には、一部のドキュメントは優れたライティング スキルを備えた非技術者によって書かれていることに気付くでしょうが、ドキュメントに含まれる技術用語についての手がかりはありません。ドキュメンテーションは、トーテム ポールの一番下にいる人、生産的なスキルを持っていないことが判明した新入社員などに落ちることがあります。常にではありませんが、時々あります。そして、ドキュメントはそれを反映しています。サンプル プログラムは、多くのチップの共通のロジック ブロック用に設計された、一部の機能が追加または削除された可能性のあるフリーサイズである場合があり、コードが文書化されていないビットや予約済みのビット (それらビットはおそらく、以前のバージョンのロジックまたは新しいバージョンのロジックで何かを行います。会社のすべての製品を掘り下げると、それらのビットが見つかるかもしれませんが、使用しているチップにとって重要ではありません)。私はコードを変更するのが好きで、何が起こるかを確認するためだけに、文書化されていない部分には触れません。私が本当に気に入った (嫌いだった) のは、ファームウェア ファイルへのパスを含める必要がある、カードを開始するための API 呼び出しです。ドライバ コードを調べてみると、ファームウェア ファイルは 1 つのフレーバーのカード用でした。

あなたが知ることのないいくつかのビットといくつかのレジスタ。その会社に就職したとしても、適切な部門に適切な期間勤務するまで、アクセスを許可されない場合があります。知りたいことがすべて手に入るとは思わないでください。一部のビットは魔法であり、一部のビットパターンまたはデータは魔法であり、時には流れに沿って、彼らが言うようにそれを行う必要があります.visual6502プロジェクトをチェックしてください.何人かの人々は、キャリア全体を待って退職しましたそのプロセッサのいくつかの厄介なことがなぜ、どのように機能したかを調べるために...

最善の方法は、おそらくすでに行っていることです。愛好家向けのボード、arduino、msp430 ランチパッド、stm32 ディスカバリー ボード、mbed、raspberry pi などを購入します。回路図を入手するか、Web ページやドキュメントを参照して、デバイスの部品番号、特にプロセッサ、次にそのページに移動します(通常、これらは製品を販売しているチップベンダーであり、常に(arduinoであるとは限りません)。その部分を調べて、その部分のドキュメント、時には多くのドキュメント、ファミリと特定のチップなどを見つけてください。オープンソース プロジェクトがある場合は、それらのソースを読んでください. 運が良ければ、それを続けていれば、キャリアの中で、デザイン、ドキュメント、サンプルなどに影響を与えたり推進したりできる場所に到達するかもしれません. 、Atmel で働いていて、マイクロコントローラーの組み込みソフトウェアの第一人者だったとしても、チップをテストまたは販売するために構築する必要があるボード上の他のコンポーネントについては、他社のドキュメントを読む必要があります。それは終わりではありません、それは仕事の一部です。

多くのプログラマーは物事を言葉で、または少なくとも 16 進数で見たくないので、多くのサンプル プログラムは定義と関数を使用して未加工のアドレスとビットを隠します。個人的には、ビットが正しいことを確認するために、マクロやヘッダー ファイルの層をくまなく調べなければならないのが嫌いなので、16 進数またはビットを好みます。画面の片側にデータシート (16 進数、ビット番号) があり、もう一方の側にテキスト エディターのプログラミングがあります。16 進数のアドレスがドキュメントと一致するのは、非常にあいまいな感じです。埋め込みは精度と信頼性に関するものです。なんらかの方法で、コードがしっかりしていることを確認する必要があります。マクロ/定義/関数のレイヤーが多すぎる人を盲目的に信頼し、すべてのビットをチェックせずに失敗するか、少なくともさらに失敗することになります。多くの場合、チェックを行い、それほど失敗しない部門の他の誰かよりも。もちろん、プログラムを永遠に書くことはできないので、コーディングスタイルの好みを組み合わせながら信頼性を提供する方法を見つける必要があります。エンベデッドを魅力的なものにしている理由の 1 つは、しばしば得られる自由であり、オペレーティング システムの規則や、アプリケーション層へのアクセスの制限などがないことです。やりたいことをやりたいように行うことができます...

于 2012-06-01T05:53:47.677 に答える