Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Wie am einfachsten Ausführungszeit Unterprogramms messen?
Hallo!
Um meine ASM Programme zeitlich zu vergleichen und optimieren brauche ich ein "Werkzeugprogramm", das Zeitverlauf eines Unterprogramms messen kann. Hat jemand sowas fertiges, oder kann mir sagen wie ich das am eifachsten schreiben kann?
Ich bin für jeden Beitrag sehr dankbar im voraus.
Mfg
Ohne jetzt direkt Ahnung von uC - Programmierung zu haben. Timer initialiesieren, Unterprogramm bzw. Routine aufrufen, am Ende den Wert ausgeben vom Timer?
Hallo Grusim!
Danke für Deine schnelle und sachliche Antwort. Ich habe mir es auch so vorgestestellt. Zumindest bin ich jetzt sicher,das ich nichts falsch mache.
Wie kann ich das Thema jetzt löschen?
MfG
Wie kann ich das Thema jetzt löschen?
Es ist eigentlich nicht der Sinn eines Forums, dass du das Therma löschst sobald deine Frage beantwortet ist.
Von dem was in einem Forum diskutiert und beantwortet wurde sollen ja auch noch andere Leute profitieren können, wenn sie irgendwann mal auf eine ähnliche Problematik stossen.
Ausserdem könnte es durchaus sein, dass noch andere, eventuell sogar bessere Vorschläge zur Lösung des Problems gemacht werden.
Wenn ein Thema aus irgendwelchen Gründen gelöscht oder verschoben werden soll, werden sich da sicherlich die Moderatoren drum kümmern. Die haben auch die notwendigen Nutzerrechte dafür. Du selber kannst nur deinen eigenen Beitrag löschen und das auch nur solange da noch niemand drauf geantwortet hat.
Hallo recycle!
Das war nicht ernst gemeint, aber danke. Natürlich , bevor ich das program schreiben werde möchte ich möglichst viel darüber wissen.
Sorry!
MfG
Natürlich , bevor ich das program schreiben werde möchte ich möglichst viel darüber wissen.
Kann es sein, dass man in dem Simulator von AVR Studio irgendwo ablesen kann wie lange das Abarbeiten einer Routine oder eines Programmes dauert? Ich meine ich habe das irgendwo mal gelesen, da ich AVR Studio nicht installiert habe kann ich aber nicht nachsehen.
Ich habe nur einen "echten" Simulator und habe keine Probleme mit testen von Programmen. Eigentlich ist meine Frage mit der Frage, ob die POSTINC Prorammverlauf verlangsamen verbunden. Ich habe keine Antwort bis jetzt bekommen und muß ich das dann selben prüfen.
Hallo
Ich nehm an, Du hast MPLAB. Das hat ne Stoppuhr. Die ist für sowas da.
Also Sim starten, dann PC an Anfang des Unterprogramms setzen. Am Ende davon einen Breakpoint setzen. Dann Stopuhr aufrufen und ev. resetten. Dann per Run laufen lassen. Am Breakpoint, stoppt das Programm und man kann die benötigte Zeit ablesen.
Zuerst natürlich sicherstellen, dass der Sim die korrekte Quarzfrequenz hat.
Für Details siehe Hilfe.
Gruess
Fritzli
Edit: Wenn du kein MPLAB hast, eben downloaden, ist sicher schneller als einen eigenen Sim zu schreiben...
Hallo Fritzli!
Vielen Dank für Deinen Vorschlag. Ich habe zwar MPLAB, aber will ich nicht benutzen, weil ich schon so viele Beispiele über bugs in Simulator in unserem Forum gelesen habe. Ich möchte mit meinem Projekt schnell fertig werden und finde die Lösung mit timer einfacher. Es tut mir leid, aber ich bin grundsetzlich gegen Simulationen, sowas habe ich nicht und werde ich nicht anwenden.
MfG
Hallo
Es tut mir leid, aber ich bin grundsetzlich gegen Simulationen, sowas habe ich nicht und werde ich nicht anwenden.
Da hast Du schon recht. Ich brauch den Simulator auch sehr selten. Aber grad die Stoppuhr finde ich ne gute Sache und sie scheint auch zu laufen...
Das mit dem Timer wird sicher "realer". Ich würde den TMR1 nehmen und mit 1:1 Vorteiler betreiben. Lässt sich auch einfach mit einem Bit ein- und ausschalten.
Gruess
Fritzli
O.K.Vielen Dank! Das soll auf dem PIC18F252 laufen. Na ja, bischen habe ich schon mit timer "gebastelt", da habe ich keine Angst.
MfG
Hallo!
Mein "Werkzeug" dazu habe ich schon fertig und mehrmals ausprobiert (z.B. für sehr genaue Einstellung Verzögerungschleifen). Es ist für den PIC18F2X2 geschrieben. Die konfiguration des Systemoscillators kann geändert werden (aktuell: externer Quarzoscillator). Das komplette Unter/Programm ohne RETURN (stattdessen 2xNOP) muss zwischen die zwei Sternlinien (wo jetzt zum Testen 10xNOP steht) kopiert und assembliert werden.
Nach dem Einschalten des programmierten PICs, steht die Ablaufzeit des Unter/Programms als hex Zahl in dem A Register (A3-A0) (obere Zeile des Displays links) und als dec Zahl in dem D Register (D3-D0) (untere Zeile des Displays rechts). Die maximale Zahl beträgt FFFFFFh (16777215d) Systemtakte (Fosc/4). Als Display habe ich die in dem Thema:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=13685
beschriebene Hardware benutzt. Die alle mit @ bezeichneten Unterprogramme gehören zu dem Display und können für anderes Display ersetzt werden. Falls jemand dafür interessiert ist, bin ich zur Hilfe bereit.
Dank dem "Werkzeug" konnte ich mir die Frage, ob die POSTINC und POSTDEC Programmablauf verlangsamen selber mit klarem NEIN beantworten und aus dem Forum löschen.
Inzwischen habe ich ein ASM Messprogramm geschrieben und in Wiki hochgeladen:
https://www.roboternetz.de/wissen/index.php/PIC_Assembler#PIC_Profiler
MfG
; Profiler
LIST P=18F252
include "P18F252.inc"
; __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _EC_OSC_1H
; __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HSPLL_OSC_1H
__CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
__CONFIG _CONFIG3H, _CCP2MX_ON_3H
__CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
#define @PORT PORTB
#define @TRIS TRISB
#define @DT @PORT,7
#define @CK @PORT,6
;************************
#define _C STATUS,C
#define _Z STATUS,Z
#define _Fcra Flags,0
#define _Fcrp Flags,1
#define _Ferr Flags,2
;************************
A3 EQU 0x00
A2 EQU 0x01
A1 EQU 0x02
A0 EQU 0x03
B3 EQU 0x04
B2 EQU 0x05
B1 EQU 0x06
B0 EQU 0x07
C3 EQU 0x08
C2 EQU 0x09
C1 EQU 0x0A
C0 EQU 0x0B
D3 EQU 0x0C
D2 EQU 0x0D
D1 EQU 0x0E
D0 EQU 0x0F
Flags EQU 0x10
ATemp EQU 0x11
HTemp EQU 0x12
RTemp EQU 0x13
Tmp EQU 0x15
Tmp1 EQU 0x16
;************************
@Tmp EQU 0xFF
@Tmp1 EQU 0xFE
@Tmp2 EQU 0xFD
@Tmp3 EQU 0xFC
;************************
ORG 0x0000
call Init
Main bcf INTCON,GIE ; disable interrupts
movlw 7
movwf T0CON ; configure Timer0
clrf TMR0H ; clear Timer 0
clrf TMR0L
bsf T0CON,TMR0ON ; start Timer0
;************************************************* ******
nop ; Hier wird das gemessene Programm kopiert
nop
nop
nop
nop
nop
nop
nop
nop
nop
;************************************************* ******
movlw 0xA7 ; "stop" Timer0
movwf T0CON
call GetTime
call @
goto Main
GetTime movff TMR0L,A1
movff TMR0H,A2
movff TMR0L,HTemp
clrf ATemp
bcf TRISA,5
FToggle incf ATemp,1
bsf T0CON,T0SE
bcf T0CON,T0SE
movf TMR0L,0
subwf HTemp,0
btfsc _Z
goto FToggle
comf ATemp,1
incf ATemp,0
movwf A0
bcf T0CON,TMR0ON
bsf TRISA,5
Hex_Dec call CDClr ; Hex>A,D>Dec
movlw 1
movwf C0
movlw 0x18 ; 24 bit Hex (6digits) > 32 bit Dec (8 digits)
movwf HTemp
Hex_DecL btfsc A0,0
call AddDC
call CopyCB
call AddCB
call ARotRb
decfsz HTemp,1
goto Hex_DecL
call BCClr
return
BCClr movlw 8
movwf ATemp
lfsr FSR0,B3
BCClrL clrf POSTINC0
decfsz ATemp,1
goto BCClrL
return
CDClr movlw 8
movwf ATemp
lfsr FSR0,C3
CDClrL clrf POSTINC0
decfsz ATemp,1
goto CDClrL
return
CopyCB lfsr FSR0,C0
lfsr FSR1,B0
CopyReg movlw 4
movwf ATemp
CopyRegL movff POSTDEC0,POSTDEC1
decfsz ATemp,1
goto CopyRegL
return
AddCB lfsr FSR0,B0 ; C+B>C
lfsr FSR1,C0
goto AddReg
AddDC lfsr FSR0,C0 ; D+C>D
lfsr FSR1,D0
AddReg bcf _Ferr ; 32 bit, (4 Bytes)
bcf _Fcrp
movlw 4
movwf ATemp
AddRegL bcf _Fcra
movf INDF0,0
addwf INDF1,0
btfsc _C
bsf _Fcra
daw
movwf INDF1
btfsc _C
bsf _Fcra
btfss _Fcrp
goto AddRegN
movlw 1
addwf INDF1,0
daw
movwf INDF1
btfsc _C
bsf _Fcra
AddRegN bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
movf POSTDEC0,1
movf POSTDEC1,1
decfsz ATemp,1
goto AddRegL
btfsc _Fcra
bsf _Ferr
return
ARotRb lfsr FSR0,A2 ; A register 3 Bytes (24 bit)
RRotRb movlw 3 ; rotates a register 1 bit right
movwf RTemp
bcf _Fcrp
btfsc A0,0
bsf _Fcrp
RRotRbL bcf _Fcra
btfsc INDF0,0
bsf _Fcra
bcf _C
btfsc _Fcrp
bsf _C
rrcf INDF0,1
bcf _Fcrp
btfsc _Fcra
bsf _Fcrp
movf POSTINC0,1
decfsz RTemp,1
goto RRotRbL
return
Cls lfsr FSR0,0
ClsL clrf POSTINC0
btfss FSR0L,6
goto ClsL
return
@ lfsr FSR2,0x000
call @1st
call @Line
call @2nd
call @Line
return
@Line movlw 8
movwf @Tmp3
@LineL movf POSTINC2,0
call @Val
decfsz @Tmp3,1
goto @LineL
return
@1st movlw 0x80
goto @Cmd
@2nd movlw 0xC0
@Cmd movwf @Tmp2
bcf STATUS,C
goto @Send
@SPC movlw " "
goto @Char
@Val movwf @Tmp1
swapf @Tmp1,0
call @Num
movf @Tmp1,0
@Num andlw 0x0F
movwf @Tmp
movlw 0x0A
subwf @Tmp,0
btfsc STATUS,C
addlw 7
addlw 0x3A
@Char movwf @Tmp2
bsf STATUS,C
@Send bcf @CK
bcf @DT
bsf @DT
movlw 9
movwf @Tmp
@Ser bcf @CK
bcf @DT
btfsc @Tmp2,7
bsf @DT
bsf @CK
rlcf @Tmp2,1
decfsz @Tmp,1
goto @Ser
bcf @DT
bsf @DT
@DelS movlw 0x64
movwf @Tmp2
@DelSL decfsz @Tmp2,1
goto @DelSL
return
Init movlw 7
movwf ADCON1
clrf TRISA ; make all ports as output
clrf PORTA
clrf TRISC
clrf PORTC
clrf @TRIS
clrf @PORT
call Cls
movlw 0x38 ; initialise display
call @Cmd
movlw 0x0C
call @Cmd
movlw 6
goto @Cmd
END
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.