Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
kernel.h
00001 /* Opus Una - A Small Cooperative Multitasking Kernel in C 00002 * 00003 * Copyright (C) 2011 by Ivo van Poorten <ivop@euronet.nl> 00004 * This file is licensed under the terms of the GNU Lesser 00005 * General Public License, version 3. 00006 */ 00007 00008 #ifndef OU_KERNEL_H 00009 #define OU_KERNEL_H 00010 00011 #ifndef NULL 00012 #define NULL ((void *)0) 00013 #endif 00014 00015 #define OU_VERSION 1 00016 00017 #define OU_CONCAT2(x,y) x##y 00018 #define OU_CONCAT(x,y) OU_CONCAT2(x,y) 00019 00020 #define OU_TASK(name) static void name(void) { if(ou_state) goto *ou_state; { 00021 #define OU_ENDTASK OU_SUSPEND; ou_wait=0; }} 00022 00023 #define OU_WAIT(ticks) { ou_wait = ticks; ou_state = &&OU_CONCAT(L,__LINE__); return; } \ 00024 OU_CONCAT(L,__LINE__): 00025 00026 #define OU_YIELD do{ OU_WAIT(0); }while(0) 00027 #define OU_SUSPEND do{ ou_tasks[ou_current_task].suspended = 1; OU_WAIT(0); }while(0) 00028 #define OU_START(t) do{ ou_tasks[t].suspended = 0; OU_WAIT(0); }while(0) 00029 00030 #define OU_GET_TASK_PRIORITY(t) ou_tasks[t].priority 00031 #define OU_SET_TASK_PRIORITY(t,p) ou_tasks[t].priority = p 00032 00033 #define OU_GET_MY_PRIORITY() OU_GET_TASK_PRIORITY(ou_current_task) 00034 #define OU_SET_MY_PRIORITY(p) OU_SET_TASK_PRIORITY(ou_current_task,p) 00035 00036 // Note: Locks only work between tasks, NOT between tasks and interrupt handlers. 00037 // For that, we need a full-blown mutex 00038 00039 #define OU_LOCK(i) while(!i) OU_WAIT(1); i=1 00040 #define OU_UNLOCK(i) i=0 00041 00042 struct ou_task { 00043 void (*function)(void); // entry point of task 00044 volatile unsigned priority, // 0 is highest, UINT_MAX-1 is lowest 00045 suspended, // task is suspended (=1) 00046 wait; // ticks to wait before running again 00047 unsigned delayed; // # of times scheduling was delayed 00048 void *state; // current state within function 00049 }; 00050 00051 void ou_update_tasks(void); // called from timer interrupt 00052 void ou_scheduler(void); // main loop 00053 00054 extern struct ou_task ou_tasks[]; 00055 extern void *ou_state; 00056 extern unsigned ou_wait, ou_current_task, ou_ticks; 00057 extern const unsigned ou_ntasks; 00058 00059 #endif
Generated on Wed Jul 13 2022 20:40:52 by
1.7.2