kを持つ

I

ITP

Guest
こんにちはすべて、
私はkを持つ*メール* iの* l.奇妙な問題に直面していますĈその中の"if"文について
(者LJMP)命令を無条件分岐を生成します。しかし
、 私はダミーの配置
文[中(!STOP_KEY_PORT)]が動作します。

以下に私*メール* iの*リットル私のC * 51プログラムのセグメントとその対応するカ示されている
出力します。

次のように2つのビット変数を使用するための宣言ですsbit STOP_KEY_PORT = P1の^ 5;
sbit velocity_in = P2 ^ 3;------------------------スタート-----------------------
/ /元のCコード

P1の= 0x0f0;
velocity_in = 1;

(!velocity_in)中

場合(!STOP_KEY_PORT)後藤中止;

(velocity_in)中

場合(!STOP_KEY_PORT)後藤中止;

)カ*メール* iの* lの出力:758:P1の= 0x0f0;
Ĉ:0x0CA8 7590F0 MOV P1の(場合0x90)、#adc_data(0xF0が)
759:velocity_in = 1;
760:
Ĉ:0x0CAB D2B4にsetb velocity_in(0xB0.4)
761:(!velocity_in)中
Ĉ:0x0CAD 20B403バトンvelocity_in(0xB0.4)は、C:0CB3
762:(
763:もし(!STOP_KEY_PORT)後藤中止;
Ĉ:0x0CB0 020D80者LJMP Ĉ:0D80
764:)
765:(velocity_in)中
Ĉ:0x0CB3 30B403からJNB velocity_in(0xB0.4)は、C:0CB9
766:(
767:もし(!STOP_KEY_PORT)後藤中止;
Ĉ:0x0CB6 020D80者LJMP Ĉ:0D80
768:)
769:)
----------------------------終了--------------------- ----------
---------------------------スタート---------------------- --------
/ / Cコードステートメントの導入後、[中(!STOP_KEY_PORT)](
P1の= 0x0f0;
velocity_in = 1;
中(!STOP_KEY_PORT); / /" -新ラインを導入
(!velocity_in)中

場合(!STOP_KEY_PORT)後藤中止;

(velocity_in)中

場合(!STOP_KEY_PORT)後藤中止;

)カ*メール* iの* lの出力:

758:P1の= 0x0f0;
Ĉ:0x0B0B 7590F0 MOV P1の(場合0x90)、#(0xF0が)adc_data
759:velocity_in = 1;
Ĉ:0x0B0E D2B4にsetb velocity_in(0xB0.4)
760:中(!STOP_KEY_PORT);
Ĉ:0x0B10 3095FDからJNB STOP_KEY_PORT(0x90.5)は、C:0B10
761:(!velocity_in)中
Ĉ:0x0B13 20B406バトンvelocity_in(0xB0.4)は、C:0B1C
762:(
763:もし(!STOP_KEY_PORT)後藤中止;
Ĉ:0x0B16 2095FAバトンSTOP_KEY_PORT(0x90.5)は、C:0B13
Ĉ:0x0B19 020BF2者LJMP Ĉ:0BF2
764:)
765:(velocity_in)中
Ĉ:0x0B1C 30B406からJNB velocity_in(0xB0.4)は、C:0B25
766:(
767:もし(!STOP_KEY_PORT)後藤中止;
Ĉ:0x0B1F 2095FAバトンSTOP_KEY_PORT(0x90.5)は、C:0B1C
Ĉ:0x0B22 020BF2者LJMP Ĉ:0BF2
768:)
769:)
---------------------------終了---------------------- ------親切に私は
、 この問題を理解するのに役立ちます。
お時間をいただきありがとうございます。
ITPの。
ITPのが07 2003 10時17分9月最終編集日:1時間編集合計

 
配置の最適化レベル()を最適化してもう一度試しゼロにする。これは1 Keil社の奇妙なバグのことができる。

トム

 
やあ、

5月に
、 切り取りと貼¥り付けのエラーがされる場合を宣言する例では

sbit velocity_port = P2 ^ 3;

使用

velocity_in

場合は
、 エラーis't場合velocity_in関数に入力せずにint型されることが宣言されて(参照してください。lstと。銀河M51ファイル)。

場合は
、 最適化の高いレベルを使用するため
、 テストでは
、 コンパイラのテスト""== 0 int用のサブルーチンと最適化を2回repetedです。

 
やあ、

