T-Kernel/OS Functions

This chapter describes details of the system calls provided by T-Kernel Operating System (T-Kernel/OS).

Task Management Functions

Task management functions are functions that directly manipulate or reference task states. Functions are provided for creating and deleting a task, for task starting and exit, changing task priority, and referencing task state. A task is an object identified by an ID number called a task ID. Task states and scheduling rules are explained in the Section called Task States and Scheduling Rules in the Chapter called T-Kernel Concepts.

For control of execution order, a task has a base priority and current priority. When simply "task priority" is mentioned, this means the current priority. The base priority of a task is initialized to the startup priority when a task is started. If the mutex function is not used, the task current priority is always identical to its base priority. For this reason, the current priority immediately after a task is started is the task startup priority. When the mutex function is used, the current priority is set as discussed in the Section called Mutex.

The kernel does not perform processing for freeing of resources acquired by a task (semaphore resources, memory blocks, etc.) upon task exit, other than mutex unlocking. Freeing of task resources is the responsibility of the application.

tk_cre_tsk - Create Task

C Language Interface

#include <tk/tkernel.h>

ID tskid = tk_cre_tsk (CONST T_CTSK *pk_ctsk );

Parameter

CONST T_CTSK* pk_ctsk Packet to Create TaskInformation about task creation

pk_ctsk Detail:

void* exinf Extended InformationExtended information
ATR tskatr Task AttributeTask attribute
FP task Task Start AddressTask start address
PRI itskpri Initial Task PriorityInitial task priority
INT stksz Stack SizeStack size (in bytes)
INT sstksz System Stack SizeSystem stack size (in bytes)
void* stkptr User Stack PointerUser stack pointer
void* uatb Address of Task Space Page TableTask space page table
INT lsid Logical Space IDLogical space ID
ID resid Resource IDResource ID
UB dsname[8] DS Object nameDS object name
(Other implementation-dependent parameters may be added beyond this point.)

Return Parameter

ID tskid Task IDTask ID
orError CodeError code

Error Code

E_NOMEM Insufficient memory (memory for control block or user stack cannot be allocated)
E_LIMIT Number of tasks exceeds the system limit
E_RSATR Reserved attribute (tskatr is invalid or cannot be used), or the specified coprocessor does not exist
E_NOSPT Unsupported function (when TA_USERSTACK or TA_TASKSPACE is not supported)
E_PAR Parameter error
E_ID Invalid resource ID (resid)
E_NOCOP The specified coprocessor cannot be used (not installed, or abnormal operation detected)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Creates a task, assigning to it a task ID number. This system call allocates a TCB (Task Control Block) to the created task and initializes it based on itskpri, task, stksz and other parameters.

After the task is created, it is initially in DORMANT state.

itskpri specifies the initial priority at the time the task is started. Task priority values are specified from 1 to 140, with the smaller numbers indicating higher priority.

exinf can be used freely by the user to insert miscellaneous information about the task. The information set here is passed to the task as startup parameter information and can be referred to by calling tk_ref_tsk. If a larger area is needed for indicating user information, or if the information may need to be changed after the task is created, this can be done by allocating separate memory for this purpose and putting the memory packet address in exinf. The kernel pays no attention to the contents of exinf.

tskatr indicates system attributes in its lower bits and implementation-dependent attributes in its higher bits. The system attribute part of tskatr is as follows.

tskatr := (TA_ASM || TA_HLNG)
   | [TA_SSTKSZ] | [TA_USERSTACK] | [TA_TASKSPACE] | [TA_RESID] | [TA_DSNAME]
   | (TA_RNG0 || TA_RNG1 || TA_RNG2 || TA_RNG3)
   | [TA_COP0] | [TA_COP1] | [TA_COP2] | [TA_COP3] | [TA_FPU]

TA_ASM Indicates that the task is written in assembly language
TA_HLNG Indicates that the task is written in high-level language
TA_SSTKSZ Specifies the system stack size
TA_USERSTACK Points to the user stack
TA_TASKSPACE Points to the task space
TA_RESID Specifies the resource group to which the task belongs
TA_DSNAME Specifies DS object name
TA_RNGn Indicates that the task runs at protection level n
TA_COPn Specifies use of the nth coprocessor (including floating point coprocessor or DSP)
TA_FPU Specifies use of a floating point coprocessor (when a coprocessor specified in TA_COPn is a general-purpose FPU particularly for floating point processing and not dependent on the CPU)

The function for specifying implementation-dependent attributes can be used, for example, to specify that a task is subject to debugging. One use of the remaining system attribute fields is for indicating multiprocessor attributes in the future.

