Projekte
workwind
Multitasking optimiert
thread.h
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
Multitask...optimiert
cdll.c
cdll.h
condition.c
condition.h
main.c
mutex.c
mutex.h
scheduler.S
semaphore.c
semaphore.h
thread.c
thread.h
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7426 private projects
385 public projects
16180353 lines compiled
58212 builds
NIBO
@
multitasking_opt/thread.h [read only]
#ifndef THREAD_H #define THREAD_H #include "cdll.h" #include <stdint.h> #define THREAD_PRIO_MAX 4 /* special timeout values */ #define TO_POLL 0x0000 #define TO_INF 0xffff enum { THREAD_READY = 0x01, // in ready list THREAD_WAIT = 0x02, // in wait list THREAD_WAITTIME = 0x03, // in wait timeout list THREAD_TIMEOUT_READY = 0x04 // in ready list, last wait timed out }; typedef struct _thread_s { cdll_t list; // ptr[0...3] uint8_t priority; // ptr[4] uint8_t state; // ptr[5] uint16_t signal_cnt; // ptr[6...7] uint16_t wait_timeout; // ptr[8...9] void * stackpointer; // ptr[10...11] cdll_t rivals_list; // ptr[12...13] Semaphoren, Mutex, etc... } thread_t; #define THREAD_FROM_RIVALS_CDLL(cdll) ((thread_t*)(((char*)cdll)-12)) extern thread_t primaryThread; extern volatile thread_t * running_thread; typedef void thread_main_t(void * arg); /** * Durch den Aufruf dieser Funktion wird das Multithreading gestartet. Die * Funktion kehrt zurück im Kontext des primaryThread. Der primaryThread * bekommt die übergebene Priorität zugewiesen. */ void thread_startScheduler(uint8_t priority); /** * Initialisiert die thread_t Datenstruktur mit den übergebenen Werten. Der * Thread wird noch nicht gestartet. Die Funktion darf auch schon vor dem * Aufruf von thread_startScheduler aufgerufen werden. */ void thread_init(thread_t * thread, void * stack, uint16_t stack_size, uint8_t priority); /** * Durch Aufruf der Funktion wird der Thread gestartet. Die Funktion darf nur nach dem * Aufruf von thread_startScheduler aufgerufen werden. * Die thread_t Datenstruktur muss vorher mit thread_init initialiert worden sein! * Der erzeugte Thread befindet sich im Wartezustand und läuft erst nach senden eines * Signals los! * Der neue Thread wird mit dem Parameter arg aufgerufen: mainFunc(arg) */ void thread_start(thread_t * thread, thread_main_t * mainFunc, void * arg); void thread_delete(thread_t * thread); /** * Die Funktion generiert bei Bedarf einen manuellen Kontextwechsel. Sie ermöglich kooperatives Multithreading. */ void thread_yield(); /** * Der aktuelle Thread wartet solange bis er ein Signal bekommt (durch Aufruf von thread_signal). Vorab gesendete * Signale werden gespeichert und mit berücksichtigt. Wenn bereits ein Signal gesendet wurde kehrt die Funktion * direkt zurück und "verbraucht" das Signal. */ void thread_wait(); /** * Der aktuelle Thread wartet solange bis er ein Signal bekommt (durch Aufruf von thread_signal) oder bis die * angegebene Zeit abgelaufen ist. Vorab gesendete * Signale werden gespeichert und mit berücksichtigt. Wenn bereits ein Signal gesendet wurde kehrt die Funktion * direkt zurück und "verbraucht" das Signal. * @return: Die Funktion gibt den Wert 1 zurück wenn der Timer abgelaufen ist und den Wert 0 wenn ein * Signal gesendet wurde. */ uint8_t thread_waitTimeout(uint16_t timeout); /** * Die Funktion sendet ein Signal an den angegebenen Thread. Wenn der Thread nicht wartet * wird der Signalzähler des Threads um Eins erhöht. */ void thread_signal(thread_t * thread); /** * Die Funktion sendet ein Signal an den angegebenen Thread aus einer Interruptroutine heraus. * Wenn der Thread nicht wartet wird der Signalzähler des Threads um Eins erhöht. * Die Funktion lößt keinen direkten Kontextwechsel aus! */ void thread_signalISR(thread_t * thread); /** * Die Funktion ändert die Priorität des angegebenen Threads */ void thread_changePriority(thread_t * thread, uint8_t priority); /** * Die Funktion verhindert das wechseln des aktuellen Threads. Die Funktion kann mehrfach aufgerufen werden, um * das Thread-Wechseln wieder einzuschalten muss die Funktion thread_allowScheduling genauso häufig aufgerufen werden. * Wenn blockierende Funktionen (thread_wait und thread_waitTimeout) aufgerufen werden wird der Scheduler für die * Wartezeit wieder eingeschaltet! */ void thread_suppressScheduling(); /** * Die Funktion schaltet das Thread-Wechseln wieder ein. Nach mehrfachem Aufruf von thread_suppressScheduling muss auch * thread_allowScheduling mehnrfach aufgerufen werden. */ void thread_allowScheduling(); /** * Die Funktion liefert den aktuellen Thread zurück */ inline static thread_t * thread_getCurrent() {return (thread_t *) running_thread;} #endif
Compiler results:
Werbung
Online
FranziG
geniepoore1959464548
javierdruitt5492095
kellyfol738533124314
meagano73231733343