Quick and dirty port of scmRTOS demo to mbed 1768. scmRTOS is a small RTOS written using C++. Offers (static) processes, critical sections, mutexes, messages, channels.

Dependencies:   mbed

Committer:
igorsk
Date:
Thu Sep 09 21:19:01 2010 +0000
Revision:
0:a405220cf420

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igorsk 0:a405220cf420 1 //******************************************************************************
igorsk 0:a405220cf420 2 //*
igorsk 0:a405220cf420 3 //* FULLNAME: Single-Chip Microcontroller Real-Time Operating System
igorsk 0:a405220cf420 4 //*
igorsk 0:a405220cf420 5 //* NICKNAME: scmRTOS
igorsk 0:a405220cf420 6 //*
igorsk 0:a405220cf420 7 //* PROCESSOR: ARM Cortex-M3
igorsk 0:a405220cf420 8 //*
igorsk 0:a405220cf420 9 //* TOOLKIT: EWARM (IAR Systems)
igorsk 0:a405220cf420 10 //*
igorsk 0:a405220cf420 11 //* PURPOSE: Target Dependent Stuff Source
igorsk 0:a405220cf420 12 //*
igorsk 0:a405220cf420 13 //* Version: 3.10
igorsk 0:a405220cf420 14 //*
igorsk 0:a405220cf420 15 //* $Revision: 195 $
igorsk 0:a405220cf420 16 //* $Date:: 2008-06-19 #$
igorsk 0:a405220cf420 17 //*
igorsk 0:a405220cf420 18 //* Copyright (c) 2003-2010, Harry E. Zhurov
igorsk 0:a405220cf420 19 //*
igorsk 0:a405220cf420 20 //* Permission is hereby granted, free of charge, to any person
igorsk 0:a405220cf420 21 //* obtaining a copy of this software and associated documentation
igorsk 0:a405220cf420 22 //* files (the "Software"), to deal in the Software without restriction,
igorsk 0:a405220cf420 23 //* including without limitation the rights to use, copy, modify, merge,
igorsk 0:a405220cf420 24 //* publish, distribute, sublicense, and/or sell copies of the Software,
igorsk 0:a405220cf420 25 //* and to permit persons to whom the Software is furnished to do so,
igorsk 0:a405220cf420 26 //* subject to the following conditions:
igorsk 0:a405220cf420 27 //*
igorsk 0:a405220cf420 28 //* The above copyright notice and this permission notice shall be included
igorsk 0:a405220cf420 29 //* in all copies or substantial portions of the Software.
igorsk 0:a405220cf420 30 //*
igorsk 0:a405220cf420 31 //* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
igorsk 0:a405220cf420 32 //* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
igorsk 0:a405220cf420 33 //* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
igorsk 0:a405220cf420 34 //* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
igorsk 0:a405220cf420 35 //* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
igorsk 0:a405220cf420 36 //* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
igorsk 0:a405220cf420 37 //* THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
igorsk 0:a405220cf420 38 //*
igorsk 0:a405220cf420 39 //* =================================================================
igorsk 0:a405220cf420 40 //* See http://scmrtos.sourceforge.net for documentation, latest
igorsk 0:a405220cf420 41 //* information, license and contact details.
igorsk 0:a405220cf420 42 //* =================================================================
igorsk 0:a405220cf420 43 //*
igorsk 0:a405220cf420 44 //******************************************************************************
igorsk 0:a405220cf420 45 //* Ported by Andrey Chuikin, Copyright (c) 2008-2010
igorsk 0:a405220cf420 46
igorsk 0:a405220cf420 47
igorsk 0:a405220cf420 48 #include <scmRTOS.h>
igorsk 0:a405220cf420 49
igorsk 0:a405220cf420 50 using namespace OS;
igorsk 0:a405220cf420 51
igorsk 0:a405220cf420 52 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 53 //
igorsk 0:a405220cf420 54 // OS Process's constructor
igorsk 0:a405220cf420 55 //
igorsk 0:a405220cf420 56 // Performs:
igorsk 0:a405220cf420 57 // * initializing process data;
igorsk 0:a405220cf420 58 // * registering of the process in kernel;
igorsk 0:a405220cf420 59 // * preparing stack frame;
igorsk 0:a405220cf420 60 //
igorsk 0:a405220cf420 61 //
igorsk 0:a405220cf420 62 TBaseProcess::TBaseProcess(TStackItem* Stack, TPriority pr, void (*exec)())
igorsk 0:a405220cf420 63 : StackPointer(Stack)
igorsk 0:a405220cf420 64 , Timeout(0)
igorsk 0:a405220cf420 65 , Priority(pr)
igorsk 0:a405220cf420 66 {
igorsk 0:a405220cf420 67 Kernel.RegisterProcess(this);
igorsk 0:a405220cf420 68
igorsk 0:a405220cf420 69 //---------------------------------------------------------------
igorsk 0:a405220cf420 70 //
igorsk 0:a405220cf420 71 // Prepare Process Stack Frame
igorsk 0:a405220cf420 72 //
igorsk 0:a405220cf420 73 *(--StackPointer) = 0x01000000L; // xPSR
igorsk 0:a405220cf420 74 *(--StackPointer) = reinterpret_cast<dword>(exec); // Entry Point
igorsk 0:a405220cf420 75 StackPointer -= 14; // emulate "push R14,R12,R3,R2,R1,R0,R11-R4"
igorsk 0:a405220cf420 76
igorsk 0:a405220cf420 77 // The code below can be used for debug purpose. In this case comment
igorsk 0:a405220cf420 78 // line above and uncomment block below.
igorsk 0:a405220cf420 79 /*
igorsk 0:a405220cf420 80 *(--StackPointer) = 0xFFFFFFFEL; // R14 (LR) (init value will cause fault if ever used)
igorsk 0:a405220cf420 81 *(--StackPointer) = 0x12121212L; // R12
igorsk 0:a405220cf420 82 *(--StackPointer) = 0x03030303L; // R3
igorsk 0:a405220cf420 83 *(--StackPointer) = 0x02020202L; // R2
igorsk 0:a405220cf420 84 *(--StackPointer) = 0x01010101L; // R1
igorsk 0:a405220cf420 85 *(--StackPointer) = 0x00000000L; // R0
igorsk 0:a405220cf420 86
igorsk 0:a405220cf420 87 // Remaining registers saved on process stack
igorsk 0:a405220cf420 88 *(--StackPointer) = 0x11111111L; // R11
igorsk 0:a405220cf420 89 *(--StackPointer) = 0x10101010L; // R10
igorsk 0:a405220cf420 90 *(--StackPointer) = 0x09090909L; // R9
igorsk 0:a405220cf420 91 *(--StackPointer) = 0x08080808L; // R8
igorsk 0:a405220cf420 92 *(--StackPointer) = 0x07070707L; // R7
igorsk 0:a405220cf420 93 *(--StackPointer) = 0x06060606L; // R6
igorsk 0:a405220cf420 94 *(--StackPointer) = 0x05050505L; // R5
igorsk 0:a405220cf420 95 *(--StackPointer) = 0x04040404L; // R4
igorsk 0:a405220cf420 96 */
igorsk 0:a405220cf420 97 }
igorsk 0:a405220cf420 98 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 99 //
igorsk 0:a405220cf420 100 // Idle Process
igorsk 0:a405220cf420 101 //
igorsk 0:a405220cf420 102 typedef process<prIDLE, scmRTOS_IDLE_PROCESS_STACK_SIZE> TIdleProcess;
igorsk 0:a405220cf420 103
igorsk 0:a405220cf420 104 TIdleProcess IdleProcess;
igorsk 0:a405220cf420 105
igorsk 0:a405220cf420 106 template<> OS_PROCESS void TIdleProcess::Exec()
igorsk 0:a405220cf420 107 {
igorsk 0:a405220cf420 108 for(;;)
igorsk 0:a405220cf420 109 {
igorsk 0:a405220cf420 110 #if scmRTOS_IDLE_HOOK_ENABLE == 1
igorsk 0:a405220cf420 111 IdleProcessUserHook();
igorsk 0:a405220cf420 112 #endif
igorsk 0:a405220cf420 113 }
igorsk 0:a405220cf420 114 }
igorsk 0:a405220cf420 115 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 116 OS_INTERRUPT void OS::SysTick_Handler()
igorsk 0:a405220cf420 117 {
igorsk 0:a405220cf420 118 scmRTOS_ISRW_TYPE ISR;
igorsk 0:a405220cf420 119
igorsk 0:a405220cf420 120 Kernel.SystemTimer();
igorsk 0:a405220cf420 121
igorsk 0:a405220cf420 122 #if scmRTOS_SYSTIMER_NEST_INTS_ENABLE == 0
igorsk 0:a405220cf420 123 DISABLE_NESTED_INTERRUPTS();
igorsk 0:a405220cf420 124 #endif
igorsk 0:a405220cf420 125
igorsk 0:a405220cf420 126 #if scmRTOS_SYSTIMER_HOOK_ENABLE == 1
igorsk 0:a405220cf420 127 SystemTimerUserHook();
igorsk 0:a405220cf420 128 #endif
igorsk 0:a405220cf420 129 }
igorsk 0:a405220cf420 130 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 131