Hi everybody,
as you guess, I'm looking for some help... Indeed although I am a newbie in 
Linux system programming, I have to adapt a ppc405 VxWorks application to a 
Linux Montavista Hardhat application...
My problem is the following ; with VxWorks, a task is defined like that:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     It is often essential to organize applications into independent, though 
cooperating, programs. Each of these programs, while executing, is called a 
task. In VxWorks, tasks have immediate, shared access to most system resources, 
while also maintaining enough separate context to maintain individual threads 
of control.
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

In my original application, there is a VxWorks routine called taskSpawn(). 
Below you'll find its man pages:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
NAME

taskSpawn( ) - spawn a task
SYNOPSIS

int taskSpawn
    (
    char *  name,             /* name of new task (stored at pStackBase) */
    int     priority,         /* priority of new task */
    int     options,          /* task option word */
    int     stackSize,        /* size (bytes) of stack needed plus name */
    FUNCPTR entryPt,          /* entry point of new task */
    int     arg1,             /* 1st of 10 req'd task args to pass to func */
    int     arg2,
    int     arg3,
    int     arg4,
    int     arg5,
    int     arg6,
    int     arg7,
    int     arg8,
    int     arg9,
    int     arg10
    )

DESCRIPTION

This routine creates and activates a new task with a specified priority and 
options and returns a system-assigned ID. See taskInit( ) and taskActivate( ) 
for the building blocks of this routine.

A task may be assigned a name as a debugging aid. This name will appear in 
displays generated by various system information facilities such as i( ). The 
name may be of arbitrary length and content, but the current VxWorks convention 
is to limit task names to ten characters and prefix them with a "t". If name is 
specified as NULL, an ASCII name will be assigned to the task of the form "tn" 
where n is an integer which increments as new tasks are spawned.

The only resource allocated to a spawned task is a stack of a specified size 
stackSize, which is allocated from the system memory partition. Stack size 
should be an even integer. A task control block (TCB) is carved from the stack, 
as well as any memory required by the task name. The remaining memory is the 
task's stack and every byte is filled with the value 0xEE for the checkStack( ) 
facility. See the manual entry for checkStack( ) for stack-size checking aids.

The entry address entryPt is the address of the "main" routine of the task. The 
routine will be called once the C environment has been set up. The specified 
routine will be called with the ten given arguments. Should the specified main 
routine return, a call to exit( ) will automatically be made.

Note that ten (and only ten) arguments must be passed for the spawned function.

[etc...]
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

This routine is used as that in my program:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if (nbEnet > 0)
         rc = taskSpawn("serverA", PTYS, OPT, STACK, (FUNCPTR) tcpServer, 
PortA, (int) myconfig, 0,0,0,0,0,0,0,0);
      if (nbEnet > 1)
         rc = taskSpawn("serverB", PTYS, OPT, STACK, (FUNCPTR) tcpServer, 
PortB, (int) myconfig, 0,0,0,0,0,0,0,0);
      if (nbEnet > 2)
         rc = taskSpawn("serverC", PTYS, OPT, STACK, (FUNCPTR) tcpServer, 
PortC, (int) myconfig, 0,0,0,0,0,0,0,0);
      if (nbEnet > 3)
         rc = taskSpawn("serverD", PTYS, OPT, STACK, (FUNCPTR) tcpServer, 
PortD, (int) myconfig, 0,0,0,0,0,0,0,0);
      if (nbEnet > 4)
         rc = taskSpawn("serverE", PTYS, OPT, STACK, (FUNCPTR) tcpServer, 
PortE, (int) myconfig, 0,0,0,0,0,0,0,0);
      if (nbEnet > 5)
         rc = taskSpawn("serverF", PTYS, OPT, STACK, (FUNCPTR) tcpServer, 
PortF, (int) myconfig, 0,0,0,0,0,0,0,0);
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

As you can see, it is really different from the fork() routine. The point 
taskSpawn() is like we would ask a different programm to call the function 
tcpServer() with a context of execution separated.
So is there a routine or a way that allows that with Linux ?

tks a lot : j?r?mie

** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/



Reply via email to