Program to control an accelerometer, motors and a rangefinder using the ScmRTOS ported to mbed. (Work in progress and buggy)

Dependencies:   mbed

Committer:
jberry
Date:
Mon Nov 01 20:39:01 2010 +0000
Revision:
0:9b057566f9ee

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jberry 0:9b057566f9ee 1 //******************************************************************************
jberry 0:9b057566f9ee 2 //*
jberry 0:9b057566f9ee 3 //* FULLNAME: Single-Chip Microcontroller Real-Time Operating System
jberry 0:9b057566f9ee 4 //*
jberry 0:9b057566f9ee 5 //* NICKNAME: scmRTOS
jberry 0:9b057566f9ee 6 //*
jberry 0:9b057566f9ee 7 //* PURPOSE: OS Kernel Header. Declarations And Definitions
jberry 0:9b057566f9ee 8 //*
jberry 0:9b057566f9ee 9 //* Version: 3.10
jberry 0:9b057566f9ee 10 //*
jberry 0:9b057566f9ee 11 //* $Revision: 256 $
jberry 0:9b057566f9ee 12 //* $Date:: 2010-01-22 #$
jberry 0:9b057566f9ee 13 //*
jberry 0:9b057566f9ee 14 //* Copyright (c)c 2003-2010, Harry E. Zhurov
jberry 0:9b057566f9ee 15 //*
jberry 0:9b057566f9ee 16 //* Permission is hereby granted, free of charge, to any person
jberry 0:9b057566f9ee 17 //* obtaining a copy of this software and associated documentation
jberry 0:9b057566f9ee 18 //* files (the "Software"), to deal in the Software without restriction,
jberry 0:9b057566f9ee 19 //* including without limitation the rights to use, copy, modify, merge,
jberry 0:9b057566f9ee 20 //* publish, distribute, sublicense, and/or sell copies of the Software,
jberry 0:9b057566f9ee 21 //* and to permit persons to whom the Software is furnished to do so,
jberry 0:9b057566f9ee 22 //* subject to the following conditions:
jberry 0:9b057566f9ee 23 //*
jberry 0:9b057566f9ee 24 //* The above copyright notice and this permission notice shall be included
jberry 0:9b057566f9ee 25 //* in all copies or substantial portions of the Software.
jberry 0:9b057566f9ee 26 //*
jberry 0:9b057566f9ee 27 //* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
jberry 0:9b057566f9ee 28 //* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
jberry 0:9b057566f9ee 29 //* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
jberry 0:9b057566f9ee 30 //* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
jberry 0:9b057566f9ee 31 //* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
jberry 0:9b057566f9ee 32 //* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
jberry 0:9b057566f9ee 33 //* THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jberry 0:9b057566f9ee 34 //*
jberry 0:9b057566f9ee 35 //* =================================================================
jberry 0:9b057566f9ee 36 //* See http://scmrtos.sourceforge.net for documentation, latest
jberry 0:9b057566f9ee 37 //* information, license and contact details.
jberry 0:9b057566f9ee 38 //* =================================================================
jberry 0:9b057566f9ee 39 //*
jberry 0:9b057566f9ee 40 //*****************************************************************************
jberry 0:9b057566f9ee 41
jberry 0:9b057566f9ee 42 #ifndef OS_KERNEL_H
jberry 0:9b057566f9ee 43 #define OS_KERNEL_H
jberry 0:9b057566f9ee 44
jberry 0:9b057566f9ee 45 #include <stddef.h>
jberry 0:9b057566f9ee 46 #include <commdefs.h>
jberry 0:9b057566f9ee 47 #include <usrlib.h>
jberry 0:9b057566f9ee 48
jberry 0:9b057566f9ee 49 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 50
jberry 0:9b057566f9ee 51 //==============================================================================
jberry 0:9b057566f9ee 52 extern "C" void OS_Start(TStackItem* sp);
jberry 0:9b057566f9ee 53
jberry 0:9b057566f9ee 54 #if scmRTOS_CONTEXT_SWITCH_SCHEME == 0
jberry 0:9b057566f9ee 55 extern "C" void OS_ContextSwitcher(TStackItem** Curr_SP, TStackItem* Next_SP);
jberry 0:9b057566f9ee 56 #else
jberry 0:9b057566f9ee 57 extern "C" TStackItem* OS_ContextSwitchHook(TStackItem* sp);
jberry 0:9b057566f9ee 58 #endif
jberry 0:9b057566f9ee 59
jberry 0:9b057566f9ee 60 //==============================================================================
jberry 0:9b057566f9ee 61
jberry 0:9b057566f9ee 62 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 63 //
jberry 0:9b057566f9ee 64 //
jberry 0:9b057566f9ee 65 // NAME : OS
jberry 0:9b057566f9ee 66 //
jberry 0:9b057566f9ee 67 // PURPOSE : Namespace for all OS stuff
jberry 0:9b057566f9ee 68 //
jberry 0:9b057566f9ee 69 // DESCRIPTION: Includes: Kernel,
jberry 0:9b057566f9ee 70 // Processes,
jberry 0:9b057566f9ee 71 // Mutexes,
jberry 0:9b057566f9ee 72 // Event Flags,
jberry 0:9b057566f9ee 73 // Byte-wide Channels,
jberry 0:9b057566f9ee 74 // Arbitrary-type Channels,
jberry 0:9b057566f9ee 75 // Messages
jberry 0:9b057566f9ee 76 //
jberry 0:9b057566f9ee 77 namespace OS
jberry 0:9b057566f9ee 78 {
jberry 0:9b057566f9ee 79 class TBaseProcess;
jberry 0:9b057566f9ee 80
jberry 0:9b057566f9ee 81 INLINE inline void SetPrioTag(TProcessMap& pm, const TProcessMap PrioTag) { pm |= PrioTag; }
jberry 0:9b057566f9ee 82 INLINE inline void ClrPrioTag(TProcessMap& pm, const TProcessMap PrioTag) { pm &= ~PrioTag; }
jberry 0:9b057566f9ee 83
jberry 0:9b057566f9ee 84 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 85 //
jberry 0:9b057566f9ee 86 // NAME : TKernel
jberry 0:9b057566f9ee 87 //
jberry 0:9b057566f9ee 88 /// Implements kernel-level operations such as
jberry 0:9b057566f9ee 89 /// process management, process-level scheduling,
jberry 0:9b057566f9ee 90 /// ISR-level scheduling, system timing.
jberry 0:9b057566f9ee 91 //
jberry 0:9b057566f9ee 92 // DESCRIPTION:
jberry 0:9b057566f9ee 93 //
jberry 0:9b057566f9ee 94 //
jberry 0:9b057566f9ee 95 class TKernel
jberry 0:9b057566f9ee 96 {
jberry 0:9b057566f9ee 97 //-----------------------------------------------------------
jberry 0:9b057566f9ee 98 //
jberry 0:9b057566f9ee 99 // Declarations
jberry 0:9b057566f9ee 100 //
jberry 0:9b057566f9ee 101
jberry 0:9b057566f9ee 102
jberry 0:9b057566f9ee 103 friend class TISRW;
jberry 0:9b057566f9ee 104 friend class TISRW_SS;
jberry 0:9b057566f9ee 105 friend class TBaseProcess;
jberry 0:9b057566f9ee 106 friend class TMutex;
jberry 0:9b057566f9ee 107 friend class TEventFlag;
jberry 0:9b057566f9ee 108 friend class TChannel;
jberry 0:9b057566f9ee 109 friend class TBaseMessage;
jberry 0:9b057566f9ee 110
jberry 0:9b057566f9ee 111 template<typename T, word size, class S> friend class channel;
jberry 0:9b057566f9ee 112 template<typename T> friend class message;
jberry 0:9b057566f9ee 113
jberry 0:9b057566f9ee 114 friend void Run();
jberry 0:9b057566f9ee 115 friend void WakeUpProcess(TBaseProcess& p);
jberry 0:9b057566f9ee 116 friend void ForceWakeUpProcess(TBaseProcess& p);
jberry 0:9b057566f9ee 117 friend inline bool IsProcessSleeping(const TBaseProcess& p);
jberry 0:9b057566f9ee 118 friend inline bool IsProcessSuspended(const TBaseProcess& p);
jberry 0:9b057566f9ee 119 friend inline dword GetTickCount();
jberry 0:9b057566f9ee 120
jberry 0:9b057566f9ee 121 //-----------------------------------------------------------
jberry 0:9b057566f9ee 122 //
jberry 0:9b057566f9ee 123 // Data
jberry 0:9b057566f9ee 124 //
jberry 0:9b057566f9ee 125 private:
jberry 0:9b057566f9ee 126 byte CurProcPriority;
jberry 0:9b057566f9ee 127 TProcessMap ReadyProcessMap;
jberry 0:9b057566f9ee 128 TBaseProcess* ProcessTable[scmRTOS_PROCESS_COUNT+1];
jberry 0:9b057566f9ee 129 volatile byte ISR_NestCount;
jberry 0:9b057566f9ee 130
jberry 0:9b057566f9ee 131 #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
jberry 0:9b057566f9ee 132 byte SchedProcPriority;
jberry 0:9b057566f9ee 133 #endif
jberry 0:9b057566f9ee 134
jberry 0:9b057566f9ee 135 #if scmRTOS_SYSTEM_TICKS_ENABLE == 1
jberry 0:9b057566f9ee 136 volatile dword SysTickCount;
jberry 0:9b057566f9ee 137 #endif
jberry 0:9b057566f9ee 138
jberry 0:9b057566f9ee 139 //-----------------------------------------------------------
jberry 0:9b057566f9ee 140 //
jberry 0:9b057566f9ee 141 // Functions
jberry 0:9b057566f9ee 142 //
jberry 0:9b057566f9ee 143 public:
jberry 0:9b057566f9ee 144 INLINE TKernel()
jberry 0:9b057566f9ee 145 : CurProcPriority(pr0)
jberry 0:9b057566f9ee 146 , ReadyProcessMap( (1 << (scmRTOS_PROCESS_COUNT + 1)) - 1) // set all processes ready
jberry 0:9b057566f9ee 147 , ISR_NestCount(0)
jberry 0:9b057566f9ee 148 {
jberry 0:9b057566f9ee 149 }
jberry 0:9b057566f9ee 150
jberry 0:9b057566f9ee 151 private:
jberry 0:9b057566f9ee 152 INLINE inline void RegisterProcess(TBaseProcess* const p);
jberry 0:9b057566f9ee 153
jberry 0:9b057566f9ee 154 void Sched();
jberry 0:9b057566f9ee 155 INLINE void Scheduler() { if(ISR_NestCount) return; else Sched(); }
jberry 0:9b057566f9ee 156 INLINE inline void SchedISR();
jberry 0:9b057566f9ee 157
jberry 0:9b057566f9ee 158 #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
jberry 0:9b057566f9ee 159 INLINE inline bool IsContextSwitchDone() const volatile;
jberry 0:9b057566f9ee 160 #endif
jberry 0:9b057566f9ee 161 INLINE void SetProcessReady (const byte pr) { TProcessMap PrioTag = GetPrioTag(pr); SetPrioTag( ReadyProcessMap, PrioTag); }
jberry 0:9b057566f9ee 162 INLINE void SetProcessUnready(const byte pr) { TProcessMap PrioTag = GetPrioTag(pr); ClrPrioTag( ReadyProcessMap, PrioTag); }
jberry 0:9b057566f9ee 163
jberry 0:9b057566f9ee 164 public:
jberry 0:9b057566f9ee 165 INLINE inline void SystemTimer();
jberry 0:9b057566f9ee 166 #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
jberry 0:9b057566f9ee 167 INLINE inline TStackItem* ContextSwitchHook(TStackItem* sp);
jberry 0:9b057566f9ee 168 #endif
jberry 0:9b057566f9ee 169
jberry 0:9b057566f9ee 170 }; // End of TKernel class definition
jberry 0:9b057566f9ee 171 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 172 extern TKernel Kernel;
jberry 0:9b057566f9ee 173
jberry 0:9b057566f9ee 174 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 175 //
jberry 0:9b057566f9ee 176 /// BaseProcess
jberry 0:9b057566f9ee 177 ///
jberry 0:9b057566f9ee 178 /// Implements base class-type for application processes
jberry 0:9b057566f9ee 179 //
jberry 0:9b057566f9ee 180 // DESCRIPTION:
jberry 0:9b057566f9ee 181 //
jberry 0:9b057566f9ee 182 //
jberry 0:9b057566f9ee 183 class TBaseProcess
jberry 0:9b057566f9ee 184 {
jberry 0:9b057566f9ee 185 friend class TKernel;
jberry 0:9b057566f9ee 186 friend class TISRW;
jberry 0:9b057566f9ee 187 friend class TISRW_SS;
jberry 0:9b057566f9ee 188 friend class TEventFlag;
jberry 0:9b057566f9ee 189 friend class TMutex;
jberry 0:9b057566f9ee 190 friend class TBaseMessage;
jberry 0:9b057566f9ee 191
jberry 0:9b057566f9ee 192 template<typename T, word size, class S> friend class channel;
jberry 0:9b057566f9ee 193 template<typename T> friend class message;
jberry 0:9b057566f9ee 194
jberry 0:9b057566f9ee 195
jberry 0:9b057566f9ee 196 friend void Run();
jberry 0:9b057566f9ee 197 friend void WakeUpProcess(TBaseProcess& p);
jberry 0:9b057566f9ee 198 friend void ForceWakeUpProcess(TBaseProcess& p);
jberry 0:9b057566f9ee 199 friend bool IsProcessSleeping(const TBaseProcess& p);
jberry 0:9b057566f9ee 200 friend bool IsProcessSuspended(const TBaseProcess& p);
jberry 0:9b057566f9ee 201
jberry 0:9b057566f9ee 202 public:
jberry 0:9b057566f9ee 203 #if SEPARATE_RETURN_STACK == 0
jberry 0:9b057566f9ee 204 TBaseProcess( TStackItem* Stack, TPriority pr, void (*exec)() );
jberry 0:9b057566f9ee 205 #else
jberry 0:9b057566f9ee 206 TBaseProcess( TStackItem* Stack, TStackItem* RStack, TPriority pr, void (*exec)() );
jberry 0:9b057566f9ee 207 #endif
jberry 0:9b057566f9ee 208
jberry 0:9b057566f9ee 209 static void Sleep(TTimeout timeout = 0);
jberry 0:9b057566f9ee 210
jberry 0:9b057566f9ee 211 protected:
jberry 0:9b057566f9ee 212 TStackItem* StackPointer;
jberry 0:9b057566f9ee 213 TTimeout Timeout;
jberry 0:9b057566f9ee 214 TPriority Priority;
jberry 0:9b057566f9ee 215 };
jberry 0:9b057566f9ee 216 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 217
jberry 0:9b057566f9ee 218 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 219 //
jberry 0:9b057566f9ee 220 /// process
jberry 0:9b057566f9ee 221 ///
jberry 0:9b057566f9ee 222 /// Implements template for application processes instantiation
jberry 0:9b057566f9ee 223 //
jberry 0:9b057566f9ee 224 // DESCRIPTION:
jberry 0:9b057566f9ee 225 //
jberry 0:9b057566f9ee 226 //
jberry 0:9b057566f9ee 227 #if SEPARATE_RETURN_STACK == 0
jberry 0:9b057566f9ee 228
jberry 0:9b057566f9ee 229 template<TPriority pr, word stack_size>
jberry 0:9b057566f9ee 230 class process : public TBaseProcess
jberry 0:9b057566f9ee 231 {
jberry 0:9b057566f9ee 232 public:
jberry 0:9b057566f9ee 233 INLINE_PROCESS_CTOR process();
jberry 0:9b057566f9ee 234
jberry 0:9b057566f9ee 235 OS_PROCESS static void Exec();
jberry 0:9b057566f9ee 236
jberry 0:9b057566f9ee 237 private:
jberry 0:9b057566f9ee 238 TStackItem Stack[stack_size/sizeof(TStackItem)];
jberry 0:9b057566f9ee 239 };
jberry 0:9b057566f9ee 240
jberry 0:9b057566f9ee 241 template<TPriority pr, word stack_size>
jberry 0:9b057566f9ee 242 OS::process<pr, stack_size>::process() : TBaseProcess( &Stack[stack_size/sizeof(TStackItem)]
jberry 0:9b057566f9ee 243 , pr
jberry 0:9b057566f9ee 244 , reinterpret_cast<void (*)()>(Exec) )
jberry 0:9b057566f9ee 245 {
jberry 0:9b057566f9ee 246 }
jberry 0:9b057566f9ee 247
jberry 0:9b057566f9ee 248 #else
jberry 0:9b057566f9ee 249
jberry 0:9b057566f9ee 250 template<TPriority pr, word stack_size, word rstack_size>
jberry 0:9b057566f9ee 251 class process : public TBaseProcess
jberry 0:9b057566f9ee 252 {
jberry 0:9b057566f9ee 253 public:
jberry 0:9b057566f9ee 254 INLINE_PROCESS_CTOR process();
jberry 0:9b057566f9ee 255
jberry 0:9b057566f9ee 256 OS_PROCESS static void Exec();
jberry 0:9b057566f9ee 257
jberry 0:9b057566f9ee 258 private:
jberry 0:9b057566f9ee 259 TStackItem Stack [stack_size/sizeof(TStackItem)];
jberry 0:9b057566f9ee 260 TStackItem RStack[rstack_size/sizeof(TStackItem)];
jberry 0:9b057566f9ee 261 };
jberry 0:9b057566f9ee 262
jberry 0:9b057566f9ee 263 template<TPriority pr, word stack_size, word rstack_size>
jberry 0:9b057566f9ee 264 process<pr, stack_size, rstack_size>::process() : TBaseProcess( &Stack[stack_size/sizeof(TStackItem)]
jberry 0:9b057566f9ee 265 , &RStack[rstack_size/sizeof(TStackItem)]
jberry 0:9b057566f9ee 266 , pr
jberry 0:9b057566f9ee 267 , reinterpret_cast<void (*)()>(Exec))
jberry 0:9b057566f9ee 268 {
jberry 0:9b057566f9ee 269 }
jberry 0:9b057566f9ee 270
jberry 0:9b057566f9ee 271 #endif
jberry 0:9b057566f9ee 272 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 273
jberry 0:9b057566f9ee 274 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 275 //
jberry 0:9b057566f9ee 276 // Miscellaneous
jberry 0:9b057566f9ee 277 //
jberry 0:9b057566f9ee 278 //
jberry 0:9b057566f9ee 279 INLINE inline void Run();
jberry 0:9b057566f9ee 280 INLINE inline void LockSystemTimer() { TCritSect cs; LOCK_SYSTEM_TIMER(); }
jberry 0:9b057566f9ee 281 INLINE inline void UnlockSystemTimer() { TCritSect cs; UNLOCK_SYSTEM_TIMER(); }
jberry 0:9b057566f9ee 282 void WakeUpProcess(TBaseProcess& p);
jberry 0:9b057566f9ee 283 void ForceWakeUpProcess(TBaseProcess& p);
jberry 0:9b057566f9ee 284 INLINE inline void Sleep(TTimeout t = 0) { TBaseProcess::Sleep(t); }
jberry 0:9b057566f9ee 285
jberry 0:9b057566f9ee 286 INLINE inline bool IsProcessSleeping(const TBaseProcess& p)
jberry 0:9b057566f9ee 287 {
jberry 0:9b057566f9ee 288 TCritSect cs;
jberry 0:9b057566f9ee 289 if(p.Timeout)
jberry 0:9b057566f9ee 290 return true;
jberry 0:9b057566f9ee 291 else
jberry 0:9b057566f9ee 292 return false;
jberry 0:9b057566f9ee 293 }
jberry 0:9b057566f9ee 294
jberry 0:9b057566f9ee 295 INLINE inline bool IsProcessSuspended(const TBaseProcess& p)
jberry 0:9b057566f9ee 296 {
jberry 0:9b057566f9ee 297 TCritSect cs;
jberry 0:9b057566f9ee 298 if(Kernel.ReadyProcessMap & GetPrioTag(p.Priority))
jberry 0:9b057566f9ee 299 return false;
jberry 0:9b057566f9ee 300 else
jberry 0:9b057566f9ee 301 return true;
jberry 0:9b057566f9ee 302 }
jberry 0:9b057566f9ee 303 //--------------------------------------------------------------------------
jberry 0:9b057566f9ee 304
jberry 0:9b057566f9ee 305 #if scmRTOS_SYSTEM_TICKS_ENABLE == 1
jberry 0:9b057566f9ee 306 INLINE inline dword GetTickCount() { TCritSect cs; return Kernel.SysTickCount; }
jberry 0:9b057566f9ee 307 #endif
jberry 0:9b057566f9ee 308
jberry 0:9b057566f9ee 309 #if scmRTOS_SYSTIMER_HOOK_ENABLE == 1
jberry 0:9b057566f9ee 310 INLINE_SYS_TIMER_HOOK void SystemTimerUserHook();
jberry 0:9b057566f9ee 311 #endif
jberry 0:9b057566f9ee 312
jberry 0:9b057566f9ee 313 #if scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE == 1
jberry 0:9b057566f9ee 314 INLINE_CONTEXT_SWITCH_HOOK void ContextSwitchUserHook();
jberry 0:9b057566f9ee 315 #endif
jberry 0:9b057566f9ee 316
jberry 0:9b057566f9ee 317 }
jberry 0:9b057566f9ee 318 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 319
jberry 0:9b057566f9ee 320 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 321 //
jberry 0:9b057566f9ee 322 /// Register Process
jberry 0:9b057566f9ee 323 ///
jberry 0:9b057566f9ee 324 /// Places pointer to process in kernel's process table
jberry 0:9b057566f9ee 325 //
jberry 0:9b057566f9ee 326 void OS::TKernel::RegisterProcess(OS::TBaseProcess* const p)
jberry 0:9b057566f9ee 327 {
jberry 0:9b057566f9ee 328 ProcessTable[p->Priority] = p;
jberry 0:9b057566f9ee 329 }
jberry 0:9b057566f9ee 330 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 331 //
jberry 0:9b057566f9ee 332 /// System Timer Implementation
jberry 0:9b057566f9ee 333 ///
jberry 0:9b057566f9ee 334 /// Performs process's timeouts checking and
jberry 0:9b057566f9ee 335 /// moving processes to ready-to-run state
jberry 0:9b057566f9ee 336 //
jberry 0:9b057566f9ee 337 void OS::TKernel::SystemTimer()
jberry 0:9b057566f9ee 338 {
jberry 0:9b057566f9ee 339 SYS_TIMER_CRIT_SECT();
jberry 0:9b057566f9ee 340 #if scmRTOS_SYSTEM_TICKS_ENABLE == 1
jberry 0:9b057566f9ee 341 SysTickCount++;
jberry 0:9b057566f9ee 342 #endif
jberry 0:9b057566f9ee 343
jberry 0:9b057566f9ee 344 #if scmRTOS_PRIORITY_ORDER == 0
jberry 0:9b057566f9ee 345 const byte BaseIndex = 0;
jberry 0:9b057566f9ee 346 #else
jberry 0:9b057566f9ee 347 const byte BaseIndex = 1;
jberry 0:9b057566f9ee 348 #endif
jberry 0:9b057566f9ee 349
jberry 0:9b057566f9ee 350 for(byte i = BaseIndex; i < (scmRTOS_PROCESS_COUNT + BaseIndex); i++)
jberry 0:9b057566f9ee 351 {
jberry 0:9b057566f9ee 352 TBaseProcess* p = ProcessTable[i];
jberry 0:9b057566f9ee 353
jberry 0:9b057566f9ee 354 if(p->Timeout > 0)
jberry 0:9b057566f9ee 355 {
jberry 0:9b057566f9ee 356 if(--p->Timeout == 0)
jberry 0:9b057566f9ee 357 {
jberry 0:9b057566f9ee 358 SetProcessReady(p->Priority);
jberry 0:9b057566f9ee 359 }
jberry 0:9b057566f9ee 360 }
jberry 0:9b057566f9ee 361 }
jberry 0:9b057566f9ee 362 }
jberry 0:9b057566f9ee 363 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 364 //
jberry 0:9b057566f9ee 365 /// ISR optimized scheduler
jberry 0:9b057566f9ee 366 ///
jberry 0:9b057566f9ee 367 /// !!! IMPORTANT: This function must be call from ISR services only !!!
jberry 0:9b057566f9ee 368 //
jberry 0:9b057566f9ee 369 //
jberry 0:9b057566f9ee 370 #if scmRTOS_CONTEXT_SWITCH_SCHEME == 0
jberry 0:9b057566f9ee 371 void OS::TKernel::SchedISR()
jberry 0:9b057566f9ee 372 {
jberry 0:9b057566f9ee 373 byte NextPrty = GetHighPriority(ReadyProcessMap);
jberry 0:9b057566f9ee 374 if(NextPrty != CurProcPriority)
jberry 0:9b057566f9ee 375 {
jberry 0:9b057566f9ee 376 TStackItem* Next_SP = ProcessTable[NextPrty]->StackPointer;
jberry 0:9b057566f9ee 377 TStackItem** Curr_SP_addr = &(ProcessTable[CurProcPriority]->StackPointer);
jberry 0:9b057566f9ee 378 CurProcPriority = NextPrty;
jberry 0:9b057566f9ee 379 OS_ContextSwitcher(Curr_SP_addr, Next_SP);
jberry 0:9b057566f9ee 380 }
jberry 0:9b057566f9ee 381 }
jberry 0:9b057566f9ee 382 #else
jberry 0:9b057566f9ee 383 void OS::TKernel::SchedISR()
jberry 0:9b057566f9ee 384 {
jberry 0:9b057566f9ee 385 byte NextPrty = GetHighPriority(ReadyProcessMap);
jberry 0:9b057566f9ee 386 if(NextPrty != CurProcPriority)
jberry 0:9b057566f9ee 387 {
jberry 0:9b057566f9ee 388 SchedProcPriority = NextPrty;
jberry 0:9b057566f9ee 389 RaiseContextSwitch();
jberry 0:9b057566f9ee 390 }
jberry 0:9b057566f9ee 391 }
jberry 0:9b057566f9ee 392 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 393 bool OS::TKernel::IsContextSwitchDone() const volatile
jberry 0:9b057566f9ee 394 {
jberry 0:9b057566f9ee 395 byte cur = CurProcPriority; ///< reading to temporary vars is performed due to
jberry 0:9b057566f9ee 396 byte sched = SchedProcPriority; ///< suppress warning about order of volatile access
jberry 0:9b057566f9ee 397 return cur == sched;
jberry 0:9b057566f9ee 398 }
jberry 0:9b057566f9ee 399 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 400 TStackItem* OS::TKernel::ContextSwitchHook(TStackItem* sp)
jberry 0:9b057566f9ee 401 {
jberry 0:9b057566f9ee 402 ProcessTable[CurProcPriority]->StackPointer = sp;
jberry 0:9b057566f9ee 403 sp = ProcessTable[SchedProcPriority]->StackPointer;
jberry 0:9b057566f9ee 404
jberry 0:9b057566f9ee 405 #if scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE == 1
jberry 0:9b057566f9ee 406 ContextSwitchUserHook();
jberry 0:9b057566f9ee 407 #endif
jberry 0:9b057566f9ee 408
jberry 0:9b057566f9ee 409 CurProcPriority = SchedProcPriority;
jberry 0:9b057566f9ee 410 return sp;
jberry 0:9b057566f9ee 411 }
jberry 0:9b057566f9ee 412 //------------------------------------------------------------------------------
jberry 0:9b057566f9ee 413 #endif // scmRTOS_CONTEXT_SWITCH_SCHEME
jberry 0:9b057566f9ee 414
jberry 0:9b057566f9ee 415 //-----------------------------------------------------------------------------
jberry 0:9b057566f9ee 416 /// Start Operation
jberry 0:9b057566f9ee 417 INLINE inline void OS::Run()
jberry 0:9b057566f9ee 418 {
jberry 0:9b057566f9ee 419 TStackItem* sp = Kernel.ProcessTable[pr0]->StackPointer;
jberry 0:9b057566f9ee 420 OS_Start(sp);
jberry 0:9b057566f9ee 421 }
jberry 0:9b057566f9ee 422
jberry 0:9b057566f9ee 423 #include <OS_Services.h>
jberry 0:9b057566f9ee 424
jberry 0:9b057566f9ee 425 #endif // OS_KERNEL_H
jberry 0:9b057566f9ee 426