Immediate priority ceiling protocolneed to be updated jan 2019 Compile with ceiling with Compile with std mutex by semaphore by See below with runs on dig analyzer
/*
ceil04
task1 and task each 200 tick peiode and 60 tick tiem eating in mutex
mutex by semaphore of ceiling mutex
Set/Reset by #defein CEIL
Using debug on PORTB(Uno et al) or PORTA(Mega's)
*/
#include <krnl.h>
#define STK 150
char stak1[STK], stak2[STK], stak3[STK];
struct k_t * pTask1, *pTask2, *pTask3, *sem1, *sem2, *sem3, *sem4;
#define CEIL
void task1()
{
k_set_sem_timer(sem3, 200);
while (1) {
k_wait(sem3, 0);
#ifdef CEIL
k_mut_ceil_enter(sem1, 0);
#else
k_wait(sem1, 0);
#endif
bugBitSet(4); // vipper bit 4 DIO 4
k_eat_time(60);
bugBitReset(4);
#ifdef CEIL
k_mut_ceil_leave(sem1);
#else
k_signal(sem1);
#endif
}
}
void task2()
{
k_set_sem_timer(sem2, 200);
while (1) {
k_wait(sem2, 0);
#ifdef CEIL
k_mut_ceil_enter(sem1, 0);
#else
k_wait(sem1, 0);
#endif
bugBitSet(5);
k_eat_time(60);
bugBitReset(5);
#ifdef CEIL
k_mut_ceil_leave(sem1);
#else
k_signal(sem1);
#endif
}
}
void task3()
{
k_set_sem_timer(sem4, 60);
while (1) {
k_wait(sem4, 0);
k_eat_time(20);
}
}
void setup() {
// for debugging - only on uno eq- If Mega etc use PORTA(which is pn 22,23,...)
// see http://kom.aau.dk/~jdn/edu/doc/arduino/mega.png
init_IO_for_debug(); // see code below
Serial.begin(9600);
k_init(3, 4, 0); // 2 task, 1 semaphores, 0 messaegQueues */
pTask1 = k_crt_task(task1, 9, stak1, STK);
pTask2 = k_crt_task(task2, 15 , stak2, STK);
pTask3 = k_crt_task(task3, 13 , stak3, STK);
sem1 = k_crt_sem(1, 10); // 1: start value, 10: max value (clipping)
sem2 = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
sem3 = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
sem4 = k_crt_sem(0, 10); // 1: start value, 10: max value (clipping)
k_mut_ceil_set(sem1, 8);
k_start(1); /* start krnl timer speed 1 milliseconds*/
Serial.println("If you see this then krnl didnt start :-( ");
}
void loop() {}
/***********************************************************************/
void init_IO_for_debug()
{
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
for (int i = 8; i < 8 + 6; i++)
pinMode(i, OUTPUT);
#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
for (int i = 22; i < 22 + 6; i++)
pinMode(i, OUTPUT);
#endif
}
/**********************************************************************/
/***** DEBUGGING PART - LED ON 8-12**********/
/************************ DEBUG CALLBACK BREAKOUT PART ****************/
// must be extern C ! its not mandatory to supply with these functions - only if you need
volatile unsigned char reg = 0;
void bugBitSet(int bitNr)
{
DI();
reg = 1 << bitNr;
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
PORTB = (1 << pRun->nr) | reg; // arduino uno !! specific usage of PORTB
#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
PORTA = (1 << pRun->nr) | reg; // // arduino uno !! specific usage of PORTB
#endif
EI();
}
void bugBitReset(int bitNr)
{
char r;
DI();
r = ~(1 << bitNr);
reg = 0;
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
PORTB = (1 << pRun->nr) & r; // arduino uno !! specific usage of PORTB
#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
PORTA = (1 << pRun->nr) & r; // // arduino uno !! specific usage of PORTB
#endif
EI();
}
extern "C" {
void k_sem_clip(unsigned char nr, int i) {}
void k_sem_unclip(unsigned char nr) {}
void k_send_Q_clip(unsigned char nr, int i) {}
// task numbering is in creation order: dummy: 0, first of yours 1, next 2,...
void k_breakout() // called every task shift from dispatcher
{
// if we do have a uno,nano etc use PORTB directly
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
PORTB = (1 << pRun->nr) | reg; // arduino uno !! specific usage of PORTB
#elif defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__) || defined(__AVR_ATmega2561__)
PORTA = (1 << pRun->nr) | reg; // // arduino uno !! specific usage of PORTB
#endif
}
// get inspired at http://kom.aau.dk/~jdn/edu/doc/arduino/ards.html
}
With mutex by std semaphore
With mutex by im ceiling
|