dit projekt
|
Go to the source code of this file.
Data Structures | |
struct | k_t |
struct | k_msg_t |
Macros | |
#define | KRNL_VRS 20240525 |
#define | KRNLBUG |
#define | BACKSTOPPER |
#define | DYNMEMORY |
#define | K_TICK 1 |
#define | WDT_PERIOD WDTO_1S |
#define | sbi(r, b) r |= _BV(b) |
#define | cbi(r, b) r &= ~_BV(b) |
#define | cbi(r, b) r &= ~_BV(b) |
#define | QHD_PRIO 102 |
#define | ZOMBI_PRIO (QHD_PRIO - 1) |
#define | DMY_PRIO (QHD_PRIO - 2) |
#define | DMY_STK_SZ 90 |
#define | STAK_HASH 0x5c |
#define | MAX_SEM_VAL 30000 |
#define | MAX_INT 0x7FFF |
#define | CEILINGFAILNOTCEIL -3 |
#define | CEILINGFAILPRIO -4 |
#define | lo8(X) ((unsigned char)((unsigned int)(X))) |
#define | hi8(X) ((unsigned char)((unsigned int)(X) >> 8)) |
#define | DI() __asm__ volatile("cli") |
#define | EI() __asm__ volatile("sei") |
#define | RETI() __asm__ volatile("reti") |
#define | K_CHG_STAK() |
Functions | |
void * | k_malloc (int k) |
void | k_free (void *m) |
void | __attribute__ ((weak)) k_wdt_enable(int t) |
unsigned long | ki_millis (void) |
int | k_ticksize (void) |
unsigned long | k_millis (void) |
void | k_eat_msec (unsigned int eatTime) |
void | ki_task_shift (void) __attribute__((naked)) |
int | k_sleep (int time) |
struct k_t * | k_crt_task (void(*pTask)(void), char prio, char *pS, int stkSize) |
int | k_set_prio (char prio) |
struct k_t * | k_crt_sem (int init_val, int maxvalue) |
struct k_t * | k_crt_mut (char ceiling_prio, int init_val, int maxvalue) |
int | k_mut_ceil_set (struct k_t *sem, char prio) |
int | k_mut_ceil_enter (struct k_t *sem, int timeout) |
int | k_mut_ceil_leave (struct k_t *sem) |
int | k_mut_ceil (struct k_t *sem, int timeout, void(*fct)(void)) |
int | k_set_sem_timer (struct k_t *sem, int val) |
int | ki_signal (struct k_t *sem) |
int | k_signal (struct k_t *sem) |
int | k_wait (struct k_t *sem, int timeout) |
int | k_wait2 (struct k_t *sem, int timeout, int *nrClip) |
int | k_sem_signals_lost (struct k_t *sem) |
int | ki_wait (struct k_t *sem, int timeout) |
int | ki_semval (struct k_t *sem) |
int | k_semval (struct k_t *sem) |
int | k_clear_sem (struct k_t *sem) |
int | ki_msg_count (struct k_msg_t *msgbuffer) |
int | k_msg_count (struct k_msg_t *m) |
struct k_msg_t * | k_crt_send_Q (int nr_el, int el_size, void *pBuf) |
char | ki_send (struct k_msg_t *pB, void *el) |
char | k_send (struct k_msg_t *pB, void *el) |
char | k_receive (struct k_msg_t *pB, void *el, int timeout, int *lost_msg) |
char | ki_receive (struct k_msg_t *pB, void *el, int *lost_msg) |
int | ki_clear_msg_Q (struct k_msg_t *pB) |
int | k_clear_msg_Q (struct k_msg_t *pB) |
int | k_tmrInfo (void) |
int | k_init (int nrTask, int nrSem, int nrMsg) |
int | k_start (void) |
int | k_stop () |
void | k_reset () |
int | k_stk_chk (struct k_t *t) |
int | ki_unused_stak (struct k_t *t) |
int | k_unused_stak (struct k_t *t) |
int | ki_my_unused_stak () |
void | k_round_robbin (void) |
void | k_release (void) |
void | k_set_coop_multitask (unsigned char onn) |
int | freeRam (void) |
Variables | |
unsigned char | k_coopFlag |
int | k_task |
int | k_sem |
int | k_msg |
volatile char | krnl_preempt_flag |
char | dmy_stk [DMY_STK_SZ] |
volatile char | k_wdt_enabled |
struct k_t * | task_pool |
struct k_t * | sem_pool |
struct k_t | AQ |
struct k_t * | pmain_el |
struct k_t * | pAQ |
struct k_t * | pDmy |
struct k_t * | pRun |
struct k_t * | pSleepSem |
struct k_msg_t * | send_pool |
char | nr_task |
char | nr_sem |
char | nr_send |
volatile char | k_running |
volatile char | k_err_cnt |
unsigned long | k_millis_counter |
char | k_preempt_flag |
volatile char | k_bug_on |
void int | nrClip |
void int | val |
#define K_CHG_STAK | ( | ) |
void __attribute__ | ( | (weak) | ) |
Call wdt_enable (AVR lib) DI(); wdt_enable(WDT_PERIOD); EI(); WDT_PERIOD is in KRNL i sec
[t] | watchdog timout WDT_PERIOD is 1 sec See avrlib docu for more info The watchdog is reset in krnls timer ISR when active |
disable wdt Disable the watchdog timer
a function for overloading on usersite which is called when a semaphore is overflooding no occur - it's only reading out semaphore idendity Signal operations has not taken place ! 1: means first semahore allocated by user, 2 the next etc Interrupt is disabled when called and must not be enabled during.. so no print etc
[in] | nr | id of semaphore 1,2,3,... |
[in] | nrClip | number of times clip has occured (may be reset by call k_wait_lost) |
called in a signal call val is sem val AFTER signal has taken place
[out] | nr | number of semaphore. Semaphores are allocated by user buth also in message queues. So it may be diff to find the semaphore... |
called when wait called. val is sem value after countdown has taken place NB is the wait call willl not wait and there is no token at the semaphore val will be -1111
a function for overloading on usersite which is called when a msgQ is overflooding no reset occur - it's only readind out smsgQ idendity 1: means first msgQ allocated by user etc Interrupt is disabled when called and must not be enabled during.. so no print etc
[out] | nr | : id of send Q 0,1,2,... |
[out] | nrClip | number of times clip has occured (may be reset by call k_receive and lost parm not eq NULL) |
Breakout function called from scheduler You can use to examine who is runnning and who is next NB NB should be fast code and remember interrupt is and must be disables pRun->nr Nr of running. dummy has nr == 0 then task is numbered 1.. in acc with order of creation of tasks k_breakout is defined as weak function so you can write your own k_breakout The builtin k_breakout has no code and just a placeholder to be subst with your code. setting led8-12 on uno as task number PORTB = (1 << pRun->nr) | led13
int freeRam | ( | void | ) |
int k_clear_msg_Q | ( | struct k_msg_t * | pB | ) |
Empty sendQ See ki_clear_msg-Q for description
Definition at line 945 of file krnl.c.
References DI, EI, ki_clear_msg_Q(), and k_msg_t::r.
int k_clear_sem | ( | struct k_t * | sem | ) |
struct k_t* k_crt_mut | ( | char | ceiling_prio, |
int | init_val, | ||
int | maxvalue | ||
) |
adds ceiling priority to semaphore use k_mut_ceil_enter k_mut_ceil_leave instead of wait and signal Can only be called before k_start
[in] | sem | reference to sem used for mutex - no check |
[in] | prio | Ceiling pirority |
[in] | init_val | startvalue of semaphore 0,1,2,... maxvalue |
[in] | maxvalue | which is maxvalue semaphore can reach |
Definition at line 748 of file krnl.c.
References k_t::ceiling_prio, k_crt_sem(), k_err_cnt, and k_running.
Referenced by setup().
struct k_t* k_crt_sem | ( | int | init_val, |
int | maxvalue | ||
) |
creates a standard Dijkstra semaphore. It can be initialized to values in range [0..maxvalue]
[in] | init_val | startvalue of semaphore 0,1,2,... maxvalue |
[in] | maxvalue | which is maxvalue semaphore can reach |
Definition at line 589 of file krnl.c.
References k_t::ceiling_prio, k_t::clip, k_t::cnt1, k_t::cnt2, k_err_cnt, k_running, k_sem, MAX_SEM_VAL, k_t::maxv, k_t::next, k_t::nr, nr_sem, k_t::pred, k_t::prio, QHD_PRIO, k_t::saved_prio, and sem_pool.
Referenced by k_crt_mut(), k_crt_send_Q(), k_init(), and setup().
struct k_msg_t* k_crt_send_Q | ( | int | nr_el, |
int | el_size, | ||
void * | pBuf | ||
) |
Definition at line 886 of file krnl.c.
References k_msg_t::cnt, k_msg_t::el_size, k_crt_sem(), k_err_cnt, k_msg, k_running, k_sem, k_msg_t::lost_msg, k_msg_t::nr, k_msg_t::nr_el, nr_sem, nr_send, k_msg_t::pBuf, k_msg_t::r, k_msg_t::sem, send_pool, and k_msg_t::w.
Referenced by setup().
struct k_t* k_crt_task | ( | void(*)(void) | pTask, |
char | prio, | ||
char * | pS, | ||
int | stkSize | ||
) |
creates a task and put it in the active Q
[in] | pTask | pointer to function for code ( void task(void) ...) |
[in] | stkSize | size of data area(in bytes) to be used for stak |
[in] | prio | - task prio max: 1 lowest < DUMMY_PRIO |
Definition at line 374 of file krnl.c.
References k_t::cnt1, k_t::cnt2, k_t::cnt3, DMY_PRIO, hi8, i, jumper(), k_err_cnt, k_running, k_task, lo8, k_t::maxv, k_t::nr, nr_task, pAQ, k_t::prio, prio_enQ(), k_t::pt, pTask, k_t::sp_hi, k_t::sp_lo, STAK_HASH, and task_pool.
Referenced by setup().
void k_eat_msec | ( | unsigned int | eatTime | ) |
Eat time in quant of krnl ticks starting from now but not from next tick Eats CPU time in k_tick quants
[in] | tyick | number of ticks to eat |
Definition at line 292 of file krnl.c.
References delayMicroseconds().
Referenced by t1(), t2(), task1(), task2(), tgeneric(), tnoise(), and tperiodic().
void k_free | ( | void * | m | ) |
call free empty - no function if dft as weak so you can supply with your own
int k_init | ( | int | nrTask, |
int | nrSem, | ||
int | nrMsg | ||
) |
Initialise KRNL. First function to be called. You have to give max number of tasks, semaphores and message queues you will use
[in] | nrTask | ... |
[in] | nrSem | ... |
[in] | nrMsg | ... |
Definition at line 1152 of file krnl.c.
References AQ, k_t::cnt2, k_t::cnt3, DMY_PRIO, k_crt_sem(), k_err_cnt, k_msg, k_running, k_sem, k_task, k_t::next, k_t::nr, nr_send, nr_task, pAQ, pmain_el, k_t::pred, k_t::prio, prio_enQ(), pSleepSem, QHD_PRIO, sem_pool, send_pool, and task_pool.
Referenced by setup().
void* k_malloc | ( | int | k | ) |
call malloc protected by DI and EI if dft as weak so you can supply with your own
unsigned long k_millis | ( | void | ) |
Returns nr of milliseconds since krnl was started by k_start
Definition at line 1322 of file krnl.c.
References DI, EI, and k_millis_counter.
Referenced by t2().
int k_msg_count | ( | struct k_msg_t * | m | ) |
returns nr of pending messages
[in] | msgbuffer | handle |
Definition at line 878 of file krnl.c.
References EI, and ki_msg_count().
int k_mut_ceil | ( | struct k_t * | sem, |
int | timeout, | ||
void(*)(void) | fct | ||
) |
Mutex enter and leave w imm priority ceiling in one operation
sm | mutex with ceiling |
timeout | 0 == forever @fct void fct(void) the function w critical code |
Definition at line 771 of file krnl.c.
References k_mut_ceil_enter(), and k_mut_ceil_leave().
int k_mut_ceil_enter | ( | struct k_t * | sem, |
int | timeout | ||
) |
Enter mutex (eq to k_wait...) use k_mut_enter / k_mut_leave instead of wait and signal
[in] | sem | aka mutex |
[in] | timeout | timeout value |
Definition at line 784 of file krnl.c.
References k_t::ceiling_prio, CEILINGFAILNOTCEIL, CEILINGFAILPRIO, deQ(), DI, EI, ki_task_shift(), ki_wait(), pAQ, k_t::prio, prio_enQ(), pRun, and k_t::saved_prio.
Referenced by getDataInCritRegion(), and k_mut_ceil().
int k_mut_ceil_leave | ( | struct k_t * | sem | ) |
Leave mutex (eq to k_signal...) use k_mut_enter/ k_mut_leave instead of wait and signal
[in] | sem | used as mutex |
Definition at line 816 of file krnl.c.
References deQ(), DI, EI, ki_signal(), ki_task_shift(), pAQ, k_t::prio, prio_enQ(), pRun, and k_t::saved_prio.
Referenced by getDataInCritRegion(), and k_mut_ceil().
int k_mut_ceil_set | ( | struct k_t * | sem, |
char | prio | ||
) |
char k_receive | ( | struct k_msg_t * | pB, |
void * | el, | ||
int | timeout, | ||
int * | lost_msg | ||
) |
Receive data (one element of el_size)in the ringbuffer if there are data DONE BY COPY !
[in] | pB | Ref to message buffer |
[out] | el | Reference to where data shall be copied to at your site |
[in] | timeout | Max time you want to wait on data, -1: never, 0: forever, positive: nr of KRNL timer quants |
[out] | lost_msg | nr of lost messages since last receive. will clip at
|
Definition at line 1036 of file krnl.c.
References k_msg_t::cnt, DI, EI, k_msg_t::el_size, i, ki_wait(), k_msg_t::lost_msg, k_msg_t::nr_el, k_msg_t::pBuf, k_msg_t::r, and k_msg_t::sem.
Referenced by task2().
void k_release | ( | void | ) |
release switch running to task in front of Active Q calls ki_task_shift (); enveloped by a DI and EI no round robbin
Definition at line 1129 of file krnl.c.
References DI, EI, and ki_task_shift().
void k_reset | ( | ) |
Reset by disable interrupt plus activate watchdog (15 millisseconds) and just wait...
void k_round_robbin | ( | void | ) |
round robbin reinsert running task in activeQ. so running will be inserted after other tasks with same or higher priority
Definition at line 1118 of file krnl.c.
References deQ(), DI, EI, ki_task_shift(), pAQ, prio_enQ(), and pRun.
int k_sem_signals_lost | ( | struct k_t * | sem | ) |
int k_semval | ( | struct k_t * | sem | ) |
returns value of semaphore
[in] | sem | semaphore handle |
Definition at line 852 of file krnl.c.
References EI, and ki_semval().
char k_send | ( | struct k_msg_t * | pB, |
void * | el | ||
) |
Put data (one element of el_size)in the ringbuffer if there are room for it. DONE BY COPY !
[in] | pB | Ref to message buffer |
[in] | el | Reference to data to be put in buffer. Size if already given in k_crt_send |
Definition at line 989 of file krnl.c.
References DI, EI, ki_send(), and ki_task_shift().
Referenced by task1().
void k_set_coop_multitask | ( | unsigned char | onn | ) |
Definition at line 1311 of file krnl.c.
References k_coopFlag.
int k_set_prio | ( | char | prio | ) |
change priority of calling task)
[in] | prio | new prio, Priority 1: highest (QHEAD_PRIO-1): lowest |
Definition at line 548 of file krnl.c.
References deQ(), DI, DMY_PRIO, EI, i, k_running, ki_task_shift(), pAQ, k_t::prio, prio_enQ(), and pRun.
Referenced by jumper().
int k_set_sem_timer | ( | struct k_t * | sem, |
int | val | ||
) |
attach a timer to the semaphore so KRNL will signal the semaphore with regular intervals. Can be used for cyclic real time run of a task.
[in] | sem | semaphore handle |
[in] | val | interval in quant of KRNL ticks (0: disable cyclic timer, 1,2,3... cyclic quant) |
Definition at line 631 of file krnl.c.
References k_t::cnt1, k_t::cnt2, k_t::cnt3, DI, EI, and val.
Referenced by t1(), task1(), task2(), and tperiodic().
int k_signal | ( | struct k_t * | sem | ) |
Signal a semaphore. Task shift will task place if a task is started by the signal and has higher priority than you.
[in] | sem | semaphore handle |
Definition at line 681 of file krnl.c.
References DI, EI, ki_signal(), and ki_task_shift().
Referenced by getDataInCritRegion(), saveDataInCritRegion(), task1(), and task2().
int k_sleep | ( | int | time | ) |
Set task asleep for a number of ticks.
[in] | time | nr of ticks to sleep < 0 |
Definition at line 491 of file krnl.c.
References k_wait(), and pSleepSem.
Referenced by t1(), t2(), task2(), tgeneric(), and tnoise().
int k_start | ( | void | ) |
Starts krnl is possible If there has been ciritcal errors between k_init and k_start (like no more task descriptors) k_start will return a negative number indicatin how many errors
If k_start starts you will not return from k_start
Definition at line 1192 of file krnl.c.
References DI, EI, k_err_cnt, k_running, K_TICK, k_tick_size, ki_task_shift(), pmain_el, and pRun.
Referenced by setup().
int k_stk_chk | ( | struct k_t * | t | ) |
Initialise blink on pin 13 ON when dummy is running Nov 2014 - fake do not use it bq it will not work for emergency use :-) returns nr of unbytes bytes on stak. For chekking if stak is too big or to small...
[in] | t | Reference to task (by task handle) If null then yourself |
int k_stop | ( | ) |
int k_ticksize | ( | void | ) |
Return krnl ticksize As for now it can be 1 (msec) or 10(msec) BEWARE All delays are in quants of tick_size..
Definition at line 329 of file krnl.c.
References k_tick_size.
int k_tmrInfo | ( | void | ) |
int k_unused_stak | ( | struct k_t * | t | ) |
int k_wait | ( | struct k_t * | sem, |
int | timeout | ||
) |
Wait on a semaphore. Task shift will task place if you are blocked.
[in] | sem | semaphore handle |
[in] | timeout | "<0" you will be started after timeout ticks, "=0" wait forever "-1" you will not wait |
Definition at line 728 of file krnl.c.
References DI, EI, and ki_wait().
Referenced by getDataInCritRegion(), k_sleep(), saveDataInCritRegion(), t1(), task1(), task2(), and tperiodic().
int k_wait2 | ( | struct k_t * | sem, |
int | timeout, | ||
int * | nrClip | ||
) |
Wait on a semaphore. Task shift will task place if you are blocked.
[in] | sem | semaphore handle |
[in] | timeout | "<0" you will be started after timeout ticks, "=0" wait forever "-1" you will not wait |
[out] | nrClip | If not NULL you will get in return nr of clip on signals on sem and clip counter will be set to 0 |
Definition at line 736 of file krnl.c.
References k_t::clip, DI, EI, ki_wait(), and nrClip.
Referenced by task1().
int ki_clear_msg_Q | ( | struct k_msg_t * | pB | ) |
Empty sendQ
Definition at line 927 of file krnl.c.
References k_msg_t::cnt, k_t::cnt1, k_running, k_msg_t::lost_msg, k_msg_t::r, k_msg_t::sem, and k_msg_t::w.
Referenced by k_clear_msg_Q().
unsigned long ki_millis | ( | void | ) |
Returns nr of milliseconds since krnl was started by k_start
Definition at line 1315 of file krnl.c.
References DI, and k_millis_counter.
int ki_msg_count | ( | struct k_msg_t * | msgbuffer | ) |
returns nr of pending messages
[in] | msgbuffer | handle xxx |
Definition at line 873 of file krnl.c.
References k_msg_t::cnt, and DI.
Referenced by k_msg_count().
int ki_my_unused_stak | ( | ) |
char ki_receive | ( | struct k_msg_t * | pB, |
void * | el, | ||
int * | lost_msg | ||
) |
Receive data (one element of el_size)in the ringbuffer if there are data DONE BY COPY ! No blocking if no data Interrupt will not be enabled after ki_receive and intr must be blocked prior to call
[in] | pB | Ref to message buffer |
[out] | el | Reference to where data shall be copied to at your site |
[out] | lost_msg | nr of lost messages since last receive. will clip at
|
Definition at line 1004 of file krnl.c.
References k_msg_t::cnt, DI, k_msg_t::el_size, i, ki_wait(), k_msg_t::lost_msg, k_msg_t::nr_el, k_msg_t::pBuf, k_msg_t::r, and k_msg_t::sem.
int ki_semval | ( | struct k_t * | sem | ) |
returns value of semaphore
[in] | sem | semaphore handle |
Definition at line 846 of file krnl.c.
Referenced by k_semval().
char ki_send | ( | struct k_msg_t * | pB, |
void * | el | ||
) |
Put data (one element of el_size)in the ringbuffer if there are room for it. Intended for ISR use DONE BY COPY !
[in] | pB | Ref to message buffer |
[in] | el | Reference to data to be put in buffer. Size if already given in k_crt_send |
Definition at line 953 of file krnl.c.
References k_msg_t::cnt, k_msg_t::el_size, i, ki_signal(), k_msg_t::lost_msg, MAX_SEM_VAL, k_msg_t::nr, k_msg_t::nr_el, k_msg_t::pBuf, k_msg_t::sem, and k_msg_t::w.
Referenced by k_send().
int ki_signal | ( | struct k_t * | sem | ) |
Signal a semaphore. Can be called from an ISR when interrupt is disabled. No task shift will occur - only queue manipulation.
[in] | sem | semaphore handle |
Definition at line 650 of file krnl.c.
References k_t::clip, k_t::cnt1, k_t::cnt2, deQ(), DI, k_sem_clip(), MAX_SEM_VAL, k_t::maxv, k_t::next, k_t::nr, pAQ, and prio_enQ().
Referenced by ISR(), k_mut_ceil_leave(), k_signal(), and ki_send().
void ki_task_shift | ( | void | ) |
issues a task shift - handle with care Not to be used by normal user
Referenced by k_mut_ceil_enter(), k_mut_ceil_leave(), k_release(), k_round_robbin(), k_send(), k_set_prio(), k_signal(), k_start(), and ki_wait().
int ki_unused_stak | ( | struct k_t * | t | ) |
Returns amount of unused stak
[in] | t | Ptr to taskdescriptor. If NULL it is yourself |
Definition at line 517 of file krnl.c.
References k_t::cnt1, i, pRun, and STAK_HASH.
Referenced by k_unused_stak().
int ki_wait | ( | struct k_t * | sem, |
int | timeout | ||
) |
Like k_wait with the exception interrupt is NOT enabled when leaving
[in] | sem | semaphore handle |
[in] | timeout | "<0" you will be started after timeout ticks, "=0" wait forever "-1" you will not wait |
Definition at line 698 of file krnl.c.
References k_t::cnt1, k_t::cnt2, k_t::cnt3, deQ(), DI, enQ(), ki_task_shift(), and pRun.
Referenced by k_mut_ceil_enter(), k_receive(), k_wait(), k_wait2(), and ki_receive().
|
extern |
|
extern |
|
extern |
Definition at line 218 of file krnl.c.
Referenced by ISR(), and k_set_coop_multitask().
|
extern |
Definition at line 208 of file krnl.c.
Referenced by k_crt_mut(), k_crt_sem(), k_crt_send_Q(), k_crt_task(), k_init(), and k_start().
|
extern |
Definition at line 213 of file krnl.c.
Referenced by ISR(), k_millis(), and ki_millis().
|
extern |
|
extern |
Definition at line 208 of file krnl.c.
Referenced by ISR(), k_crt_mut(), k_crt_sem(), k_crt_send_Q(), k_crt_task(), k_init(), k_mut_ceil_set(), k_set_prio(), k_start(), k_stop(), and ki_clear_msg_Q().
|
extern |
Definition at line 205 of file krnl.c.
Referenced by k_crt_task(), and k_init().
|
extern |
Referenced by ISR().
|
extern |
|
extern |
Definition at line 206 of file krnl.c.
Referenced by ISR(), k_crt_task(), and k_init().
|
extern |
Definition at line 203 of file krnl.c.
Referenced by k_crt_send_Q(), and k_init().
|
extern |
Definition at line 195 of file krnl.c.
Referenced by ISR(), k_crt_task(), and k_init().
void int val |
Definition at line 1120 of file krnl.h.
Referenced by k_set_sem_timer().