#define TA_ASM          0x00000000      /* Task in Assembly Language */
#define TA_HLNG         0x00000001      /* Task in High-level language */
#define TA_SSTKSZ       0x00000002      /* System stack size */
#define TA_USERSTACK    0x00000004      /* User stack pointer */
#define TA_TASKSPACE    0x00000008      /* Task space */
#define TA_RESID        0x00000010      /* Task resource group */
#define TA_DSNAME       0x00000040      /* DS object name */
#define TA_RNG0         0x00000000      /* Run at protection level 0 */
#define TA_RNG1         0x00000100      /* Run at protection level 1 */
#define TA_RNG2         0x00000200      /* Run at protection level 2 */
#define TA_RNG3         0x00000300      /* Run at protection level 3 */
#define TA_COP0         0x00001000      /* Use ID=0 coprocessor */
#define TA_COP1         0x00002000      /* Use ID=1 coprocessor */
#define TA_COP2         0x00004000      /* Use ID=2 coprocessor */
#define TA_COP3         0x00008000      /* Use ID=3 coprocessor */

When TA_HLNG is specified, starting the task jumps to the task address not directly but by going through a high-level language environment configuration program (high-level language support routine). The task takes the following form in this case.

void task( INT stacd, void *exinf )
{
        /*
                (processing)
        */

        tk_ext_tsk(); or tk_exd_tsk(); /* Exit task */
}

The startup parameters passed to the task include the task startup code stacd specified in tk_sta_tsk, and the extended information exinf specified in tk_cre_tsk.

The task cannot (must not) be terminated by a simple return from the function, otherwise the operation will be indeterminate (implementation-dependent).

The form of the task when the TA_ASM attribute is specified in implementation-dependent, but stacd and exinf must be passed as startup parameters.

The task runs at the protection level specified in the TA_RNGn attribute. When a system call or extended SVC is called, the protection level goes to 0, then goes back to its original level upon return from the system call or extended SVC.

Each task has two stack areas, a system stack and user stack. The user stack is used at the protection level specified in TA_RNGn while the system stack is used at protection level 0. When the calling of a system call or extended SVC causes the protection level to change, the stack is also switched.

Note that a task running at TA_RNG0 does not switch protection levels, so there is no stack switching either. When TA_RNG0 is specified, the combined total of the user stack size and system stack size is the size of one stack, employed as both a user stack and system stack.

When TA_SSTKSZ is specified, sstksz is valid. If TA_SSTKSZ is not specified, sstksz is ignored and the default size applies.

When TA_USERSTACK is specified, stkptr is valid. In this case a user stack is not provided by the OS, but must be allocated by the caller. stksz must be set to 0. If TA_USERSTACK is not specified, stkptr is ignored. Note that if TA_RNG0 is set, TA_USERSTACK cannot be specified. E_PAR occurs if TA_RNG0 and TA_USERSTACK are specified at the same time.

When TA_TASKSPACE is specified, uatb and lsid are valid and are set as task space. If TA_TASKSPACE is not specified, uatb and lsid are ignored and task space is undefined. During the time task space is undefined, only system space can be accessed; access to task (user) space is not allowed. Irrespective of TA_TASKSPACE specification, task space can be changed after a task is created. Note that when task space is changed, in no case does it revert to the task space set at task creation, even when the task returns to DORMANT state, but the task always uses the most recently set task space.

When TA_RESID is specified, resid is valid and its resource group (see the Section called Subsystem Management Functions) is specified as the resource group to which the task belongs. If TA_RESID is not specified, resid is ignored and the task belongs to the system resource group. Note that if the resource group of a task is changed, in no case does it revert to the resource group set at task creation, even when the task returns to DORMANT state, but the task always retains the most recently set resource group (See tk_cre_res).

When TA_DSNAME is specified, dsname is valid and specifies the DS object name. DS object name is used to identify objects by debugger, and it is handled only by T-Kernel/DS API, td_ref_dsname and td_set_dsname. For more details, see the description of td_ref_dsname and td_set_dsname. If TA_DSNAME is not specified, dsname is ignored. Then td_ref_dsname and td_set_dsname return E_OBJ error.

Additional Notes

A task runs either at the protection level set in TA_RNGn or at protection level 0. For example, a task for which TA_RNG3 is specified in no case runs at protection level 1 or 2.

In a system with separate interrupt stack, interrupt handlers also use the system stack. An interrupt handler runs at protection level 0.

The system stack default size is decided taking into account the amount taken up by system call execution and, in a system with separate interrupt stack, the amount used by interrupt handlers.

The system stack is system space resident memory used at protection level 0. If TA_USERSTACK is not specified, the user stack is system space resident memory used at the protection level specified in the TA_RNGn attribute. If TA_USERSTACK is specified, the user stack memory attributes are as specified by the caller of this system call. Task space may be made nonresident memory.

The definition of TA_COPn is dependent on the CPU and other hardware and is not portable.

TA_FPU is provided as a portable notation method only for the definition in TA_COPn of a floating point coprocessor. If, for example, the floating point coprocessor is TA_COP0, then TA_FPU = TA_COP0. If there is no particular need to specify the use of a coprocessor for floating point operations, TA_FPU = 0 is set.

Even in a system without an MMU, for the sake of portability all attributes including TA_RNGn must be accepted. It is possible, for example, to handle all TA_RNGn as equivalent to TA_RNG0, but error must not be returned.

