PWM   zodpovězená otázka

VB.NET, Hardware

Mám hotové spínání motoru s výstupem přez COM port. Problém je, že je řešen přez 2 vlákna -> přivlastní si 50% procesoru (AMD Athlon X2 4000+). Jak ho mám předělat, aby si vzal minimum CPU.

Public Class PWM
    Dim t As New Threading.Thread(AddressOf neco)
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Sub neco()
        SerialPort1.Open()
start:
        If Label3.Text = "True" Then
            GoTo start
        Else
            SerialPort1.RtsEnable = True
            DELAY(Label10.Text)
            SerialPort1.RtsEnable = False
            DELAY(Label11.Text)
        End If
        GoTo start
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Label4.Text = "True" Then
            Label3.Text = "False"
        Else
            Label4.Text = "True"
            t.Start()
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Label3.Text = True
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        t.Abort()
    End Sub

    Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
        Label10.Text = (0 + HScrollBar2.Value) / HScrollBar1.Value
        Label11.Text = (100 - HScrollBar2.Value) / HScrollBar1.Value
        Label12.Text = CStr(CStr(HScrollBar2.Value) + "%")
    End Sub

    Private Sub HScrollBar2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar2.Scroll
        Label10.Text = (0 + HScrollBar2.Value) / HScrollBar1.Value
        Label11.Text = (100 - HScrollBar2.Value) / HScrollBar1.Value
        Label12.Text = CStr(CStr(HScrollBar2.Value) + "%")
    End Sub  
End Class

(pro prodlevu jsem použil "DELAY" z knihovny "Port.dll")

Celý projekt VB.NET 2010: http://uloz.to/5981561/pwm.zip

Pass: .net

(+ ovládání joystickem přez SlimDX)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je možné že to způsobuje "DELAY"?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

System.Diagnostics (pokud se nepletu) disponuj možnostmi jak zjiěťovat stav využití CPU/RAM atd. Dejte si do kódu nějaké volání na logovací proceduru a sledujte, jak se mění vytížení procesoru. TTak odhalíte kritické místo ve Vaší aplikaci.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je ale pěkná kravina, v praxi je bohužel toto řešení naprosto nepoužitelné. Podobné problémy se v praxi řeší pomocí speciálních nástrojů, tzv. profilerů. Vestavěný je třeba ve vyšších edicích Visual Studia, zdarma dostupný je třeba CLR Profiler, anebo je několik placených nástrojů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud je vytížení procesoru 50% (odpovídá to tomu, že jedno jádro pořád pracuje), pak za to asi může ta funkce DELAY, pokud pomocí ní čekáte delší dobu (více než 100ms). Ale nepodařilo se mi najít, jak přesně funguje.

Zkuste místo toho použít Thread.Sleep, ta nečeká aktivně (tzn. pomocí nekonečné smyčky, která vytěžuje procesor), ale pasivně (vlákno se uspí a nechá se za čas vzbudit).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

místo Delay použijte např:

...

SerialPort1.RtsEnable = True

Thread.Sleep(Label10.Text);

Port1.RtsEnable = False

Thread.Sleep(Label11.Text);

...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpovědi. Teď jsem zkoušel jak to bude vypadat, když ve vláknu nechám pouze DELAY s číslem a vytížení bylo pořád +- 50%. Chtěl jsem položit otázku čím nahradit DELAY a koukám, že už tady je odpověď, která funguje. Program vytěžuje maximálně 1% procesoru. Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback