Поднадоело это, и решил сделать обертки
пока что реализовано для TnKernel, частично под TI SYS/BIOS, SmartDSP, WinAPI
в чем суть.
Код
#define TASK_CREATE(handle,func,priority,stack_size,param,attr)
из названий все понятнодля TnKernel будет реализовано в
Код
#define TASK_CREATE(handle,func,priority,stack_size,param,attr)\
{ static unsigned int stack_##handle[stack_size]; \
int ret = tn_task_create(&handle,func,priority,&stack_##handle[stack_size-1],stack_size,param,(attr & SUSPEND_FLAG)?TN_TASK_IDLE:TN_TASK_START_ON_CREATION);\
ASSERT( ret == TERR_NO_ERR ); }
{ static unsigned int stack_##handle[stack_size]; \
int ret = tn_task_create(&handle,func,priority,&stack_##handle[stack_size-1],stack_size,param,(attr & SUSPEND_FLAG)?TN_TASK_IDLE:TN_TASK_START_ON_CREATION);\
ASSERT( ret == TERR_NO_ERR ); }
для WinApi будет реализовано в
Код
#define TASK_CREATE(name,func,priority,stack_size,param,attr) \
static Swintask tsk##name;\
tsk##name.handle=(HANDLE)_beginthreadex(0,stack_size,func,param,(attr & SUSPEND_FLAG) ? /*CREATE_SUSPEND*/0:0,&tsk##name.threadID );terminate=false;\
name=&tsk##name;\
strcpy_s( tsk##name.caption, 20, #name );\
MSG msg;\
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
static Swintask tsk##name;\
tsk##name.handle=(HANDLE)_beginthreadex(0,stack_size,func,param,(attr & SUSPEND_FLAG) ? /*CREATE_SUSPEND*/0:0,&tsk##name.threadID );terminate=false;\
name=&tsk##name;\
strcpy_s( tsk##name.caption, 20, #name );\
MSG msg;\
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
и т.д.
и софт становится мультиплатформенным
Код
#include <rtos\rtos_cmn.h>
TASK_HANDLE my_task;
//------------------------------------------------------------------------------
TASK_RETPARAM my_func( void* in_arg )
{
TASK_LOOP
{
...
ToDo
...
SLEEP( 100 );
}
TASK_RETVAL;
}
//------------------------------------------------------------------------------
void app( void )
{
TASK_CREATE( my_task, my_func, 12, 1000, 0, START_FLAG );
TASK_DELETE( my_task );
}
TASK_HANDLE my_task;
//------------------------------------------------------------------------------
TASK_RETPARAM my_func( void* in_arg )
{
TASK_LOOP
{
...
ToDo
...
SLEEP( 100 );
}
TASK_RETVAL;
}
//------------------------------------------------------------------------------
void app( void )
{
TASK_CREATE( my_task, my_func, 12, 1000, 0, START_FLAG );
TASK_DELETE( my_task );
}
ну и пример для пересылки сообщений
Код
#include <rtos\rtos_cmn.h>
TASK_HANDLE task_send, task_recv;
QUEUE_HANDLE que;
//------------------------------------------------------------------------------
TASK_RETPARAM send_func( void* in_arg )
{
TASK_LOOP
{
QUEUE_RESULT result;
void* ptr = MALLOC( ... );
...
ToDo
...
QUEUE_PUSH_INFINITE( que, ptr, result );
}
TASK_RETVAL;
}
//------------------------------------------------------------------------------
TASK_RETPARAM recv_func( void* in_arg )
{
TASK_LOOP
{
QUEUE_RESULT result;
void* ptr;
QUEUE_POP_INFINITE( que, &ptr, result );
if( QUEUE_POP_IS_SUCCESS( result ) )
{
...
ToDo
...
printf( "%s\n", ptr );
FREE( ptr );
}
}
TASK_RETVAL;
}
//------------------------------------------------------------------------------
void app( void )
{
QUEUE_RESULT result;
QUEUE_CREATE( que, 10, result );
ASSERT( QUEUE_CREATE_IS_SUCCESS( result ) );
TASK_CREATE( task_send, send_func, 12, 1000, 0, START_FLAG );
TASK_CREATE( task_recv, recv_func, 12, 1000, 0, START_FLAG );
}
TASK_HANDLE task_send, task_recv;
QUEUE_HANDLE que;
//------------------------------------------------------------------------------
TASK_RETPARAM send_func( void* in_arg )
{
TASK_LOOP
{
QUEUE_RESULT result;
void* ptr = MALLOC( ... );
...
ToDo
...
QUEUE_PUSH_INFINITE( que, ptr, result );
}
TASK_RETVAL;
}
//------------------------------------------------------------------------------
TASK_RETPARAM recv_func( void* in_arg )
{
TASK_LOOP
{
QUEUE_RESULT result;
void* ptr;
QUEUE_POP_INFINITE( que, &ptr, result );
if( QUEUE_POP_IS_SUCCESS( result ) )
{
...
ToDo
...
printf( "%s\n", ptr );
FREE( ptr );
}
}
TASK_RETVAL;
}
//------------------------------------------------------------------------------
void app( void )
{
QUEUE_RESULT result;
QUEUE_CREATE( que, 10, result );
ASSERT( QUEUE_CREATE_IS_SUCCESS( result ) );
TASK_CREATE( task_send, send_func, 12, 1000, 0, START_FLAG );
TASK_CREATE( task_recv, recv_func, 12, 1000, 0, START_FLAG );
}
собсвенно, как всегда есть шанс изобрести велосипед.
Поэтому спрошу - были ли ли у вас подобные идеи и чем все закончилось.
Результаты своих трудов прикладываю
P.S. с таким обобщенным интерфейсом стало приятнее программировать под WinApi