OSDN Git Service

update libMiMic
[mimic/MiMicSDK.git] / lib / src / os / mbedrtos / NyLPC_cThread.cpp
diff --git a/lib/src/os/mbedrtos/NyLPC_cThread.cpp b/lib/src/os/mbedrtos/NyLPC_cThread.cpp
new file mode 100644 (file)
index 0000000..dfd360a
--- /dev/null
@@ -0,0 +1,90 @@
+/*********************************************************************************
+ * PROJECT: MiMic
+ * --------------------------------------------------------------------------------
+ *
+ * This file is part of MiMic
+ * Copyright (C)2011 Ryo Iizuka
+ *
+ * MiMic is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * For further information please contact.
+ *  http://nyatla.jp/
+ *  <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
+ *
+ *********************************************************************************/
+#include "../NyLPC_cThread.h"
+
+#if NyLPC_ARCH==NyLPC_ARCH_MBEDRTOS
+#include "mbed.h"
+#include "rtos.h"
+
+static osPriority prio_table[]={
+    osPriorityNormal,osPriorityHigh};
+
+
+
+static void proc(void const *argument)
+{
+    NyLPC_TcThread_t* t=(NyLPC_TcThread_t*)argument;
+    for(;;){
+        do{
+           Thread::wait(30);// danger wait!
+        }while(NyLPC_TUInt32_isBitOn(t->_sbit,NyLPC_TcThread_BIT_IS_TERMINATED));
+        t->_func(t->_arg);
+        NyLPC_TUInt32_setBit(t->_sbit,NyLPC_TcThread_BIT_IS_TERMINATED);
+    }
+}
+
+
+void NyLPC_cThread_initialize(NyLPC_TcThread_t* i_inst,NyLPC_TInt32 i_stack,NyLPC_TInt32 i_prio)
+{
+    NyLPC_TUInt32_setBit(i_inst->_sbit,NyLPC_TcThread_BIT_IS_TERMINATED);
+    i_inst->_thread=new Thread(proc,i_inst,prio_table[i_prio],i_stack);
+}
+void NyLPC_cThread_finalize(NyLPC_TcThread_t* i_inst)
+{
+    NyLPC_cThread_join(i_inst);
+    delete (Thread*)(i_inst->_thread);
+}
+
+
+void NyLPC_cThread_start(NyLPC_TcThread_t* i_inst,NyLPC_TcThread_ThreadFunc i_func,void* i_param)
+{
+    NyLPC_ArgAssert(i_inst!=NULL);
+    NyLPC_ArgAssert(i_func!=NULL);
+    i_inst->_sbit=0;
+    i_inst->_func=i_func;
+    i_inst->_arg=i_param;
+    return;
+}
+void NyLPC_cThread_join(NyLPC_TcThread_t* i_inst)
+{
+    NyLPC_TUInt32_setBit(i_inst->_sbit,NyLPC_TcThread_BIT_IS_JOIN_REQ);
+    while(!NyLPC_TUInt32_isBitOn(i_inst->_sbit,NyLPC_TcThread_BIT_IS_TERMINATED))
+    {
+        Thread::wait(10);
+    }
+    return;
+}
+void NyLPC_cThread_sleep(NyLPC_TUInt32 i_time_in_msec)
+{
+    //ミリ秒単位で待つ
+    Thread::wait(i_time_in_msec);
+}
+void NyLPC_cThread_yield(void)
+{
+    Thread::yield();
+}
+
+#endif