2#if (KRNL_VRS != 20250606)
3#error "KRNL VERSION NOT UPDATED in krnl.c "
129#include <avr/interrupt.h>
132#if (F_CPU == 8000000)
133#pragma message("krnl detected 8 MHz we are stopping")
247 while (10 < eatTime) {
319#ifdef STOP_IN_BACKSTOPPER
351 pT->
cnt1 = (int)(pStk);
358 for (
i = 0;
i < stkSize;
i++) {
362 s = pStk + stkSize - 1;
376#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
388#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__)
392#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
397 for (
i = 0;
i < 30;
i++)
421 extern int __heap_start, *__brkval;
424 x = ((int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval));
459 pstk = (
char *)(
pRun->cnt1);
478 pstk = (
char *)(t->
cnt1);
480 pstk = (
char *)(
pRun->cnt1);
551 if ((maxvalue < init_val)
570 sem->cnt1 = init_val;
572 sem->maxv = maxvalue;
575 sem->ceiling_prio = -1;
576 sem->saved_prio = -1;
595 if (0 <=
sem->cnt1) {
599 sem->cnt2 =
sem->cnt3 = val;
607 if (
sem->cnt1 <
sem->maxv) {
615 if (
sem->cnt1 <= 0) {
666 pRun->cnt2 = timeout;
680 return ((
char)(
pRun->cnt2));
743 if (
sem->ceiling_prio < 0) {
748 if (
pRun->prio <
sem->ceiling_prio) {
816 if (0 <=
sem->cnt1) {
817 sem->cnt1 =
sem->clip = 0;
863 if (
pMsg->sem == NULL) {
938 *(pDst++) = *(pSrc++);
961 char r, *pSrc, *pDst;
979 *(pDst++) = *(pSrc++);
994 char r, *pSrc, *pDst;
1006 if (pB->
nr_el <= pB->
r) {
1013 *(pDst++) = *(pSrc++);
1033void k_rwInit(
struct k_rwlock_t *lock) {
1034 lock->nrReaders = 0;
1040int k_rwRdEnter(
struct k_rwlock_t *lock,
int timeout) {
1042 k_wait(lock->fifoSem, 0);
1046 if (lock->nrReaders == 1)
1047 k_wait(lock->rdwrSem, 0);
1052int k_rwWrEnter(
struct k_rwlock_t *lock,
int timeout) {
1053 k_wait(lock->fifoSem, 0);
1054 k_wait(lock->rdwrSem, 0);
1058int k_rwRdLeave(
struct k_rwlock_t *lock) {
1061 if (lock->nrReaders == 0) {
1067int k_rwWrLeave(
struct k_rwlock_t *lock) {
1108int k_init(
int nrTask,
int nrSem,
int nrMsg) {
1115 k_sem = nrSem + nrMsg + 1;
1165#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
1176 TCCR5B |= (1 << WGM52);
1178 TCCR5B |= (1 << CS51) | (1 << CS50);
1180 TIMSK5 |= (1 << OCIE5A);
1182#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) || defined(__AVR_ATmega328__)
1191 TCCR2A |= (1 << WGM21);
1192 TCCR2B |= (1 << CS22) | (1 << CS20);
1193 TIMSK2 |= (1 << OCIE2A);
1262#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__)
1263ISR(TIMER5_COMPA_vect, ISR_NAKED)
1264#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) || defined(__AVR_ATmega328__)
1265ISR(TIMER2_COMPA_vect, ISR_NAKED)
1301 pE->cnt2 =
pE->cnt3;
void k_wdt_enable(int i)
enable HW watchdog Call wdt_enable (AVR lib) DI(); wdt_enable(WDT_PERIOD); EI(); WDT_PERIOD is in KRN...
unsigned long k_millis(void)
return no of millisec sincs start NB no leap seconds - its clean
int k_signal(struct k_t *sem)
Signal a semaphore w eventually task shift.
void ki_task_shift(void)
shift running to task in front in AQ
unsigned long ki_millis(void)
returns no msec since start - no DI/EI lock Returns nr of milliseconds since krnl was started by k_st...
void k_eat_msec(unsigned int eatTime)
eat milliseconds - to mimik time consuming code
void k_free(void *m)
a krnl free which do nothing. call free empty - no function if dft as weak so you can supply with you...
void delayMicroseconds(unsigned int t)
int ki_semval(struct k_t *sem)
return sem counter value - Its a ki_ fct so intr is not enabled by leave
int k_msg_count(struct k_msg_t *m)
return no of pending messages
int k_mut_ceil_set(struct k_t *sem, char prio)
set ceiling priority on a mutex
char k_receive(struct k_msg_t *pB, void *el, int timeout, int *lost_msg)
int ki_signal(struct k_t *sem)
signal a semaphore from AN ISR - no task shift , do not enable intr,...
int k_wait2(struct k_t *sem, int timeout, int *nrClip)
wait with add info .ยด- nr of in max limit from signals since last time(saturation)
volatile unsigned char tcntValue
int k_sleep(int time)
let task sleep for a number of milliseconds
void k_send_Q_clip(unsigned char nr, int nrClip)
breakout for k_send
char ki_receive(struct k_msg_t *pB, void *el, int *lost_msg)
int k_semval(struct k_t *sem)
as ki_semval but to enable intr after leave
int k_set_prio(char prio)
char ki_send(struct k_msg_t *pB, void *el)
int k_wait(struct k_t *sem, int timeout)
stand wait on semaphore call with timeout facility
int k_clear_msg_Q(struct k_msg_t *pB)
int ki_unused_stak(struct k_t *t)
void k_sem_signal(unsigned char nr, int semVal)
breakout for k_signal
int k_mut_ceil_leave(struct k_t *sem)
leave a "ceiled mutex" enter with k_mut_ceil_enter
void k_set_coop_multitask(unsigned char onn)
struct k_t * k_crt_task(void(*pTask)(void), char prio, char *pStk, int stkSize)
create a task - only to be called before k_start creates a task and put it in the active Q
void k_round_robbin(void)
void * k_malloc(int k)
overruled malloc call malloc protected by DI and EI if dft as weak so you can supply with your own
struct k_t * deQ(struct k_t *el)
int k_set_sem_timer(struct k_t *sem, int val)
attach a periodic timer to a semaphore, to be used for realtime
int k_unused_stak(struct k_t *t)
char k_send(struct k_msg_t *pB, void *el)
void enQ(struct k_t *Q, struct k_t *el)
int k_sem_signals_lost(struct k_t *sem)
return signals lost on a sem(saturation) (and reset the saturation counter) Returns how many signals ...
int k_mut_ceil_enter(struct k_t *sem, int timeout)
set ceiling priority on a mutex
int k_mut_ceil(struct k_t *sem, int timeout, void(*fct)(void))
mutex entet, call fct, leave ceil in one call
struct k_t * k_crt_sem(int init_val, int maxvalue)
change task priority and reinserts it in task Q and do a task shift
struct k_msg_t * send_pool
struct k_t * k_crt_mut(char ceiling_prio, int init_val, int maxvalue)
crt a std semaphore to be used as mutex
int k_init(int nrTask, int nrSem, int nrMsg)
struct k_msg_t * k_crt_send_Q(int nr_el, int el_size, void *pBuf)
void k_wdt_disable(void)
disable HW watchdog disable wdt Disable the watchdog timer
void prio_enQ(struct k_t *Q, struct k_t *el)
int ki_wait(struct k_t *sem, int timeout)
a wait call with no disable - fct might no be usefull
void k_sem_clip(unsigned char nr, int nrClip)
int ki_msg_count(struct k_msg_t *m)
returns no of pending msg on msgf sem - a ki_ fct so no enable of interrupt
int ki_clear_msg_Q(struct k_msg_t *pB)
int k_clear_sem(struct k_t *sem)
reset sem counter to 0 is no tasks is waiting - usefull ?
void k_sem_wait(unsigned char nr, int semVal)
breakout for k_wait
volatile char k_wdt_enabled
#define CEILINGFAILNOTCEIL
ISR(INT0_vect, ISR_NAKED)
unsigned long k_millis_counter