問題タブ [8051]

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.

0 投票する
7 に答える
2707 参照

optimization - 8051 アセンブリ言語でメモリを最適化するには、どのような手法を使用できますか?

新しいコード用のスペースを確保するために、コードを最適化する必要があります。すべての変更のためのスペースがありません。コードバンク切り替え(80c31 with 64k)が使えません。

0 投票する
9 に答える
767 参照

c - 副作用のあるコードをマークするにはどうすればよいですか?

私は、すべてのバイトがカウントされる 8051 のプロジェクトに取り組んでいます。そのため、通常は使用しないいくつかのグローバル変数を使用しています。ポインターを関数に渡す通常の方法では、ここでオーバーヘッドが大きくなりすぎます。

通常の戻り値に加えて、関数の結果を通知するために単一ビット変数 ( Cのコンパイラ固有の拡張機能) を使用する関数がいくつかあります。

テクニックが悪かったので、コードをより明確にする方法はありますか?

どの関数呼び出しにこれらのフラグを設定する副作用があるかをどのように示すべきですか? コメントは十分ですか?API を示すために関数に名前を付ける必要がありますか (準ハンガリー式)? そのような呼び出しをマークするためにマクロを使用する必要があります:

他のアイデアはありますか?

0 投票する
11 に答える
2018 参照

assembly - アセンブリ言語のスパゲッティ コードの解明

私は 8051 アセンブリ言語で書かれた 10K 行のプログラムを継承しましたが、これにはいくつかの変更が必要です。残念ながら、これはスパゲッティ コードの最高の伝統で書かれています。単一のファイルとして記述されたプログラムは、CALL ステートメントと LJMP ステートメントの迷路 (合計約 1200) であり、サブルーチンがサブルーチンとして識別できる場合でも、複数の入口点および/または出口点を持つサブルーチンがあります。すべての変数はグローバルです。コメントがあります。いくつかは正しいです。既存のテストはなく、リファクタリングの予算もありません。

アプリケーションの背景: このコードは、現在国際的に展開されている自動販売アプリケーションの通信ハブを制御します。2 つのシリアル ストリームを (別の通信プロセッサを使用して) 同時に処理し、それぞれ異なるベンダーの最大 4 つの異なる物理デバイスと通信できます。最近、デバイスの 1 つの製造元が変更を加えました (「ええ、変更を加えましたが、ソフトウェアはまったく同じです!」)。これにより、一部のシステム構成が機能しなくなり、それを元に戻すことには関心がありません (それが何であれ)。それらは変更されませんでした)。

このプログラムはもともと別の会社によって作成され、私のクライアントに転送され、9 年前に別のコンサルタントによって変更されました。元の会社もコンサルタントもリソースとして利用できません。

シリアル バスの 1 つのトラフィックの分析に基づいて、ハックを思いつきました。これは機能しているように見えますが、見苦しく、根本的な原因に対処していません。プログラムをよりよく理解していれば、実際の問題に対処できると思います。月末の出荷日をサポートするために、コードが凍結されるまであと約 1 週間あります。

元の質問: 壊れることなく変更できるように、プログラムを十分に理解する必要があります。この種の混乱を処理するためのテクニックを開発した人はいますか?

ここに素晴らしい提案がいくつかありますが、時間に制限があります。しかし、将来、より複雑な行動方針を追求する別の機会があるかもしれません.

0 投票する
4 に答える
9857 参照

c - 8051 から 1 回だけ文字列をシリアルに送信するにはどうすればよいですか?

8051 マイクロコントローラーをコンピューターとワイヤレスで通信させています。マイクロコントローラーはシリアル ポート (DB9) に文字列を送信し、コンピューターはこの文字列を受信して​​操作します。

私の問題は、8051 に文字列を 1 回だけ送信させる方法がわからないことです。PC 側で文字列を操作する必要があるため、一度だけ受信する必要があります。現在、C コードでは文字列を 1 回送信していますが、コンピューターでは同じ文字列を継続的に受信しています。これは、SBUF にあるものが継続的に送信されるためだと思います。文字列を 1 回だけ送信する方法はありますか? SBUF を空にする方法はありますか?

DB9 の RTS (Request to Send) ピン (7 番目のピン) を使用しようとしました。そのピンの電圧を無効にすると、シリアル ポートへのデータの流れが停止することをどこかで読んだためです。そこで私がしたことは、文字列を送信するようにマイクロコントローラーをプログラムし、DB9 RTS ピンに接続された出力ピンに論理レベル 0 を送信することでした。しかし、それはうまくいきませんでした。

誰か提案はありますか?本当に感謝しています。

編集

私が PC で使用しているソフトウェアは、Xbee モジュール用の X-CTU です。これは私のマイクロコントローラのコードです:

誰かが実際に文字列を一度だけ送信していることを確認してもらえますか?

編集

Steve、brookesmoses、Neil は、問題を引き起こしているのは私の主な機能の後に起こっていることだと彼らが言ったとき、頭に釘を打ったようです。Steve が提示した提案されたコード (より具体的には for(;;); と main の外で serTX を定義する) を試してみたところ、完全に機能しました。コントローラーはおそらく再起動されるため、同じコードが繰り返されます。

