реклама на сайте
подробности

 
 
> попытка обобщить обертками всякие RTOS, поднадоел уже зоопарк
megajohn
сообщение Jul 2 2013, 13:48
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Приходится прыгать по разным железкам, и у каждой своя Оська.
Поднадоело это, и решил сделать обертки
пока что реализовано для 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 ); }

для 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)


и т.д.

и софт становится мультиплатформенным
Код
#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 );
}


ну и пример для пересылки сообщений
Код
#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 );
}


собсвенно, как всегда есть шанс изобрести велосипед.
Поэтому спрошу - были ли ли у вас подобные идеи и чем все закончилось.
Результаты своих трудов прикладываю

P.S. с таким обобщенным интерфейсом стало приятнее программировать под WinApi
Прикрепленные файлы
Прикрепленный файл  rtos.rar ( 5.93 килобайт ) Кол-во скачиваний: 10
 


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th July 2025 - 09:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01351 секунд с 7
ELECTRONIX ©2004-2016