In the case of TA_USERSTACK and TA_TASKSPACE, however, E_NOSPT may be returned, since there are many implementations where these cannot be supported without an MMU.

tk_del_tsk - Delete Task

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_del_tsk (ID tskid );

Parameter

ID tskid Task IDTask ID

Return Parameter

ER ercd Error CodeError Code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Invalid object state (the task is not in DORMANT state)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Deletes the task specified in tskid.

This system call changes the state of the task specified in tskid from DORMANT state to NONEXISTENT state (no longer exists in the system), releasing the TCB and stack area that were assigned to the task. The task ID number is also released. When this system call is issued for a task not in DORMANT state, error code E_OBJ is returned.

This system call cannot specify the invoking task. If the invoking task is specified, error code E_OBJ is returned since the invoking task is not in DORMANT state. The invoking task is deleted not by this system call but by the tk_exd_tsk system call.

tk_sta_tsk - Start Task

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_sta_tsk (ID tskid , INT stacd );

Parameter

ID tskid Task IDTask ID
INT stacd Task Start CodeTask start code

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Invalid object state (the task is not in DORMANT state)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESYES

Description

Starts the task specified in tskid. This system call changes the state of the specified task from DORMANT state to READY state.

Parameters to be passed to the task when it starts can be set in stacd. These parameters can be referred to from the started task, enabling use of this feature for simple message passing.

The task priority when it starts is the task startup priority (itskpri) specified when the started task was created.

Start requests by this system call are not queued. If this system call is issued while the target task is in a state other than DORMANT state, the system call is ignored and error code E_OBJ is returned to the calling task.

tk_ext_tsk - Exit Task

C Language Interface

#include <tk/tkernel.h>

void tk_ext_tsk ( void );

Return Parameter

Does not return to the context issuing the system call.

Error Code

The following kind of error may be detected, but no return is made to the context issuing the system call even if the error is detected. For this reason the error code cannot be passed directly as a system call return parameter. The behavior in case an error occurs is implementation-dependent.

E_CTX Context error (issued from task-independent portion, or in dispatch disabled state)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Exits the invoking task normally and changes its state to DORMANT state.

Additional Notes

When a task terminates by tk_ext_tsk, the resources acquired by the task up to that time (memory blocks, semaphores, etc.) are not automatically freed. The user is responsible for releasing such resources before the task exits.

tk_ext_tsk is a system call that does not return to the context from which it was called. Even if an error code is returned when an error of some kind is detected, normally no error checking is performed in the context from which the system call was invoked, leaving the possibility that the program will behave in an unexpected manner. For this reason these system calls do not return even if error is detected.

As a rule, the task priority and other information included in the TCB is reset when the task returns to DORMANT state. If, for example, the task priority is changed by tk_chg_pri and later terminated by tk_ext_tsk, the task priority reverts to the startup priority (itskpri) specified by tk_cre_tsk at startup. It does not keep the task priority in effect at the time tk_ext_tsk was executed.

System calls that do not return to the calling context are those named tk_ret_??? or tk_ext_??? (tk_exd_???).

tk_exd_tsk - Exit and Delete Task

C Language Interface

#include <tk/tkernel.h>

void tk_exd_tsk ( void );

Return Parameter

Does not return to the context issuing the system call.

Error Code

The following kind of error may be detected, but no return is made to the context issuing the system call even if the error is detected. For this reason the error code cannot be passed directly as a system call return parameter. The behavior in case an error occurs is implementation-dependent.

E_CTX Context error (issued from task-independent portion, or in dispatch disabled state)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Terminates the invoking task normally and also deletes it. This system call changes the state of the invoking task to NON-EXISTENT state (no longer exists in the system).

Additional Notes

When a task terminates by tk_exd_tsk, the resources acquired by the task up to that time (memory blocks, semaphores, etc.) are not automatically freed. The user is responsible for releasing such resources before the task exits.

tk_exd_tsk is a system call that does not return to the context from which it was called. Even if an error code is returned when an error of some kind is detected, normally no error checking is performed in the context from which the system call was invoked, leaving the possibility that the program will behave in an unexpected manner. For this reason these system calls do not return even if error is detected.

tk_ter_tsk - Terminate Task

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_ter_tsk (ID tskid );

Parameter

ID tskid Task IDTask ID

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Invalid object state (the target task is in DORMANT state or is the invoking task)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Forcibly terminates the task specified in tskid. This system call changes the state of the target task specified in tskid to DORMANT state.

Even if the target task was in the waiting state (including SUSPENDED state), the waiting state is released and the task is terminated. If the target task was in some kind of queue (semaphore wait, etc.), executing tk_ter_tsk results in its removal from the queue.

This system call cannot specify the invoking task. If the invoking task is specified, error code E_OBJ is returned.

The relationships between target task states and the results of executing tk_ter_tsk are summarized in Table 1.

Table 1. Target Task State and Execution Result (tk_ter_tsk)