にダウンロード*正日コンパイラは非常にいくつかのケースでは良いのですが
、 他ではない。

たとえば場合は
、 最適な反復ループを使用するようにしたいかwhileループのループの代わりとループローカルレジスタ求め
、 それを求め
、 それを宣言します。最初のケースでコンパイラを使用しDJNZ命令およびレジスタ変数では、2番目のケースを使用しCJNEループカウンタのデータをメモリ内に求め
、 一時。

これはビットCISC CPUの限られた資源のためにも最適化されたコンパイラを書くのは簡単ではありません。

Cと
、 いつでも*正日コンパイラ良いasssemblyコードを生成するためにダウンロードを強制することができますアセンブリプログラミングの経験だけでは。

ここで、Cコンパイラが十¥分に効率的に使用し
、 純粋なアセンブリルーチンです。いつのビューのコンパイラの観点から問題について考えるには
、 常に良いあなたのCプログラムを書く。

私はにダウンロード*正日コンパイラコーディングのための優れているがdo whileループとswitch case構¥造。いくつかのライブラリ関数とは
、 常に青銅器てください結果を確認するときに使用します。

なぜなら
、 コーディングのための指示に充当したので簡単に
、 すべてのC構¥造をより効率的なアセンブリコードを取得することができます新しいRISC CPUの状況では優れています。

 
こんにちはcrono、

はい、それはカットアンドペーストエラーが発生しました。申¥し訳ありません。私はそれを修正している。

sbit velocity_port = P2 ^ 3; / /誤り!
sbit velocity_in = P2 ^ 3; / / 1つを修正しました。
私が2の最適化を変更する[データをオーバーレイ]これは
、 正しいコードが生成される。
以前の最適化を8日にされた[リユース共通のエントリコード]、私はこのオプションは
、 デフォルトだと思う。

もしkに最適化問題*メール* iの*リットルだったが指示する方法ですvariable?.

コンパイラは
、 この特定の ビット
の変数の最適化を行わないか?。

すべてのあなたの応答に感謝します。
よろしく
ITPの

 
ITPの書き込み:

...
variable?
が存在しないように、この特定の ビットの
変数の最適化を行うthecompiler指示する方法は何ですか?
 
バージョンを使用するとしたテスト?
これは
、 バージョン6.23の下に[OK]をようだ。
(すべての最適化レベル)
Chcliang。

 
やあ、

バージョン7.02で9最適化OKです

----------------------------------------------
* 51コンパイルV7.02b

Test1.c ROMを(小)の最適化(9、速度)をブラウズデバッグOBJECTE
- XTENDコードギアスLISTINCLUDE3 sbit STOP_KEY_PORT = P1の^ 5;
4 sbit velocity_in = P2 ^ 3;

7 / /元のCコード
8無効メイン(無効)
9(
10 1 P1の= 0x0f0;
11 1 velocity_in = 1;
12 1
13 1間(!velocity_in)
14 1(
15 2(!STOP_KEY_PORT)の場合
16 2後藤中止;
17 2)
18 1
19 1間(velocity_in)
20 1(
21 2(!STOP_KEY_PORT)の場合
22 2後藤中止;
23 2)
24 1
25 1中止:
26 1は(1);
27 1
28 1)

; FUNCTIONの主(のBEGIN)
; SOURCE行#8
; SOURCE行#9
; SOURCE行#10
0000 7590F0 MOV P1の、#0F0H
; SOURCE行#11
0003 D2A3にsetb velocity_in
0005?C0001:
; SOURCE行#13
0005 20A305バトンvelocity_in、?C0005
; SOURCE行#14
; SOURCE行#15
0008 2095FAバトンSTOP_KEY_PORT、?C0001
; SOURCE行#16
は000b 8006 SJMP?C0008
; SOURCE行#17
000D?C0005:
; SOURCE行#19
000D 30A303からJNB velocity_in、?C0008
; SOURCE行#20
; SOURCE行#21
0010 2095FAバトンSTOP_KEY_PORT、?C0005
; SOURCE行#22
; SOURCE行#23
; SOURCE行#25
0013アボート:
0013?C0008:
; SOURCE行#26
0013 80FE SJMP?C0008
; main関数(END)は* 51 COMPILATIOム完全。0警告(S)では、0エラー(S)を
-------------------------------------------

 

Welcome to EDABoard.com

Sponsor

Back
Top