lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-users] uSmartX non-preemptive, stackless, cooperative RTOS and lwI


From: marko.panger
Subject: [lwip-users] uSmartX non-preemptive, stackless, cooperative RTOS and lwIP
Date: Thu, 26 Jan 2006 14:14:09 +0100

Hello all,

I'm about to start porting the lwIP stack on my uSmartX RTOS. It's a 
stack-less, co-operative, non-preemptive, priority based, multitasking RTOS 
with some preemptive primitives. It supports timed pending o semaphores and 
mailboxes although is stack less. For the sake you can drop an eye on 
http://usmartx.sourceforge.net/.

I have already passed through the lwIP sources and documentation. If I 
understand well it can works in two modes. The so called raw api and sequential 
api mode. The raw api mode doesn't require an underlying RTOS, but the latter 
does. The raw API mode should be easy and straight forward to integrate into my 
os.

The sequential API looks a little bit tricky if the os is not-preemptive. If 
you look at the sample code below you can get an idea of how for example 
semaphores are used in my rtos. Basically they require the task to return if 
the resource is not available. The task will be than resumed by a semaphore 
post or a timeout event. Applying this to lwIP would require modification of 
the API calls in such a way that multiple calls of the same API call can be 
made if the semaphore is not available at the moment and than calling the same 
API function with "semaphore" available parameter...

Now I am kindly referring to you for some comments on this implementation. I'm 
also a little bit confused on sequential API calls - which file contains the 
available calls ? Is this api_msg.c, sockets or some other additional file ?

Thanks in advance four you comments !

Regards,
Marko Panger


Sample uSmartX task:
----------------------------------------------------------------------------------
STATUS TSK_SetLed(STATUS ucEvent) {
    static TTSK_State TskState = ACQUIRE_SEM;
    static uint32 AnchorTicks = 0;
   
    switch( TskState ) {
        case ACQUIRE_SEM:
            if( ucEvent == SYS_SEM_TOUT ){
                /* Handle error here */
                return SYS_ERROR;
            }
            /* Semaphore acquired within timeout */
            else if( ucEvent == SYS_SEM ) {
                AnchorTicks = TMR_GetTicks();
                TskState = DO_JOB;   
            }
            else {
                if( SEM_Pend(&LED_SEM, 50) == SYS_OK ) {
                    AnchorTicks = TMR_GetTicks();
                    TskState = DO_JOB;
                }
            }
            break;
           
        case DO_JOB:
            /* Use shared resource for 10 ms*/
            if( TMR_GetTicks() - AnchorTicks > 10 ) {
                SetLed(0);
                SEM_Post(&LED_SEM);
                TskState = ACQUIRE_SEM;
            }
            else {
                SetLed(1);   
            }
            break;
           
        default:
            break;
    }           
    return SYS_OK;   
}
----------------------------------------------------------------------------------








reply via email to

[Prev in Thread] Current Thread [Next in Thread]