Target Task State tk_ter_tsk ercd Return Value (processing)
Run state (RUNNING or READY) (not for invoking task) E_OK Forced termination
Running state (RUNNING) (invoking task) E_OBJ No operation
Waiting state (WAITING) E_OK Forced termination
Suspended state (SUSPENDED) E_OK Forced termination
Waiting-suspended state (WAITING-SUSPENDED) E_OK Forced termination
Dormant state (DORMANT) E_OBJ No operation
Non-existent state (NON-EXISTENT) E_NOEXS No operation

Additional Notes

When a task is terminated by tk_ter_tsk, the resources acquired by the task up to that time (memory blocks, semaphores, etc.) are not automatically freed. The user is responsible for releasing such resources before the task is terminated.

As a rule, the task priority and other information included in the TCB is reset when the task returns to DORMANT state. If, for example, the task priority is changed by tk_chg_pri and later terminated by tk_ter_tsk, the task priority reverts to the startup priority (itskpri) that is specified by tk_cre_tsk at startup. The task priority at task termination by tk_ter_tsk is not used after the task is restarted by tk_sta_tsk.

Forcible termination of another task is intended for use only by a debugger or a few other tasks closely related to the OS. As a rule, this system call is not to be used by ordinary applications or middleware, for the following reason.

Forced termination occurs regardless of the running state of the target task. If, for example, a task were forcibly terminated while the task was calling a middleware function, the task would terminate right while the middleware was executing. If such a situation were allowed, normal operation of the middleware could not be guaranteed.

This is an example of how task termination should not be allowed when the task status (what it is executing) is unknown. Ordinary applications therefore must not use the forcible termination function.

tk_chg_pri - Change Task Priority

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_chg_pri (ID tskid , PRI tskpri );

Parameter

ID tskid Task IDTask ID
PRI tskpri Task PriorityTask priority

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (tskpri is invalid or cannot be used)
E_ILUSE Illegal use (upper priority limit exceeded)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Changes the base priority of the task specified in tskid to the value specified in tskpri. The current priority of the task also changes as a result.

Task priority values are specified from 1 to 140, with the smaller numbers indicating higher priority.

When TSK_SELF (= 0) is specified in tskid, the invoking task is the target task. Note, however, that when tskid=TSK_SELF is specified in a system call issued from a task-independent portion, error code E_ID is returned. When TPRI_INI (= 0) is specified as tskpri, the target task base priority is changed to the initial priority when the task was started (itskpri).

A priority changed by this system call remains valid until the task is terminated. When the task reverts to DORMANT state, the task priority before its exit is discarded, with the task again assigned to the initial priority when the task was started (itskpri). However, the priority changed in DORMANT state is valid. The next time the task is started, it has the new initial priority.

If as a result of this system call execution the target task current priority matches the base priority (this condition is always met when the mutex function is not used), processing is as follows.

If the target task is in a run state, the task precedence changes according to its priority. The target task has the lowest precedence among tasks of the same priority after the change.

If the target task is in some kind of priority-based queue, the order in that queue changes in accordance with the new task priority. Among tasks of the same priority after the change, the target task is queued at the end.

If the target task has locked a TA_CEILING attribute mutex or is waiting for a lock, and the base priority specified in tskpri is higher than any of the ceiling priorities, error code E_ILUSE is returned.

Additional Notes

In some cases when this system call results in a change in the queued order of the target task in a task priority-based queue, it may be necessary to release the wait state of another task waiting in that queue (in a message buffer send queue, or in a queue waiting to acquire a variable-size memory pool).

In some cases when this system call results in a base priority change while the target task is waiting for a mutex lock with TA_INHERIT dynamic priority inheritance processing may be necessary.

When a mutex function is not used and the system call is issued specifying the invoking task as the target task, setting the new priority to the base priority of the invoking task, the order of execution of the invoking task becomes the lowest among tasks of the same priority. This system call can therefore be used to relinquish execution privilege.

tk_chg_slt - Change Task Slice Time

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_chg_slt (ID tskid , RELTIM slicetime );

Parameter

ID tskid Task IDTask ID
RELTIM slicetime Slice TimeSlice Time (in ms)

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid slicetime)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Changes the slice time of the task specified in tskid to the value specified in slicetime.

The slice time function is used for round robin scheduling of tasks. When a task runs continuously for the length of time specified in slicetime or longer, its precedence is switched to the lowest among tasks of the same priority, automatically yielding the execution privilege to the next task.

Setting slicetime = 0 indicates unlimited time, and the task does not automatically yield execution privilege. When a task is created, by default it is set to slicetime = 0.

The invoking task can be specified by setting tskid = TSK_SELF = 0. Note, however, that when tskid = TSK_SELF = 0 is specified in a system call issued from a task-independent portion, error code E_ID is returned.

The slice time as changed by this system call remains valid until the task is terminated. When the task reverts to DORMANT state, the slice time before termination is discarded, and the value at the time of task creation (slicetime = 0) is assigned. However, the slice time changed in DORMANT state is valid. The next time the task is started, the new slice time is applied.

