это я заболел нонче, и хочется все RTOS подвести под один знаменатель. Пока удалось совместить TN-kernel и Win-thread. Для AVR и других слабых архитектур с отсутвием команд блочного чтения-записи ( на стековые операции ) вот на примере protohtreads
и вывел свою вариацию. На данный момент в моей nanoOS! раздражает RTOS_OP_FIRST, RTOS_OP, RTOS_OP_LAST. В protothreads разражает отличительные особенности синтаксиса от вытесняющих РТОС. Но вернусь к обобщению операционок. Вот так пока получилось[+]
#ifndef RTOS_CMN_H
#define RTOS_CMN_H
#include "globals.h"
#ifdef __nOS__
#define RTOS_INCLUDE <rtos\nOS\scheduler.h>
#define RTOS_TASK Cnos_task
#define RTOS_OP_FIRST default:
#define RTOS_OP_LAST case __LINE__: task_set_state( 0 ); return;
#define RTOS_OP case __LINE__:
#define RTOS_SLEEP(time) sleep( time / SYSTICK_MS ); task_set_state( __LINE__ + 2 ); return
#define RTOS_TASK_CREATE(name,func,priority,stack_head,stack_size,param,attr) task_add(&name,func,param)
#define RTOS_TASK_LOOP switch( task_get_state() )
#endif
#ifdef TNKERNEL
#define RTOS_INCLUDE <rtos/TN_Kernel/tn.h>
#define RTOS_TASK TN_TCB
#define RTOS_SLEEP(time) tn_task_sleep(time)
#define RTOS_TASK_CREATE(name,func,priority,stack_head,stack_size,param,attr) tn_task_create(&name,func,priority,stack_head,stack_size,param,attr)
#define RTOS_TASK_RETPARAM void
#define RTOS_TASK_RETVAL return
#define RTOS_TASK_DELETE(name) tn_task_delete(&name)
#define RTOS_TASK_EN
#define RTOS_TASK_LOOP while( true )
#define RTOS_TASK_EN_VAR
#define RTOS_MUTEX TN_MUTEX
#define RTOS_MUTEX_IS_TOUT bla
#define RTOS_MUTEX_IS_OK bla
#define RTOS_MUTEX_CREATE_OK(name,retval) (retval == TERR_NO_ERR)
#define RTOS_MUTEX_CREATE(name,result) result=tn_mutex_create(&name,TN_MUTEX_ATTR_INHERIT,NULL)
#define RTOS_MUTEX_LOCK(name,tout) tn_mutex_lock(&name,tout)
#define RTOS_MUTEX_LOCK_INFINITE(name) tn_mutex_lock(&name,TN_WAIT_INFINITE)
#define RTOS_MUTEX_UNLOCK(name) tn_mutex_unlock(&name)
#define RTOS_MUTEX_DELETE(name) tn_mutex_delete(&name)
#endif
#ifdef __IBMPC__
// beginthreadex & endthreadex examples: http://msdn.micros …/library/kdzttdcb.aspx
#define RTOS_INCLUDE <process.h>
#define RTOS_TASK HANDLE
#define RTOS_SLEEP(time) Sleep(time)
#define RTOS_TASK_CREATE(name,func,priority,stack_head,stack_size,param,attr) name=(HANDLE)_beginthreadex(0,stack_size,func,param,0,NULL)
#define RTOS_TASK_RETPARAM unsigned __stdcall
#define RTOS_TASK_RETVAL {_endthreadex(0); return 0;}
#define RTOS_TASK_DELETE(name) terminate = true; WaitForSingleObject(name,1000); CloseHandle(name);
#define RTOS_TASK_EN terminate = false
#define RTOS_TASK_LOOP while( !terminate )
#define RTOS_TASK_EN_VAR bool terminate;
#define RTOS_MUTEX HANDLE
#define RTOS_MUTEX_IS_TOUT WAIT_TIMEOUT
#define RTOS_MUTEX_IS_OK WAIT_OBJECT_0
#define RTOS_MUTEX_CREATE_OK(name,retval) (name != 0)
#define RTOS_MUTEX_CREATE(name,result) name=CreateMutex(NULL,false,NULL)
#define RTOS_MUTEX_LOCK(name,tout) WaitForSingleObject(name,tout)
#define RTOS_MUTEX_LOCK_INFINITE(name) WaitForSingleObject(name,INFINITE)
#define RTOS_MUTEX_UNLOCK(name) ReleaseMutex(name)
#define RTOS_MUTEX_DELETE(name) CloseHandle(name)
#endif
#endif