Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Threads Kategorie: Programmierung Basic (von PeterS - 8.02.2011 8:42)
Als Antwort auf Threads von Dirk Dahlmanns - 8.02.2011 7:23

> Hallo,
>
> mit dem nachfolgedem Programm habe ich versucht, die Funktion der Threads zu verstehen.
> Ich verwende die C-Control Pro IDE 2.12.0.10 und das Projectboard mit der Mega32 Unit.
>
> Wenn man die Parameter bei thread 0 nicht angibt, wird die zeit  von thread 2 nicht eingehalten.
>
> Gibt man die Parameter für thread 0 an (siehe unten im Prog.) erhält man für Port D7 ein Signal ->
> mit einer frequenz von 20ms (50Hz). Sollte aber schneller laufen.
>
> Ich gehe davon aus, dass es keinen Sinn macht den 3. Parameter der #thread Anweisung kleiner ->
> anzugeben als die "Thread_Delay-Zeit" innerhalb der Threadprozedur.
>
> Auch die Zuweisung des 2 Parameters von #thread 0 (128) wirkt sich auf die Ausführung von thread2 ->
> aus.
>
> Weiterhin scheint es keinen Unterschied zu geben ob man Thread_Delay(0) oder Thread_Delay(1) angibt.
>
> Wird kein Thread_Delay angegeben, erhält man ein unsauberes Signal. (Threadwechsel erkennbar)
>
> Aus den Versuchen stellen sich folgende Fragen:
>
> -Wie schnell kann ein Thread maximal ausgeführt werden?
> -Muss man den #thread 0 mit viel Speicher (Parameter 2) und kleinstmöglicher Taskwechselzeit ->
>  parametrieren, um sicher zu stellen, dass die anderen Threads sicher ausgeführt werden?
> -Ist es Sinvoll die Taskwechselzeit(Parameter 3) mit der Thread_Delay-Zeit gleich zu halten?
> -Gibt es sinnvolle Parametergrenzen, die man einhalten bzw. beachten muss?
> -Wird die maximale Ausführungsgeschwindigkeit eines Threads durch eine höhere Anzahl von Threads ->
>  kleiner? (z.B. 10 Threads mit einer Taskwechselzeit von 10ms)
>

Hi,

dies ist die erste Version der IDE mit einem Zeitscheiben Threading, daher hatte mir noch
keiner in Erinnerung gerufen, in die Anleitung zu schreiben, das man möglichst nicht
an die Grenzen gehen soll.

1) Das Threading basiert auf einem 10ms Takt, und kann erst nach Vollenden des Bytecodes
den Thread wechseln. Bei langwierigen I/O oder floating point Operationen kann das bis zu
einigen ms dauern. Man kann daher keine Zeitschleifen damit machen, dafür genau genug sind
nur die Timerfunktionen.

2) Werte von null und eins sind grenzwertig und sollten vermieden werden. Ich würde im
Prinzip einen Wert von 10 = 100ms als Taskwechselzeit empfehlen.

3) Viel oder wenig Speicher macht vom Timing keinen Unterschied. Es ist egal wie nah
das Thread Delay() an der Threadwechselzeit liegt.

4) Klar wird die Ausführungsgeschwindigkeit bei mehr Threads kleiner, da sich ja alle
Threads den Prozessor teilen müssen.

Der Interpreter hat nicht viel Platz, deshalb ist das Multithreading auch sehr einfach
gestrickt. Hat man eine sehr langsame I/O Operation (wie z.B. warten auf die serielle
Schnittstelle) kann es auch passieren, das ein Thread einmal keine Rechenzeit bekommt,
da der noch laufende Bytecode länger als die Threadwechselzeit des neu aktiven Threads
den Ablauf blockiert hat.

Gruss Peter

 
> Quellcode
> '*******************************************************************************
> #thread 0,128,0
> #thread 1,128,100
> #thread 2,128,1
> '*******************************************************************************
> Sub thread1()
>
>  Do While True
>
>   Port_ToggleBit(30) 'Port D6 (LED1)
>   'Port_ToggleBit(31) 'Port D7 (LED2)
>
>   Thread_Delay(100) '100x10ms=1s
>
>  End While
>
> End Sub
> '*******************************************************************************
> Sub thread2()
>
>  Do While True
>
>   'Port_ToggleBit(30) 'Port D6 (LED1)
>   Port_ToggleBit(31) 'Port D7 (LED2)
>
>   Thread_Delay(1) '1x10ms=0.01s
>
>  End While
>
> End Sub
> '*******************************************************************************
> Sub ini()
>
>  Port_DataDirBit(PORT_LED1,PORT_OUT) 'Port D.6
>  Port_DataDirBit(PORT_LED2,PORT_OUT) 'Port D.7
>
> End Sub
> '*******************************************************************************
> Sub main()
>
>  ini()
>
>  Thread_Start(1,thread1)
>  Thread_Start(2,thread1)
>
>  Do While(1)
>  
>  End While
>
> End Sub
> '*******************************************************************************


    Antwort schreiben


Antworten:

Re: Threads (von Dirk Dahlmanns - 8.02.2011 18:52)