Additional Notes

The time duration while execution privilege is preempted by a higher-priority task does not count in the continuous run time; moreover, even if execution privilege is preempted by a higher-priority task, the run time is not regarded as disrupted. In other words, the time duration while execution privilege is preempted by a higher-priority task is ignored for the purposes of counting run time.

If the specified task is the only one running at its priority, the slice time is effectively meaningless and the task runs continuously.

If a task of slicetime = 0 is included in tasks of the same priority, as soon as that task obtains execution right, round robin scheduling is stopped.

The method of counting run time is implementation-dependent, but does not need to be especially precise. In fact, applications should not expect very high precision.

tk_chg_slt_u - Change Task Slice Time (in microseconds)

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_chg_slt_u (ID tskid , RELTIM_U slicetime_u );

Parameter

ID tskid Task IDTask ID
RELTIM_U slicetime_u Slice TimeSlice Time (in microseconds)

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid slicetime_u)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

This system call takes 64-bit slicetime_u in microseconds instead of the parameter slicetime of tk_chg_slt.

The specification of this system call is same as that of tk_chg_slt, except that the parameter is replaced with slicetime_u. For more details, see the description of tk_chg_slt.

Difference from T-Kernel 1.0

This system call was added in T-Kernel 2.0.

tk_get_tsp - Get Task Space

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_get_tsp (ID tskid , T_TSKSPC *pk_tskspc );

Parameter

ID tskid Task IDTask ID
T_TSKSPC* pk_tskspc Packet of Task SpacePointer to the area to return the task space information

Return Parameter

ER ercd Error CodeError code

pk_tskspc Detail:

void* uatb Address of Task Space Page TableTask space page table address
INT lsid Logical Space IDTask space ID (logical space ID)

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid pk_tskspc)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Gets the current task space information for the task specified in tskid.

The invoking task can be specified by setting tskid = TSK_SELF = 0. Note, however, that when tskid = TSK_SELF = 0 is specified in a system call issued from a task-independent portion, error code E_ID is returned.

Additional Notes

The precise meaning of pk_tskspc (uatb, lsid) is implementation-dependent, but the above definitions should be followed as much as possible.

tk_set_tsp - Set Task Space

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_set_tsp (ID tskid , CONST T_TSKSPC *pk_tskspc );

Parameter

ID tskid Task IDTask ID
CONST T_TSKSPC* pk_tskspc Packet of Task SpaceTask space information

pk_tskspc Detail:

void* uatb Address of Task Space Page TableTask space page table address
INT lsid Logical Space IDTask space ID (logical space ID)

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid pk_tskspc)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Sets the task space of the task specified in tskid.

The invoking task can be specified by setting tskid = TSK_SELF = 0. Note, however, that when tskid = TSK_SELF = 0 is specified in a system call issued from a task-independent portion, error code E_ID is returned.

The kernel is not responsible for handling the side-effects of task space changes. If, for example, a task space is changed while a task is using it for its execution, the task may hang or encounter other problems. The caller is responsible for avoiding such problems.

Additional Notes

The accuracy of pk_tskspc (uatb, lsid) is implementation-dependent, but the above definitions should be followed as much as possible.

tk_get_rid - Refers to resource group to which task belongs

C Language Interface

#include <tk/tkernel.h>

ID resid = tk_get_rid (ID tskid );

Parameter

ID tskid Task IDTask ID

Return Parameter

ID resid Resource IDResource ID
orError CodeError code

Error Code

E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Task does not belong to a resource group

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Returns the resource group to which the task specified in tskid currently belongs.

The invoking task can be specified by setting tskid = TSK_SELF = 0. Note, however, that when tskid = TSK_SELF = 0 is specified in a system call issued from a task-independent portion, error code E_ID is returned.

Additional Notes

For details of resource group, see the Section called Subsystem Management Functions.

If a resource group is deleted, this system call may return the Resource ID of the deleted resource group. Whether or not an error code (E_OBJ) is returned is implementation-dependent(See tk_cre_res and tk_del_res).

This system call is used by a subsystem. The subsystem recognizes the process by the resource ID. However, the resource ID cannot be specified when the application issues an extended SVC to make the subsystem. For this reason, the subsystem uses this system call to obtain the resource ID.

tk_set_rid - Set Task Resource ID

C Language Interface

#include <tk/tkernel.h>

ID oldid = tk_set_rid (ID tskid , ID resid );

Parameter

ID tskid Task IDTask ID
ID resid Resource IDNew resource ID

Return Parameter

ID oldid Old Resource IDOld resource ID
orError CodeError code

Error Code

E_ID Invalid ID number (tskid or resid is invalid or cannot be used)
E_NOEXS Object does not exist (the object specified in tskid or resid does not exist)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Changes the current resource group of the task specified in tskid to the resource group specified in resid. The Resource ID of the old resource group before the change is passed in a return parameter.

