eRTK
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
eRTK.h
Go to the documentation of this file.
1 /*
2  * eRTK.h
3  *
4  * Created: 27.04.2015 13:38:51
5  * Author: er
6  */
7 #include <avr/io.h>
8 #include <stddef.h>
9 #include <util/atomic.h>
10 #include <avr/interrupt.h>
11 
12 #ifndef ERTK_H_
13 #define ERTK_H_
14 
15 #define VANZTASK 6 //anzahl definierter prozesse
16 
17 #define F_CPU 16000000ul
18 
19 #define eRTKHZ 1000 //system tick rate
20 #define TIMERPREDIV 64ul //verteiler timer clock
21 #define TIMERPRELOAD ( F_CPU/( TIMERPREDIV*eRTKHZ ) )
22 
23 #if (TIMERPRELOAD>254) /* weil es ein 8 bit timer ist */
24 #error eRTK:Systematischer 8 Bit Overflow Fehler im SYSTIMER !
25 #endif
26 
27 #define ERTKDEBUG //gibt ein paar mehr infos zum debugging
28 //ueberwachungsfunktionen
29 #define eRTK_STARTUP_MS 0 //solange geben wir allen tasks zusammen zum hochlauf bis wir overload pruefen
30 #define eRTK_MAX_OVERLOAD 0 //und dies ist die max. erlaubte zahl an overload phasen bevor deadbeef() aufgerufen wird
31 
32 #define ERTK_STACKSIZE 256
33 
34 #define IDLELED
35 #ifdef IDLELED
36 #ifndef sbi
37 #define sbi(port,nr) (port|=_BV(nr))
38 #define cbi(port,nr) (port&=~_BV(nr))
39 #endif
40 //diagnose led fuer idle anzeige, wenn gewuenscht
41 #define oIDLE(a) { ( a ) ? sbi( PORTE, PE2 ) : cbi( PORTE, PE2 ); sbi( DDRE, PE2 ); }
42 #define oIDLEfast(a) { ( a ) ? sbi( PORTE, PE2 ) : cbi( PORTE, PE2 ); }
43 #else
44 //sonst zwei nops damit das timing passt
45 #define oIDLE(a)
46 #define oIDLEfast(a) asm volatile ( "nop\n nop\n" );
47 #endif
48 
49 //gruende fuer den toten bueffel
51 void deadbeef( tsys reason ); //allgemeine fehler routine
52 
53 void __attribute__ ((naked)) eRTK_scheduler( void ); /* start der hoechstprioren ready task, notfalls idle */
54 uint8_t eRTK_GetTimer8( void ); //systemzeit 1000Hz in 8 Bit
55 uint16_t eRTK_GetTimer16( void ); //systemzeit 1000Hz in 16 Bit
56 uint8_t eRTK_GetTid( void ); //holen der eigenen task id
57 void eRTK_SetReady( uint8_t tid ); //task fuer bereit erklaeren
58 void eRTK_SetSuspended( uint8_t tid ); //task suspendieren
59 void eRTK_WaitUntil( uint8_t then ); //warte auf den zeitpunkt
60 void eRTK_Sleep_ms( uint16_t ms ); //warte eine gewisse zeit
61 void eRTK_get_sema( uint8_t semaid ); /* Warten bis Semaphore frei ist und danach besetzen */
62 void eRTK_wefet( uint8_t timeout ); //Task suspendieren fuer eine gewisse zeit
63 void eRTK_init( void ); //initialisieren der datenstrukturen
64 void eRTK_timer_init( void ); //system timer initialisieren
65 void eRTK_go( void ); //start der hoechstprioren ready task, notfalls idle
66 
67 typedef struct { //der task control block
68  void ( *task )( uint16_t param0, void *param1 );
69  uint8_t prio;
70  uint16_t param0;
71  void * param1;
72  } t_eRTK_tcb;
73 
74 extern const t_eRTK_tcb rom_tcb[VANZTASK];
75 
76 #endif /* ERTK_H_ */
void eRTK_SetSuspended(uint8_t tid)
Definition: eRTK.c:255
uint16_t eRTK_GetTimer16(void)
Definition: eRTK.c:461
#define VANZTASK
Definition: eRTK.h:15
void eRTK_Sleep_ms(uint16_t ms)
Definition: eRTK.c:280
void eRTK_wefet(uint8_t timeout)
Definition: eRTK.c:269
uint8_t prio
Definition: eRTK.h:69
void eRTK_timer_init(void)
Definition: eRTK.c:515
void deadbeef(tsys reason)
void __attribute__((naked)) eRTK_scheduler(void)
Definition: eRTK.c:115
void eRTK_WaitUntil(uint8_t then)
Definition: eRTK.c:469
void * param1
Definition: eRTK.h:71
uint8_t eRTK_GetTimer8(void)
Definition: eRTK.c:457
void eRTK_init(void)
Definition: eRTK.c:371
const t_eRTK_tcb rom_tcb[VANZTASK]
Definition: main.c:90
void eRTK_get_sema(uint8_t semaid)
Definition: eRTK.c:309
void eRTK_go(void)
Definition: eRTK.c:151
tsys
Definition: eRTK.h:50
uint8_t eRTK_GetTid(void)
Definition: eRTK.c:233
uint16_t param0
Definition: eRTK.h:70
void eRTK_SetReady(uint8_t tid)
Definition: eRTK.c:238