My Project - RET HER  versionsnr
KRNL

my own small KeRNeL adapted for Arduino

(C) 2012,2013,2014,...,2021

Jens Dalsgaard Nielsen jdn@e.nosp@m.s.aa.nosp@m.u.dk http://www.control.aau.dk/~jdn Section of Automation & Control Aalborg University, Denmark

"THE BEER-WARE LICENSE" (frit efter PHK) jdn@e.nosp@m.s.aa.nosp@m.u.dk wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return :-) or if you are real happy then ... single malt will be well received :-)

(C) Jens Dalsgaard Nielsen

Introduction

KRNL is a preemptive realtime kernel here ported for Arduino

See krnl.h for documentation or follow the links below

One note before starting:

NOTE

In standard version you can only select 1 millisecond in k_start. Otherwise it will not start

Before you start

All initialization must be carried out after k_init and BEFORE k_start

So no creation of semaphores, tasks, etc when the system is running.

Why ? because we are dealing with embedded systems and once your system is configured it shall just run.

I do also really advise not to use dynamic memory after k_start: no malloc and free when your system is running.

If ... you need to do so please protect memory by a mutex (semaphore + k_wait and k_signal) or just encapsule malloc in DI() and EI(). And never never use and rely on free. You may end up with fragmented memory which on the long run is of no use.

So the advise is to

  • create all tasks, semaphores etc
  • allocate what is needed of memory, resources etc
  • and then k_start

Memory usage

Use freeRam for testing (part of krnl)

  • Task descriptor 17B
  • Semaphore descriptor 17B
  • Message Queue descriptor 33B (17B for semaphore + 16B)

On the 1280/2560 a few more bytes is used due to extended program counter register

KRNL itself uses approx 190B before allocating task/sem/msgQ descriptors

Initialization/start/Stop of KRNL

Creation calls - only to be called before k_start

Semaphore runtime calls

ISR space variant of semaphores

_i indicates that no lock/unlock(disable/enable) is carried out - its up to your and KRNL must be locked ! (intr disabled)

Message Queue calls

Message Queue calls

Task calls

Div calls