The invoking task can be specified by setting tskid = TSK_SELF = 0. Note, however, that when tskid = TSK_SELF = 0 is specified in a system call issued from a task-independent portion, error code E_ID is returned.

Additional Notes

For details of resource group, see the Section called Subsystem Management Functions.

In some cases error is not returned even if resid was previously deleted. Whether or not an error code (E_NOEXS) is returned is implementation-dependent. In principle it is the responsibility of the caller not to specify a deleted resource group.

tk_get_reg - Get Task Registers

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_get_reg (ID tskid , T_REGS *pk_regs , T_EIT *pk_eit , T_CREGS *pk_cregs );

Parameter

ID tskid Task IDTask ID
T_REGS* pk_regs Packet of RegistersPointer to the area to return the general register values
T_EIT* pk_eit Packet of EIT RegistersPointer to the area to return the values of registers saved when an exception occurs
T_CREGS* pk_cregs Packet of Control RegistersPointer to the area to return the control register values

Return Parameter

ER ercd Error CodeError code

The contents of T_REGS, T_EIT, and T_CREGS are defined for each CPU and implementation.

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Invalid object state (called for the invoking task)
E_CTX Context error (called from task-independent portion)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Gets the current register contents of the task specified in tskid.

If NULL is set in pk_regs, pk_eit, or pk_cregs, the corresponding registers are not referenced.

The referenced register values are not necessarily the values at the time the task portion was executing.

If this system call is issued for the invoking task, error code E_OBJ is returned.

Additional Notes

In principle, all registers in the task context can be referenced. This includes not only physical CPU registers but also those treated by the kernel as virtual registers.

tk_set_reg - Set Task Registers

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_set_reg (ID tskid , CONST T_REGS *pk_regs , CONST T_EIT *pk_eit , CONST T_CREGS *pk_cregs );

Parameter

ID tskid Task IDTask ID
CONST T_REGS* pk_regs Packet of RegistersGeneral registers
CONST T_EIT* pk_eit Packet of EIT RegistersRegisters saved when EIT occurs
CONST T_CREGS* pk_cregs Packet of Control RegistersControl registers

The contents of T_REGS, T_EIT, and T_CREGS are defined for each CPU and implementation.

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Invalid object state (called for the invoking task)
E_CTX Context error (called from task-independent portion)
E_PAR Invalid register value (implementation-dependent)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Sets the current register contents of the task specified in tskid.

If NULL is set in pk_regs, pk_eit, or pk_cregs, the corresponding registers are not set.

The set register values are not necessarily the values while the task portion is executing. The kernel is not responsible for handling the side-effects of register value changes.

It is possible, however, that some registers or register bits cannot be changed if the kernel does not allow such changes.(Implementation-dependent)

If this system call is issued for the invoking task, error code E_OBJ is returned.

tk_get_cpr - Get Task Coprocessor Registers

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_get_cpr (ID tskid , INT copno , T_COPREGS *pk_copregs );

Parameter

ID tskid Task IDTask ID
INT copno Coprocessor NumberCoprocessor number (0 to 3)
T_COPREGS* pk_copregs Packet of Coprocessor RegistersPointer to the area to return coprocessor register values

Return Parameter

ER ercd Error CodeError code

pk_copregs Detail:

T_COP0REG cop0 Coprocessor Number 0 RegisterCoprocessor number 0 register
T_COP1REG cop1 Coprocessor Number 1 RegisterCoprocessor number 1 register
T_COP2REG cop2 Coprocessor Number 2 RegisterCoprocessor number 2 register
T_COP3REG cop3 Coprocessor Number 3 RegisterCoprocessor number 3 register

The contents of T_COPnREG are defined for each CPU and implementation.

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Invalid object state (called for the invoking task)
E_CTX Context error (called from task-independent portion)
E_PAR Parameter error (copno is invalid or the specified coprocessor does not exist)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Gets the current contents of the register specified in copno of the task specified in tskid.

The referenced register values are not necessarily the values at the time the task portion was executing.

If this system call is issued for the invoking task, error code E_OBJ is returned.

Additional Notes

In principle, all registers in the task context can be referenced. This includes not only physical CPU registers but also those treated by the kernel as virtual registers.

tk_set_cpr - Set Task Coprocessor Registers

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_set_cpr (ID tskid , INT copno , CONST T_COPREGS *pk_copregs );

Parameter

ID tskid Task IDTask ID
INT copno Coprocessor NumberCoprocessor number (0 to 3)
CONST T_COPREGS* pk_copregs Packet of Coprocessor RegistersCoprocessor register

pk_copregs Detail:

T_COP0REG cop0 Coprocessor Number 0 RegisterCoprocessor number 0 register
T_COP1REG cop1 Coprocessor Number 1 RegisterCoprocessor number 1 register
T_COP2REG cop2 Coprocessor Number 2 RegisterCoprocessor number 2 register
T_COP3REG cop3 Coprocessor Number 3 RegisterCoprocessor number 3 register

