merkelig problem med k * E * i * l.

I

ITP

Guest
Hei Alle,
Jeg står foran et merkelig problem med k * E * i * l.For en "hvis"-uttalelse i C it
genererer en ubetinget hopp (LJMP) undervisning.Men når jeg legger en dummy
statement [while (! STOP_KEY_PORT)] det fungerer.

Nedenfor har jeg vist en del av meg C * 51 program og dets tilhørende K * E * i * l
utgang.

Erklæringen for to litt variabel som brukes er som følgersbit STOP_KEY_PORT = P1 ^ 5;
sbit velocity_in = P2 ^ 3;------------------------ START -----------------------
/ / Original C-kode
(
P1 = 0x0f0;
velocity_in = 1;

while (! velocity_in)
(
if (! STOP_KEY_PORT) goto abort;
)
while (velocity_in)
(
if (! STOP_KEY_PORT) goto abort;
)
)K * E * i * l output:758: P1 = 0x0f0;
C: 0x0CA8 7590F0 MOV P1 (0x90), # adc_data (0xF0)
759: velocity_in = 1;
760:
C: 0x0CAB D2B4 SETB velocity_in (0xB0.4)
761: while (! Velocity_in)
C: 0x0CAD 20B403 JB velocity_in (0xB0.4), C: 0CB3
762: (
763: if (! STOP_KEY_PORT) goto abort;
C: 0x0CB0 020D80 LJMP C: 0D80
764:)
765: while (velocity_in)
C: 0x0CB3 30B403 JNB velocity_in (0xB0.4), C: 0CB9
766: (
767: if (! STOP_KEY_PORT) goto abort;
C: 0x0CB6 020D80 LJMP C: 0D80
768:)
769:)
---------------------------- END --------------------- ----------
--------------------------- START ---------------------- --------
/ / C Code etter introduksjonen av setningen [while (! STOP_KEY_PORT)](
P1 = 0x0f0;
velocity_in = 1;
while (! STOP_KEY_PORT); / / <- nylig innført linje
while (! velocity_in)
(
if (! STOP_KEY_PORT) goto abort;
)
while (velocity_in)
(
if (! STOP_KEY_PORT) goto abort;
)
)K * E * i * l output:

758: P1 = 0x0f0;
C: 0x0B0B 7590F0 MOV P1 (0x90), # adc_data (0xF0)
759: velocity_in = 1;
C: 0x0B0E D2B4 SETB velocity_in (0xB0.4)
760: while (! STOP_KEY_PORT);
C: 0x0B10 3095FD JNB STOP_KEY_PORT (0x90.5), C: 0B10
761: while (! Velocity_in)
C: 0x0B13 20B406 JB velocity_in (0xB0.4), C: 0B1C
762: (
763: if (! STOP_KEY_PORT) goto abort;
C: 0x0B16 2095FA JB STOP_KEY_PORT (0x90.5), C: 0B13
C: 0x0B19 020BF2 LJMP C: 0BF2
764:)
765: while (velocity_in)
C: 0x0B1C 30B406 JNB velocity_in (0xB0.4), C: 0B25
766: (
767: if (! STOP_KEY_PORT) goto abort;
C: 0x0B1F 2095FA JB STOP_KEY_PORT (0x90.5), C: 0B1C
C: 0x0B22 020BF2 LJMP C: 0BF2
768:)
769:)
--------------------------- END ---------------------- ------Vennlige hjelpe meg å forstå dette problemet.
Takk for tiden din.
ITP.
Sist endret av ITP den 07. Sep 2003 10:17, endret 1 gang totalt

 
Sett optimalisering nivå til null (slå optimalisering av) og prøv igjen.Det kan være en av Keil merkelige bugs.

Tom

 
HI,

Kan være en klippe og lime feil, men i eksempelet du deklarerer

sbit velocity_port = P2 ^ 3;

og bruk

velocity_in

hvis det is't en feil, og hvis velocity_in blir erklært i funksjon uten å skrive det kan være en int type (se din. lst og. M51-fil).

Hvis du bruker en høy grad av optimalisering og fordi testen er repeted to ganger kompilatoren optimalisere med subroutine for test av "int" == 0.

 
Hei,

ke * il kompilatoren er veldig bra i noen tilfeller, men i enkelte andre ikke.

