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 //* PURPOSE: User Suport Library Source
igorsk 0:a405220cf420 8 //*
igorsk 0:a405220cf420 9 //* Version: 3.10
igorsk 0:a405220cf420 10 //*
igorsk 0:a405220cf420 11 //* $Revision: 256 $
igorsk 0:a405220cf420 12 //* $Date:: 2010-01-22 #$
igorsk 0:a405220cf420 13 //*
igorsk 0:a405220cf420 14 //* Copyright (c) 2003-2010, Harry E. Zhurov
igorsk 0:a405220cf420 15 //*
igorsk 0:a405220cf420 16 //* Permission is hereby granted, free of charge, to any person
igorsk 0:a405220cf420 17 //* obtaining a copy of this software and associated documentation
igorsk 0:a405220cf420 18 //* files (the "Software"), to deal in the Software without restriction,
igorsk 0:a405220cf420 19 //* including without limitation the rights to use, copy, modify, merge,
igorsk 0:a405220cf420 20 //* publish, distribute, sublicense, and/or sell copies of the Software,
igorsk 0:a405220cf420 21 //* and to permit persons to whom the Software is furnished to do so,
igorsk 0:a405220cf420 22 //* subject to the following conditions:
igorsk 0:a405220cf420 23 //*
igorsk 0:a405220cf420 24 //* The above copyright notice and this permission notice shall be included
igorsk 0:a405220cf420 25 //* in all copies or substantial portions of the Software.
igorsk 0:a405220cf420 26 //*
igorsk 0:a405220cf420 27 //* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
igorsk 0:a405220cf420 28 //* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
igorsk 0:a405220cf420 29 //* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
igorsk 0:a405220cf420 30 //* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
igorsk 0:a405220cf420 31 //* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
igorsk 0:a405220cf420 32 //* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
igorsk 0:a405220cf420 33 //* THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
igorsk 0:a405220cf420 34 //*
igorsk 0:a405220cf420 35 //* =================================================================
igorsk 0:a405220cf420 36 //* See http://scmrtos.sourceforge.net for documentation, latest
igorsk 0:a405220cf420 37 //* information, license and contact details.
igorsk 0:a405220cf420 38 //* =================================================================
igorsk 0:a405220cf420 39 //*
igorsk 0:a405220cf420 40 //******************************************************************************
igorsk 0:a405220cf420 41
igorsk 0:a405220cf420 42 #include <usrlib.h>
igorsk 0:a405220cf420 43 #include <commdefs.h>
igorsk 0:a405220cf420 44
igorsk 0:a405220cf420 45 using namespace usr;
igorsk 0:a405220cf420 46
igorsk 0:a405220cf420 47 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 48 //
igorsk 0:a405220cf420 49 /// Circular buffer function-member description
igorsk 0:a405220cf420 50 //
igorsk 0:a405220cf420 51 //
igorsk 0:a405220cf420 52 //
igorsk 0:a405220cf420 53 TCbuf::TCbuf(byte* const Address, const byte Size) :
igorsk 0:a405220cf420 54 buf(Address),
igorsk 0:a405220cf420 55 size(Size),
igorsk 0:a405220cf420 56 count(0),
igorsk 0:a405220cf420 57 first(0),
igorsk 0:a405220cf420 58 last(0)
igorsk 0:a405220cf420 59 {
igorsk 0:a405220cf420 60 }
igorsk 0:a405220cf420 61 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 62 bool TCbuf::write(const byte* data, const byte Count)
igorsk 0:a405220cf420 63 {
igorsk 0:a405220cf420 64 if( Count > (size - count) )
igorsk 0:a405220cf420 65 return false;
igorsk 0:a405220cf420 66
igorsk 0:a405220cf420 67 for(byte i = 0; i < Count; i++)
igorsk 0:a405220cf420 68 push(*(data++));
igorsk 0:a405220cf420 69
igorsk 0:a405220cf420 70 return true;
igorsk 0:a405220cf420 71 }
igorsk 0:a405220cf420 72 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 73 void TCbuf::read(byte* data, const byte Count)
igorsk 0:a405220cf420 74 {
igorsk 0:a405220cf420 75 byte N = Count <= count ? Count : count;
igorsk 0:a405220cf420 76
igorsk 0:a405220cf420 77 for(byte i = 0; i < N; i++)
igorsk 0:a405220cf420 78 data[i] = pop();
igorsk 0:a405220cf420 79 }
igorsk 0:a405220cf420 80 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 81 byte TCbuf::get_byte(const byte index) const
igorsk 0:a405220cf420 82 {
igorsk 0:a405220cf420 83 byte x = first + index;
igorsk 0:a405220cf420 84
igorsk 0:a405220cf420 85 if(x < size)
igorsk 0:a405220cf420 86 return buf[x];
igorsk 0:a405220cf420 87 else
igorsk 0:a405220cf420 88 return buf[x - size];
igorsk 0:a405220cf420 89 }
igorsk 0:a405220cf420 90
igorsk 0:a405220cf420 91 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 92 bool TCbuf::put(const byte item)
igorsk 0:a405220cf420 93 {
igorsk 0:a405220cf420 94 if(count == size)
igorsk 0:a405220cf420 95 return false;
igorsk 0:a405220cf420 96
igorsk 0:a405220cf420 97 push(item);
igorsk 0:a405220cf420 98 return true;
igorsk 0:a405220cf420 99 }
igorsk 0:a405220cf420 100 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 101 byte TCbuf::get()
igorsk 0:a405220cf420 102 {
igorsk 0:a405220cf420 103 if(count)
igorsk 0:a405220cf420 104 return pop();
igorsk 0:a405220cf420 105 else
igorsk 0:a405220cf420 106 return 0;
igorsk 0:a405220cf420 107 }
igorsk 0:a405220cf420 108 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 109 //
igorsk 0:a405220cf420 110 /// \note
igorsk 0:a405220cf420 111 /// For internal purposes.
igorsk 0:a405220cf420 112 /// Use this function with care - it doesn't perform free size check.
igorsk 0:a405220cf420 113 //
igorsk 0:a405220cf420 114 void TCbuf::push(const byte item)
igorsk 0:a405220cf420 115 {
igorsk 0:a405220cf420 116 buf[last] = item;
igorsk 0:a405220cf420 117 last++;
igorsk 0:a405220cf420 118 count++;
igorsk 0:a405220cf420 119
igorsk 0:a405220cf420 120 if(last == size)
igorsk 0:a405220cf420 121 last = 0;
igorsk 0:a405220cf420 122 }
igorsk 0:a405220cf420 123 //------------------------------------------------------------------------------
igorsk 0:a405220cf420 124 //
igorsk 0:a405220cf420 125 /// \note
igorsk 0:a405220cf420 126 /// For internal purposes.
igorsk 0:a405220cf420 127 /// Use this function with care - it doesn't perform free size check.
igorsk 0:a405220cf420 128 //
igorsk 0:a405220cf420 129 byte TCbuf::pop()
igorsk 0:a405220cf420 130 {
igorsk 0:a405220cf420 131 byte item = buf[first];
igorsk 0:a405220cf420 132
igorsk 0:a405220cf420 133 count--;
igorsk 0:a405220cf420 134 first++;
igorsk 0:a405220cf420 135 if(first == size)
igorsk 0:a405220cf420 136 first = 0;
igorsk 0:a405220cf420 137
igorsk 0:a405220cf420 138 return item;
igorsk 0:a405220cf420 139 }
igorsk 0:a405220cf420 140 //------------------------------------------------------------------------------