Return Parameter

ER ercd Error CodeError code

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_OBJ Invalid object state (called for the invoking task)
E_CTX Context error (called from task-independent portion)
E_PAR Parameter error (copno is invalid or the specified coprocessor does not exist), or the set register value is invalid (implementation-dependent)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Sets the contents of the register specified in copno of the task specified in tskid.

The set register values are not necessarily the values while the task portion is executing. The kernel is not responsible for handling the side-effects of register value changes.

It is possible, however, that some registers or register bits cannot be changed if the kernel does not allow such changes.(Implementation-dependent)

If this system call is issued for the invoking task, error code E_OBJ is returned.

tk_inf_tsk - Reference Task Statistics

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_inf_tsk (ID tskid , T_ITSK *pk_itsk , BOOL clr );

Parameter

ID tskid Task IDTask ID
T_ITSK* pk_itsk Packet to Return Task StatisticsPointer to the area to return the task statistics
BOOL clr ClearTask statistics clear flag

Return Parameter

ER ercd Error CodeError code

pk_itsk Detail:

RELTIM stime System TimeCumulative system-level run time (ms)
RELTIM utime User TimeCumulative user-level run time (ms)
(Other implementation-dependent parameters may be added beyond this point.)

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid pk_itsk)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

Gets statistical information for the task specified in tskid.

If clr=TRUE≠0, the cumulative information is reset (cleared to 0) after getting the information.

The invoking task can be specified by setting tskid = TSK_SELF = 0. Note, however, that when tskid = TSK_SELF = 0 is specified in a system call issued from a task-independent portion, error code E_ID is returned.

stime and utime in the task statistics (T_ITSK) return values rounded to milliseconds. To know the value in microseconds, call tk_inf_tsk_u.

Additional Notes

The system-level run time is accumulated while the task runs at TA_RNG0, and the user-level run time is accumulated while the task runs at protection levels other than TA_RNG0. The execution time of a task created to run at TA_RNG0 is therefore counted entirely as system-level run time.

The method of counting run time is implementation-dependent, but does not need to be especially precise. In fact, applications should not expect very high precision.

tk_inf_tsk_u - Reference Task Statistics (Microseconds)

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_inf_tsk_u (ID tskid , T_ITSK_U *pk_itsk_u , BOOL clr );

Parameter

ID tskid Task IDTask ID
T_ITSK_U* pk_itsk_u Packet to ReturnTask StatisticsPointer to the area to return the task statistics
BOOL clr ClearTask statistics clear flag

Return Parameter

ER ercd Error CodeError code

pk_itsk_u Detail:

RELTIM_U stime_u System TimeCumulative system-level run time (in microseconds)
RELTIM_U utime_u User TimeCumulative user-level run time (in microseconds)
(Other implementation-dependent parameters may be added beyond this point.)

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid pk_itsk_u)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESNO

Description

This system call takes 64-bit stime_u and utime_u in microseconds instead of the return parameters stime and utime of tk_inf_tsk.

The specification of this system call is same as that of tk_inf_tsk, except that the return parameters are replaced with stime_u and utime_u. For more details, see the description of tk_inf_tsk.

Difference from T-Kernel 1.0

This system call was added in T-Kernel 2.0.

tk_ref_tsk - Reference Task Status

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_ref_tsk (ID tskid , T_RTSK *pk_rtsk );

Parameter

ID tskid Task IDTask ID
T_RTSK* pk_rtsk Packet to Return Task StatusPointer to the area to return the task status

Return Parameter

ER ercd Error CodeError code

pk_rtsk Detail:

void* exinf Extended InformationExtended information
PRI tskpri Task PriorityCurrent priority
PRI tskbpri Task Base PriorityBase priority
UINT tskstat Task StateTask State
UINT tskwait Task Wait FactorWait factor
ID wid Waiting Object IDWaiting object ID
INT wupcnt Wakeup CountWakeup request queuing count
INT suscnt Suspend CountSuspend request nesting count
RELTIM slicetime Slice TimeMaximum continuous run time (in ms)
UINT waitmask Wait MaskDisabled wait factors
UINT texmask Task Exception MaskAllowed task exceptions
UINT tskevent Task EventRaised task event
(Other implementation-dependent parameters may be added beyond this point.)

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid pk_rtsk)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESYES

Description

Gets the state of the task specified in tskid.

tskstat takes the following values.

TTS_RUN 0x0001RUNNING state
TTS_RDY 0x0002READY state
TTS_WAI 0x0004WAITING state
TTS_SUS 0x0008SUSPENDED state
TTS_WAS 0x000cWAITING-SUSPENDED state
TTS_DMT 0x0010DORMANT state
TTS_NODISWAI 0x0080Disabling of wait by tk_dis_wai is prohibited