For eksempel hvis du ønsker å foreta optimale iterativ loop bruk gjøre mens løkke i stedet for loop og erklærer loop varable som lokal registrere varable.I det første tilfellet kompilatoren bruk DJNZ instruksjon og registrere variabel som loopen telleren i andre tilfeller bruker CJNE og midlertidige varable data i minnet.

Det er ikke lett å skrive godt optimalisert kompilator for CISC CPU med begrensede ressurser.

Med brønn C og montering erfaring med programmering kan alltid tvinge ke * il kompilatoren å produsere gode asssembly koden.

Hvor C kompilatoren ikke er tilstrekkelig effektiv bruk ren montering rutiner.Når du skriver en C-programmene er det alltid godt å tenke på problemet fra kompilatoren synspunkt.

Jeg fant ut at ke * il kompilatoren er utmerket for koding gjøre mens sløyfer og bytte saken strukturer.Be ware med noen bibliotek funksjoner og alltid sjekke resultater når du bruker dem.

Med ny RISC CPUer situasjonen er bedre fordi du kan lett få effektiv montering koden fra alle C konstruksjoner fordi du har bevilget instruksjoner for koding.

 
Hei Crono,

Ja, det var en klippe og lime feil.Jeg beklager.Jeg har rettet det.

sbit velocity_port = P2 ^ 3; / / Feil!
sbit velocity_in = P2 ^ 3; / Rettet One.
Når jeg byttet optimaliseringen for 2 [Data overliggende] Det genereres riktig kode.
Tidligere optimalisering var på 8 [Gjenbruk Felles oppføring code], tror jeg dette alternativet er standard.

Hvis det var en optimalisering problem i k * E * i * l, er det noen måte å fortellevariable?.

kompilatoren å ikke gjøre optimalisering for denne spesielle
delen variabel?.

Takk til alle svar.
Hilsen
ITP

 
ITP skrev:

...
variable?
er det noen måte å fortelle thecompiler å ikke gjøre optimalisering for denne spesielle
delen variabel?
 
hvilken versjon har du testet?
Det virker ok under versjon 6.23.
(alle optimalisering nivå)
Chcliang.

 
Hei,

på versjon 7.02 en optimalisere 9 er OK

----------------------------------------------
* 51 COMPILER V7.02b

Test1.c ROM (SMALL) OPTIMALISER (9, FART) BLA DEBUG OBJECTE
-XTEND CODE LISTINCLUDE3 sbit STOP_KEY_PORT = P1 ^ 5;
4 sbit velocity_in = P2 ^ 3;

7 / / original C-kode
8 void main (void)
9 (
10 1 P1 = 0x0f0;
11 1 velocity_in = 1;
12 1
13 1 while (! Velocity_in)
14 1 (
15 2 if (! STOP_KEY_PORT)
16 2 goto abort;
17 2)
18 1
19 1 while (velocity_in)
20 1 (
21 2 if (! STOP_KEY_PORT)
22 2 goto abort;
23 2)
24 1
25 1 abort:
26 1 while (1);
27 1
28 1)

; FUNCTION main (BEGIN)
; SOURCE LINE # 8
; SOURCE LINE # 9
; SOURCE LINE # 10
0000 7590F0 MOV P1, # 0F0H
; SOURCE LINE # 11
0003 D2A3 SETB velocity_in
0005? C0001:
; SOURCE LINE # 13
0005 20A305 JB velocity_in,? C0005
; SOURCE LINE # 14
; SOURCE LINE # 15
0008 2095FA JB STOP_KEY_PORT,? C0001
; SOURCE LINE # 16
000B 8006 SJMP? C0008
; SOURCE LINE # 17
000D? C0005:
; SOURCE LINE # 19
000D 30A303 JNB velocity_in,? C0008
; SOURCE LINE # 20
; SOURCE LINE # 21
0010 2095FA JB STOP_KEY_PORT,? C0005
; SOURCE LINE # 22
; SOURCE LINE # 23
; SOURCE LINE # 25
0013 abortere:
0013? C0008:
; SOURCE LINE # 26
0013 80FE SJMP? C0008
; FUNCTION main (END)* 51 COMPILATIO N COMPLETE.0 ADVARSEL (S), 0 ERROR (S)
-------------------------------------------

 

Welcome to EDABoard.com

Sponsor

Back
Top