2#define KRNL_VRS 20250606
95#define WDT_PERIOD WDTO_1S
291#define ZOMBI_PRIO (QHD_PRIO - 1)
292#define DMY_PRIO (QHD_PRIO - 2)
297#define STAK_HASH 0x5c
298#define MAX_SEM_VAL 30000
299#define MAX_INT 0x7FFF
301#define CEILINGFAILNOTCEIL -3
302#define CEILINGFAILPRIO -4
356 struct k_t *rdwrSem, *rdSem, *fifoSem;
475#define lo8(X) ((unsigned char)((unsigned int)(X)))
476#define hi8(X) ((unsigned char)((unsigned int)(X) >> 8))
478#define DI() __asm__ volatile("cli")
479#define EI() __asm__ volatile("sei")
480#define RETI() __asm__ volatile("reti")
488#define K_CHG_STAK() \
490 if (pRun != AQ.next) { \
500#define K_CHG_STAK() \
501 if (pRun != AQ.next) { \
524#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) || \
525 defined(__AVR_ATmega2561__)
531 __asm__ volatile("push r1 \n\t" \
533 "in r0, __SREG__ \n\t" \
536 "in r0 , 0x3b \n\t" \
538 "in r0 , 0x3c \n\t" \
573 __asm__ volatile("pop r31 \n\t" \
604 "out 0x3c , r0 \n\t " \
606 "out 0x3b , r0 \n\t " \
608 "out __SREG__ , r0 \n\t " \
612#elif defined(__AVR_ATmega1284P__)
618 __asm__ volatile("push r1 \n\t" \
620 "in r0, __SREG__ \n\t" \
623 "in r0 , 0x3b \n\t" \
658 __asm__ volatile("pop r31 \n\t" \
689 "out 0x3b , r0 \n\t " \
691 "out __SREG__ , r0 \n\t " \
695#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) \
696 || defined(__AVR_ATmega328__) || defined(__AVR_ATmega32U4__)
699 __asm__ volatile("push r1 \n\t" \
701 "in r0, __SREG__ \n\t" \
737 __asm__ volatile("pop r31 \n\t" \
768 "out __SREG__ , r0 \n\t " \
1143void __attribute__((weak))
k_sem_clip(
unsigned char nr,
int nrClip);
1158void __attribute__((weak))
k_sem_signal(
unsigned char nr,
int val);
1171void __attribute__((weak))
k_sem_wait(
unsigned char nr,
int val);
1187void __attribute__((weak))
k_send_Q_clip(
unsigned char nr,
int nrClip);
1270void k_rwInit(
struct k_rwlock_t *lock);
1275int k_rwRdEnter(
struct k_rwlock_t *lock,
int timeout);
1280int k_rwWrEnter(
struct k_rwlock_t *lock,
int timeout);
1285int k_rwRdLeave(
struct k_rwlock_t *lock);
1290int k_rwWrLeave(
struct k_rwlock_t *lock);
1308int k_init(
int nrTask,
int nrSem,
int nrMsg);
struct k_msg_t * send_pool
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
volatile char krnl_preempt_flag
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...
int k_stk_chk(struct k_t *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
void k_wdt_disable()
disable HW watchdog disable wdt Disable the watchdog timer
volatile char k_wdt_enabled
void k_sem_signal(unsigned char nr, int val)
breakout for k_signal
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)
int k_sleep(int time)
let task sleep for a number of milliseconds
void k_wdt_enable(int t)
enable HW watchdog Call wdt_enable (AVR lib) DI(); wdt_enable(WDT_PERIOD); EI(); WDT_PERIOD is in KRN...
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)
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)
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
int ki_msg_count(struct k_msg_t *msgbuffer)
returns no of pending msg on msgf sem - a ki_ fct so no enable of interrupt
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)
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_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)
struct k_t * k_crt_task(void(*pTask)(void), char prio, char *pS, int stkSize)
create a task - only to be called before k_start creates a task and put it in the active Q
void k_sem_wait(unsigned char nr, int val)
breakout for k_wait
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_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 ?
unsigned long k_millis_counter