助けてくれてどうもありがとう!:)

0 投票する
2 に答える
2812 参照

embedded - 8051 のワイヤレス シリアル ポートで連続的に送受信するにはどうすればよいですか?

マイクロコントローラーをデスクトップ上のプログラムと通信させようとしています。両端で Xbee 無線とのシリアル ポート接続を使用しています。

マイクロコントローラーからデスクトップに何かを送信し、デスクトップ上のプログラムがマイクロコントローラーに何かを送信すると、通信は正常に機能します。

ただし、デスクトップ プログラムが特定の応答を送信するまで、コントローラーからデスクトップ プログラムに継続的に情報を送信する必要がある場合、それは機能しません。

これが私が話しているコードです:

BuildString() 関数は、いくつかのセンサー入力に基づいて単純に文字列を構築します。通常、送受信関数は問題なく動作しますが、上記の Configure() 関数のように、連続して送受信する必要がある場合は機能しません。

助言がありますか?本当に感謝しています。

0 投票する
2 に答える
798 参照

assembly - マイクロコントローラー 8051: JB および CJNE 命令への入力のアドレスを取得する方法は?

VHDL で 8051 命令のセット全体をゼロから実装しています。ほとんどのことはうまくいきましたが、次の 2 つの指示につまずきました。

どんな助けやヒントも大歓迎です。前もって感謝します!

0 投票する
2 に答える
3401 参照

emulation - 8051エミュレータの作り方

学習目的で、8051 マイクロコントローラー エミュレーターの構築を開始する予定です。C/C++/C# でのプログラミングに慣れています。これはクラスのプロジェクトなどではなく、私の側からの学習イニシアチブです。

私はこれについて議論する非常に多くの質問を見つけました. ただし、実際にコードを書き始める前に、どの領域に焦点を当てる必要があるかを知ることができるように、もう少し細かいレベルでそれを壊したかったのです。

私の最初の要件は次のとおりです。

  1. ユーザーがアセンブリ コードを記述できるテキスト エディター (編集ボックス コントロールを使用可能)

  2. 構文が正しいかどうかを検証する

  3. 実行時にレジスタ値を表示する小さなウィンドウがあります。

  4. ユーザーがプログラムを開始すると、命令はレジスタウィンドウを段階的に更新する必要があります。

GUI 要素よりも、マイクロコントローラーをエミュレートする方法を知りたいと思っています。

私が理解している方法で、さらに分解できます。

  1. 命令のルックアップ テーブル、または使用可能な命令を格納して構文を検証する他の方法が必要です。これを実装する方法があれば、教えてください。

  2. 8051 の各命令をエミュレートするにはどうすればよいですか?

  3. レジスタの場合、タイプに基づいて un/signed 整数を使用し、テーブルを更新できます。

  4. マイクロコントローラは RAM メモリが限られているため、コード長またはメモリ内で実行されているコードをチェックして、バッファ オーバーフローやその他の問題を回避するにはどうすればよいですか。

エミュレーターをゼロから構築する方法を詳しく説明しているオープンソース プロジェクトがいくつかある場合は、感謝します。

0 投票する
5 に答える
23763 参照

c - xdataはいつ使用しますか?

私は組み込みシステムプログラミングに不慣れです。私は8051チップセットを使用するデバイスに取り組んでいます。サンプルプログラムで、変数を定義するときに、キーワードxdataを使用することがあることに気づきました。このような...

static unsigned char xdata PatternSize;

xdataキーワードが省略されている場合もあります。

私の理解では、xdataキーワードは、その変数が外部、フラッシュ、メモリに格納されることをコンパイラに指示します。

どのような場合に変数をxdataで外部に保存する必要がありますか?これらの変数へのアクセスには時間がかかりますよね?xdataを使用して保存された値は、デバイスのハードリセット後に残りませんか?

また、staticキーワードは、変数が定義されている関数を呼び出すたびに変数が存続することを意味することを理解しています。staticとxdataを一緒に使用する必要がありますか?

0 投票する
2 に答える
700 参照

embedded - コンパイルされたプログラムをC51マイクロコントローラにアップロードする

コンパイルされたプログラムをマイクロコントローラーにアップロードしようとしています。私の問題はプログラミングやアップロードではありません。私の問題はuuを何をアップロードするかです。

プログラムはCであり、SDCCでコンパイルされました。mcuはATMELのAT89S8252です。

データシートに記載されているシリアルプログラミング用のMCUプロトコルに従って、単純なパラレルポートプログラマーを構築しました。

これまでのところ良いです..しかし..私はmcuに何をアップロードする必要がありますか?

コンパイル時に、SDCCは多くのテキストレポートを生成します。次に.ihx ..このファイルを直接アップロードするのではなく、何らかの方法で後処理して実際の生のバイトをアップロードする必要があると思いますか?

どんな助けでも大歓迎です=)