Task states such as TTS_RUN and TTS_WAI are expressed by corresponding bits, which is useful when making a complex state decision (e.g., deciding that the state is one of either RUNNING or READY state). Note that of the above states, TTS_WAS is a combination of TTS_SUS and TTS_WAI but TTS_SUS is never combined with other states (TTS_RUN, TTS_RDY, TTS_DMT).

In the case of TTS_WAI (including TTS_WAS), disabling of wait by the tk_dis_wai is prohibited, TTS_NODISWAI is set. TTS NODISWAI is never combined with states other than TTS WAI.

When tk_ref_tsk is executed for an interrupted task from an interrupt handler, RUNNING (TTS_RUN) is returned as tskstat.

When tskstat is TTS_WAI (including TTS_WAS), the values of tskwait and wid are as shown in Table 2.

Table 2. Values of tskwait and wid

tskwait ValueDescription wid
TTW_SLP 0x00000001 Wait caused by tk_slp_tsk0
TTW_DLY 0x00000002 Wait caused by tk_dly_tsk0
TTW_SEM 0x00000004 Wait caused by tk_wai_semsemid
TTW_FLG 0x00000008 Wait caused by tk_wai_flgflgid
TTW_MBX 0x00000040 Wait caused by tk_rcv_mbxmbxid
TTW_MTX 0x00000080 Wait caused by tk_loc_mtxmtxid
TTW_SMBF 0x00000100 Wait caused by tk_snd_mbfmbfid
TTW_RMBF 0x00000200 Wait caused by tk_rcv_mbfmbfid
TTW_CAL 0x00000400Wait on rendezvous callporid
TTW_ACP 0x00000800Wait for rendezvous acceptanceporid
TTW_RDV 0x00001000Wait for rendezvous completion0
(TTW_CAL | TTW_RDV)0x00001400Wait on rendezvous call or wait for rendezvous completion0
TTW_MPF 0x00002000 Wait caused by tk_get_mpfmpfid
TTW_MPL 0x00004000 Wait caused by tk_get_mplmplid
TTW_EV1 0x00010000Wait for task event #10
TTW_EV2 0x00020000Wait for task event #20
TTW_EV3 0x00040000Wait for task event #30
TTW_EV4 0x00080000Wait for task event #40
TTW_EV5 0x00100000Wait for task event #50
TTW_EV6 0x00200000Wait for task event #60
TTW_EV7 0x00400000Wait for task event #70
TTW_EV8 0x00800000Wait for task event #80

When tskstat is not TTS_WAI (including TTS_WAS), both tskwait and wid are 0.

waitmask is the same bit array as tskwait.

For a task in DORMANT state, wupcnt = 0, suscnt = 0, and tskevent = 0.

The invoking task can be specified by setting tskid = TSK_SELF = 0. Note, however, that when tskid=TSK_SELF=0 is specified in a system call issued from a task-independent portion, error code E_ID is returned.

When the task specified with tk_ref_tsk does not exist, error code E_NOEXS is returned.

slicetime in the task status information (T_RTSK) returns a value rounded to milliseconds. To know the value in microseconds, call tk_ref_tsk_u.

Additional Notes

Even when tskid = TSK_SELF is specified with this system call, the ID of the invoking task is not known. Use tk_get_tid to find out the ID of the invoking task.

tk_ref_tsk_u - Reference Task Status (Microseconds)

C Language Interface

#include <tk/tkernel.h>

ER ercd = tk_ref_tsk_u (ID tskid , T_RTSK_U *pk_rtsk_u );

Parameter

ID tskid Task IDTask ID
T_RTSK_U* pk_rtsk_u Packet to Refer Task StatusPointer to the area to return the task status

Return Parameter

ER ercd Error CodeError code

pk_rtsk_u Detail:

void* exinf Extended InformationExtended information
PRI tskpri Task PriorityCurrent priority
PRI tskbpri Task Base PriorityBase priority
UINT tskstat Task StateTask State
UINT tskwait Task Wait FactorWait factor
ID wid Waiting Object IDWaiting object ID
INT wupcnt Wakeup CountWakeup request queuing count
INT suscnt Suspend CountSuspend request nesting count
RELTIM_U slicetime_u Slice TimeMaximum continuous run time (in microseconds)
UINT waitmask Wait MaskDisabled wait factors
UINT texmask Task Exception MaskAllowed task exceptions
UINT tskevent Task EventRaised task event
(Other implementation-dependent parameters may be added beyond this point.)

Error Code

E_OK Normal completion
E_ID Invalid ID number (tskid is invalid or cannot be used)
E_NOEXS Object does not exist (the task specified in tskid does not exist)
E_PAR Parameter error (invalid pk_rtsk_u)

Valid Context

Task portionQuasi-task portionTask-independent portion
YESYESYES

Description

This system call takes 64-bit slicetime_u in microseconds instead of the return parameter slicetime of tk_ref_tsk.

The specification of this system call is same as that of tk_ref_tsk, except that the return parameter is replaced with slicetime_u. For more details, see the description of tk_ref_tsk.

Difference from T-Kernel 1.0

This system call was added in T-Kernel 2.0.