問題タブ [sdcc]
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.
assembly - C51 C コンパイラ インライン アセンブリから SDCC インライン アセンブリへ
私はアセンブリにはあまり興味がありませんが、プロジェクトでは、C51 C コンパイラのアセンブリ コードの数行を SDCC に変更する必要があります。
これはC51のコードです
SDCCでコンパイルされたもの
コンパイラのエラー/警告として。
$
-symbol がアセンブラによって命令の実際のアドレスに置き換えられることは知っていますが、SDCC に相当するものは何ですか?- などの警告を解決するにはどうすればよい
T0Run
ですか?
assembly - SDCC/C51: SDCC シンボルの再定義
C51でコンパイルしていたプログラムをSDCCでコンパイルしたい..
これは75A800
(16 進数)に変換されます。
SDCCでこれをコンパイルすると、これ
SDCC は、次のような TCON レジスタの私の定義を無視しているように見えます。
だからここに私の質問があります:
別のヘッダー ファイルで定義したアドレスを使用するように SDCC に指示するにはどうすればよいですか?
もちろん、全体は次のようになります。
eclipse - Eclipse: コード パーサーの編集
Eclipse 用のプラグイン ( SDCCの Eclipse プラグイン) を使用しています。
これは(これまでのところ)うまくいきますが、問題はインラインアセンブリです..
パーサーがこのコードを構文エラーとしてマークし、さらにヘッダーファイルで定義されているシンボルをマークするのはかなり面倒です。
したがって、プラグインを少し拡張して、パーサーがインライン アセンブリ部分を無視するようにしたいと考えています。これは、エラーが見つかった場合に SDCC コンパイラが文句を言うからです。
CDT 7.0 からエラー解析があることを確認しましたが、これが適切な場所であるかどうかはわかりません。
誰でも助けることができますか?
c - タイマー割り込み割り込み 8051 中にタイマーを再構成する
SDCC コンパイラを使用しています。
私が達成しようとしているのは、独自の割り込みハンドラー中に、モード 2 の自動リロードで Timer0 を再構成することです。Cコードは次のとおりです。
質問は次のとおりです。
モード 2 の自動リロード モードで、独自の割り込みハンドラの実行中に、Timer0 の TL0 と TH0 を再構成することはできますか?
再構成中に Timer0 を停止する必要がありますか? 中断中に実行されていないため、停止する必要はありませんか?
割り込みルーチンが開始する前に、TH0 と TL0 の値がスタックにプッシュされますか? これらの値がスタックにプッシュされ、ルーチン ハンドラーの実行中にこれらの値を再構成する場合、これらの値は、割り込みからの終了時にスタックからポップされた値によってオーバーライドされますか?
c - 変数が関数として認識されるdoxygen
現在のプロジェクトでは、doxygen を使用してドキュメントを生成しようとしています。ただし、変数に問題があります。どういうわけか、doxygen は変数を関数として認識します。
コード:
コードについての注意: コードは、8051 マイクロコントローラー用のSDCC コンパイラー用に書かれています。この__xdata __at ()
ディレクティブは特別な命令であるため、コンパイラはデータを別のメモリ セグメント (XDATA と呼ばれる) の所定の場所 (アドレス 0x0F00) に配置する必要があることを認識します。
私の問題は、doxygen が を__at()
変数ではなく関数として認識し、関数を上書きするmain()
ことです。
doxygen にステートメントを無視させる方法はいくつかありますが、__xdata __at () char Programmed
これには変数が無視されて文書化されないという欠点があります。
__xdata __at () char Programmed
doxygen に を関数ではなく変数として認識させる方法を知っている人はいますか?
floating-point - 整数演算で int を int にスケーリングしたい
私は SDCC 2.8.0 を使用しているため、メモリとコード サイズが非常に限られています。0 から 127 の範囲の入力値があるとします。それを 20 から 100 にスケーリングしたいとします。通常は次のようにします。
呼び出すscale(64, 20, 100);
と、20 と 100 のちょうど中間にあたる 60 が得られます。
浮動小数点数を使用せずにこれを行うにはどうすればよいですか? ビットシフトマジックはありますか?
c - 構造体を別の構造体のメンバーにコピーする
私は SDCC 3.4 を使用しており、これは楽器の MIDI プロジェクトであり、これに数日間苦労しています... 説明するのが難しいとさえ思っているので、ここで私はより良いものを作ろうとしています例。基本的に、ボタンの押下をスキャンし、MIDI 情報を送信し、それに応じて LED を点灯させます。私が必要としているのは、各ボタンに関連するすべてのデータを保持する一種のデータベースです。その一部は一定である必要があり (ボタンと LED の ID)、一部はユーザーが変更できるため可変にすることができます。初期化フェーズでは、定数部分を構造体に割り当て、変数部分を変更しないでおく必要があります。ユーザーがボタンの機能を変更するとき、変数部分を上書きし、定数部分を変更しないでおく必要があります。
今、私がする必要があるのは、の内容全体を to にコピーすることcBtnDefinitions[]
ですButton[]->c
。私が行った場合
データは、メンバー c だけでなく、c と v にも順次コピーされます。
メイン loop() の残りのコードは次のようになります。
もちろん、さまざまな種類のボタンを使用できるので、sButton 構造を他の目的に使用して、それらをすべて同じ関数で処理することができます。
c - 8051 の sdcc コンパイラの奇妙な動作
私は以前、8051 マイクロコントローラのプログラミングに Keil を使用していました。何らかの理由で SDCC でコーディングする必要がありますが、今日、コンパイラで非常に奇妙な動作に直面しています。コード ブロック IDE 12.11 および SDCC 3.4 バージョンを使用しています。
この単純なコードをコンパイルしています。
これがserial_send関数の定義です。
問題は、コードによれば、端末で「a」文字を2回出力するはずなのに、1回しか出力していないことです。問題は、グローバルな検証可能な digits[] 配列にあります。
この関数は、定数値でのみ適切に機能しますが、引数に基づいた変数では機能しません。
この問題は、私が理解できないC言語のトリックに関するものだと思うため、ここにこの質問を投稿しています。
コンパイラと IDE の両方を再インストールしようとしましたが、問題は同じままです。なぜこれが起こっているのか説明してください。私はさまざまなコードを試しましたが、すべてのコードで定数とローカル変数は正常に動作しますが、グローバル変数は奇妙な動作を提供します。