NiboRoboLib 3.6 - MThread Library
thread.h
gehe zur Dokumentation dieser Datei
1 #ifndef THREAD_H
2 #define THREAD_H
3 
30 #include "cdll.h"
31 #include "mthread_conf.h"
32 #include <stdint.h>
33 
34 
35 #define THREAD_PRIO_HIGHEST 0
36 #define THREAD_PRIO_LOWEST (MTHREAD_PRIO_MAX-1)
37 
38 /* special timeout values */
39 #define TO_POLL 0x0000
40 #define TO_INF 0xffff
41 
42 #define MS_TO_TICKS(ms) (((ms))/(1000/MTHREAD_FREQ))
43 
44 enum {
45  THREAD_INIT = 0x00, // not started yet
46  THREAD_READY = 0x01, // in ready list
47  THREAD_WAIT = 0x02, // in wait list
48  THREAD_WAITTIME = 0x03, // in wait timeout list
49  THREAD_TIMEOUT_READY = 0x04 // in ready list, last wait timed out
50 };
51 
52 
53 typedef struct _thread_s {
54  cdll_t list; // ptr[0...3]
55  uint8_t priority; // ptr[4]
56  uint8_t state; // ptr[5]
57  uint16_t signal_cnt; // ptr[6...7]
58  uint16_t wait_timeout; // ptr[8...9]
59  void * stackpointer; // ptr[10...11]
60  cdll_t rivals_list; // ptr[12...13] Semaphoren, Mutex, etc...
61 } thread_t;
62 
63 #define THREAD_FROM_RIVALS_CDLL(cdll) ((thread_t*)(((char*)cdll)-12))
64 
65 
66 extern thread_t primaryThread;
67 
68 extern volatile thread_t * running_thread;
69 
70 typedef void thread_main_t(void * arg);
71 
72 
78 void thread_startScheduler(uint8_t priority);
79 
86 void thread_init(thread_t * thread, void * stack, uint16_t stack_size);
87 
94 void thread_start(thread_t * thread, thread_main_t * mainFunc, void * arg);
95 
96 
97 void thread_delete(thread_t * thread);
98 
102 void thread_yield();
103 
104 
110 void thread_wait();
111 
112 
121 uint8_t thread_waitTimeout(uint16_t timeout);
122 
123 
128 void thread_signal(thread_t * thread);
129 
130 
136 void thread_signalISR(thread_t * thread);
137 
138 
144 void thread_halt(thread_t * thread);
145 
146 
150 void thread_changePriority(thread_t * thread, uint8_t priority);
151 
152 
160 
161 
167 
168 
172 inline static thread_t * thread_getCurrent() {return (thread_t *) running_thread;}
173 
174 
175 #endif
Definition: thread.h:53
void thread_halt(thread_t *thread)
Den Thread anhalten, der Thread kann nur durch ein Signal wieder aufgeweckt werden.
void thread_changePriority(thread_t *thread, uint8_t priority)
Die Funktion ändert die Priorität des angegebenen Threads.
CDLL - Circular Double Linked List.
void thread_allowScheduling()
Die Funktion schaltet das Thread-Wechseln wieder ein.
void thread_init(thread_t *thread, void *stack, uint16_t stack_size)
Initialisiert die thread_t Datenstruktur mit den übergebenen Werten.
void thread_start(thread_t *thread, thread_main_t *mainFunc, void *arg)
Durch Aufruf der Funktion wird der Thread gestartet.
uint8_t thread_waitTimeout(uint16_t timeout)
Der aktuelle Thread wartet solange bis er ein Signal bekommt (durch Aufruf von thread_signal) oder bi...
static thread_t * thread_getCurrent()
Die Funktion liefert den aktuellen Thread zurück.
Definition: thread.h:172
void thread_signalISR(thread_t *thread)
Die Funktion sendet ein Signal an den angegebenen Thread aus einer Interruptroutine heraus...
void thread_startScheduler(uint8_t priority)
Durch den Aufruf dieser Funktion wird das Multithreading gestartet.
Definition: cdll.h:32
void thread_yield()
Die Funktion generiert bei Bedarf einen manuellen Kontextwechsel.
void thread_signal(thread_t *thread)
Die Funktion sendet ein Signal an den angegebenen Thread.
void thread_suppressScheduling()
Die Funktion verhindert das wechseln des aktuellen Threads.
void thread_wait()
Der aktuelle Thread wartet solange bis er ein Signal bekommt (durch Aufruf von thread_signal).