問題タブ [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.
embedded - SDCC によるコードバンキング
すべてのコードを収めるために、8051 マイクロコントローラーでコード バンキングを使用する必要があります。SDCC はサポートしていると言っていますが、リンクの段階で問題があります。
main.c、func1.c、bank.asm の 3 つのファイルを含むテスト プロジェクトがあります。メイン関数は func1() を呼び出してから、while ループに入る必要があります。しかし、func1() は別のコード バンクにあります。
すべてをコンパイルしてリンクするためのビルド バッチ ファイルがあります。
次のリンカ エラーが発生します。
これをリンクするにはどうすればよいですか?
embedded - コンパイルされたプログラムをC51マイクロコントローラにアップロードする
コンパイルされたプログラムをマイクロコントローラーにアップロードしようとしています。私の問題はプログラミングやアップロードではありません。私の問題はuuを何をアップロードするかです。
プログラムはCであり、SDCCでコンパイルされました。mcuはATMELのAT89S8252です。
データシートに記載されているシリアルプログラミング用のMCUプロトコルに従って、単純なパラレルポートプログラマーを構築しました。
これまでのところ良いです..しかし..私はmcuに何をアップロードする必要がありますか?
コンパイル時に、SDCCは多くのテキストレポートを生成します。次に.ihx ..このファイルを直接アップロードするのではなく、何らかの方法で後処理して実際の生のバイトをアップロードする必要があると思いますか?
どんな助けでも大歓迎です=)
c - SDCC (リトル エンディアン) コンパイラを使用する場合、この演算の何が問題になっていますか?
私は C プログラミングが初めてで、MCU のファームウェア アプリケーションに取り組んでいます。この方法は、KEIL コンパイラ (ビッグ エンディアン) を使用していたときは正常に機能していましたが、SDCC コンパイラ (リトル エンディアン) に切り替えたときに正しく機能しません。誰かが私が間違っていることを説明できますか???
ターゲット デバイスは、8051 アーキテクチャに基づく Silicon Labs C8051F320 です。
追加: まず、MotorSteps と MotorSpeed をunsigned int に変更しました。 私のデバッガーでは、何らかの理由で、この関数 MotorSteps = 00 の最初の入り口で、if ステートメント行にブレークポイントを設定すると、t も 0 に割り当てられるはずですが、デバッガーは t=0.031497 (10 進数) を示します。 )。デバッガーを 16 進数で表示するように切り替えると、t = 0x3d010300 になります。t が割り当てられないようです...
c - すべてのCコンパイラは、関数が構造体を返すことを許可していますか?
私はCでプログラムに取り組んでおり、8051アーキテクチャデバイス用のSDCCコンパイラを使用しています。フラッシュメモリから8文字を読み取り、文字配列を何らかの形式で返すGetNameという関数を作成しようとしています。Cで配列を返すことはできないことを知っているので、次のような構造体を使用してそれを実行しようとしています。
この関数への参照はまだありませんが、何らかの理由で、「関数は集計を返すことができません」というコンパイラエラーが発生します。これは、私のコンパイラが構造体を返す関数をサポートしていないことを意味しますか?それとも私は何か間違ったことをしているだけですか?
linker - Cプログラムで構造体を使用するとリンクエラーが発生するのはなぜですか
私は8051アーキテクチャチップとSDCCコンパイラ用のCプログラムを書いています。
FilterStructureという構造があります。
私のコードは次のようになります...
何らかの理由で、「?ASlink-Error-エリアDSEGの内部RAMで29連続バイトを取得できませんでした」というリンクエラーが発生します。
FilterStructure testStruct;
エラーがなくなるという行をコメントアウトすると。
このエラーはどういう意味ですか?使い終わったら構造を破棄する必要がありますか?
c - 16ビットアドレスから上位/下位バイトを分割する方法は?
8051 プロセッサでソフトウェアを開発しています。よくある作業は、16 ビット アドレスの上位バイトと下位バイトを分割することです。それを達成する方法がいくつあるか見てみたい。私がこれまでに思いついた方法は次のとおりです。
ビット演算
SDCC は次のアセンブリ コードを提供します。
Keil C51 は私に与えます: 多くの役に立たないコードIMHOがあります。ポインタートリック
SDCCは私に与えます: Keil C51 は私に与えます: これは SDCC バージョンと同じです。アンドレイの数学的アプローチ
p>SDCC は次のことを示します。
sdcc が r7 レジスタを使用する理由がわかりません... Keil C51 は私に与えます: KeilがR2レジスタも使用しない理由がわかりません...セマジの組合アプローチ
p>SDCCは私に与えます
Keil C51 は私に与えます: これは、ポインターのトリックに非常に適しています。ただし、このアプローチでは、共用体を格納するためにさらに 2 バイトのメモリが必要になります。他に明るいアイデアを持っている人はいますか?;)
そして、どちらの方法がより効率的か誰にも教えてもらえますか?
興味のある方のために、テストケースは次のとおりです。
}
c - Cコンパイラが最適化するものをどのように制御しますか?
Silicon Labs IDE と SDCC コンパイラを使用して、C 言語で組み込みデバイスのファームウェアを作成しています。デバイスのアーキテクチャは 8051 ファミリに基づいています。問題の関数を以下に示します。この関数は、ステッピング モーターを駆動するように MCU のポートを設定するために使用されます。割り込みハンドラによって呼び出されます。大きな switch ステートメントは、ポートを次のモーター ステップの適切な値に設定するだけです。関数の下部では、ホール効果センサーからの入力と、モーターが失速したかどうかを検出するために移動したステップ数を確認します。問題は、何らかの理由で、このように見える 2 番目の IF ステートメントがif (StallDetector > (GapSize + 20))
{
HandleStallEvent();
}
常に最適化されているように見えることです。ブレークポイントを設定しようとするとHandleStallEvent()
IDE を呼び出すと、「この行番号にアドレス相関がありません」というメッセージが表示されます。私はアセンブリが何をしているのかを理解するのに十分ではありませんが、以下の asm 出力からのスニペットを貼り付けました。どんな助けでも大歓迎です。
...そして、この関数の下部の asm 出力...
asm の外観から、コンパイラがこの 2 番目の if ステートメントを最適化していないように見えますが、その場合、なぜ IDE で許可されないので、そこにブレークポイントを設定しますか? 多分それはただのIDEです!
makefile - リンクステップ中にMakefileでSDCCを使用する際の問題
スモールデバイスCコンパイラ(SDCC)は、リンクステップ中に未定義の参照エラーが発生した場合でも、ihx(Intel Hex)ファイルを生成します。この動作により、MakefileでSDCCを使用するときに問題が発生します。これは、ihxファイルをmakeターゲットに設定した場合、makeには、以前のリンクの試みが失敗したことを知る良い方法がないためです。
リンク中に未定義の参照がある場合にihx出力を抑制するようにSDCCに指示する方法はありますか?そうでない場合、最善の回避策は何ですか?(私はすでに1つを考えました)。
また、誰かが知っているなら、なぜSDCCがこのように設計されたのか興味があります。
問題の例を次に示します。
未定義の関数を呼び出すtest.cというファイルがあります。
test.cからtest.ihxを構築するための単純なMakefileがあります。
test.cを初めてコンパイルしようとすると、失敗します。
ihxの依存関係ではないもの(Makefileなど)を変更して問題を修正し、再度コンパイルしてみてください。
ただし、SDCCはすでにihxファイルを作成しているため、makeはコンパイルを試みません。
ide - SDCC で Silicon Laboratories IDE を使用するにはどうすればよいですか?
Silicon Laboratories の 8051 コアを搭載したマイクロコントローラを使用することを考えています。アセンブリ言語ではなくC言語が使えたらいいなと思い、SDCCをインストールしました。
「Silicon Laboratories IDE」をインストールして、実行可能バイナリをオンチップ フラッシュ プログラム メモリにダウンロードしました。また、「任意の」8051 コンパイラを使用するように ([プロジェクト] > [ツール チェーンの統合] メニューで) セットアップすることもできます。
SDCC を使用するようにセットアップしようとしましたが、[ファイルのアセンブル/コンパイル] ボタンを押すたびに、「コンパイラ プロセスが正常に完了しませんでした」と表示されます。
SiLabs C8051F310 チップに書き込んだ新しい C コードを取得するにはどうすればよいですか? ステップバイステップの HOWTO が掲載されている Web サイトはありますか? (実行可能なバイナリをチップにダウンロードする最後のステップに「Silicon Laboratories IDE」のみを使用して、SDCC を呼び出す MAKEFILE を使用する方が簡単でしょうか?)
assembly - Intel8051でコンパイルするSDCCコードとASMコードの組み合わせの問題
さまざまな操作(タイミング、出力波形の生成、入力周波数の測定)のための多くのアセンブリを含むCコードをコンパイルしようとしています。
いくつかのASM操作で同じエラーが発生し続けます。
「REL領域の.orgまたはディレクティブ/ニーモニックエラー」
以下のコードでは、3つのエラーが発生します(どの行で発生するか、正確にはどのようなエラーが発生するかについてコメントしました。ありがとうございます。