CHAPTER 7 TIME MANAGEMENT FUNCTIONS
This chapter describes the time management functions performed by the RI78V4.
The time management functions of the RI78V4 include
Delayed Wakeup,
Timeout, and
Cyclic Handlers that use timer interrupts created as fixed intervals, as means for realizing time-dependent processing.
Note The RI78V4 does not execute initialization of hardware that creates timer interrupts (clock controller, etc.). This initialization processing must therefore be coded by the user in the
Boot Processing or
Initialization Routine.
The timer handler is a dedicated time control processing routine that consists of the processing required to realize delayed wakeup of tasks, timeout during the WAITING state, and cyclic handler activation, and is called from the interrupt handler that is activated upon output of a timer interrupt.
Note The timer handler is part of the functions provided by the RI78V4. The user therefore need not code the processing contents of the timer handler.
7.2.1 Define timer handler
Timer handler registration is registerd by CF78V4 based on the clock timer interrupt source in system configuration file. So it is not necessory to discribe the timer handler by user.
Delayed wakeup the operation that makes the invoking task transit from the RUNNING state to the WAITING state during the interval until a given length of time has elapsed, and makes that task move from the WAITING state to the READY state once the given length of time has elapsed.
Delayed wakeup is implemented by issuing the following service call from the processing program.
Timeout is the operation that makes the target task move from the RUNNING state to the WAITING state during the interval until a given length of time has elapsed if the required condition issued from a task is not immediately satisfied, and makes that task move from the WAITING state to the READY state regardless of whether the required condition is satisfied once the given length of time has elapsed.
A timeout is implemented by issuing the following service call from the processing program.
|
|
|
|
|
Acquire semaphore resource.
|
|
|
|
|
|
|
|
|
|
Acquire fixed-sized memory block.
|
The cyclic handler is a routine dedicated to cycle processing that is activated periodically at a constant interval (activation cycle), and is called from the
Timer Handler.
The RI78V4 handles the cyclic handler as a "non-task (module independent from tasks)". Therefore, even if a task with the highest priority in the system is being executed, the processing is suspended when a specified activation cycle has come, and the control is passed to the cyclic handler.
7.5.1 Create cyclic handler
Cyclic handlers therefore cannot be created dynamically using a method such as issuing a service call from a processing program.
- Static create
Static cyclic handler creation is realized by defining
Cyclic handler information in the system configuration file.
The RI78V4 executes cyclic handler creation processing based on data stored in information files, using the
Kernel Initialization Module, and handles the created cyclic handlers as management targets.
7.5.2 Delete cyclic handler
In the RI78V4, cyclic handlers created statically by the
Kernel Initialization Module cannot be deleted dynamically using a method such as issuing a service call from a processing program.
7.5.3 Basic form of cyclic handlers
Write cyclic handlers using void type functions that do not have arguments (function: any).
The following shows the basic form of cyclic handlers.
#include <kernel.h> /*Standard header file definition*/
#include <kernel_id.h> /*System information header file definition*/
void
func_cychdr ( void )
{
/* ............ */ /*Main processing*/
return; /*Terminate cyclic handler*/
}
|
$INCLUDE (kernel.inc) ;Standard header file definition
$INCLUDE (kernel_id.inc) ;System information header file definition
.PUBLIC _func_cychdr
.SECTION .text, TEXT
_func_cychdr:
; ............ ;Main Processing
RET ;Terminate cyclic handler
|
7.5.4 Internal processing of cyclic handler
The RI78V4 handles the cyclic handler as a "non-task".
Moreover, the RI78V4 executes "original pre-processing" when passing control to the cyclic handler, as well as "original post-processing" when regaining control from the cyclic handler.
Therefore, note the following points when coding cyclic handlers.
- Stack switching
The RI78V4 executes processing to switch to the system stack when passing control to the cyclic handler, and processing to switch to the stack for the switch destination processing program (system stack or task stack) when regaining control from the cyclic handler.
The user is therefore not required to code processing related to stack switching in cyclic handlers.
- Interrupt status
Maskable interrupt acknowledgement is prohibited in the RI78V4 when control is passed to the cyclic handler.
To change (enable) the interrupt status in the cyclic handler, calling of the __EI function are therefore required.
- Service call issuance
The RI78V4 handles the cyclic handler as a "non-task".
Service calls that can be issued in cyclic handlers are limited to the service calls that can be issued from non-tasks.
Note 2 If a service call (
ichg_pri,
isig_sem, etc.) accompanying dispatch processing (task scheduling processing) is issued in order to quickly complete the processing in the cyclic handler during the interval until the processing in the cyclic handler ends, the RI78V4 executes only processing such as queue manipulation, counter manipulation, etc., and the actual dispatch processing is delayed until a return instruction is issued by the cyclic handler, upon which the actual dispatch processing is performed in batch.
7.5.5 Start cyclic handler operation
Moving to the operational state (STA state) is implemented by issuing the following service call from the processing program.
-
sta_cyc
This service call moves the cyclic handler specified by parameter
cycid from the non-operational state (STP state) to operational state (STA state).
As a result, the target cyclic handler is handled as an activation target of the RI78V4.
The following describes an example for coding this service call.
#include <kernel.h> /*Standard header file definition*/
#include <kernel_id.h> /*System information header file definition*/
void
func_task ( VP_INT exinf )
{
ID cycid = ID_cycA; /*Declares and initializes variable*/
/* ............ */
sta_cyc ( cycid ); /*Start cyclic handler operation*/
/* ............ */
}
|
Note The relative interval from when either of this service call is issued until the first activation request is issued varies depending on whether the TA_PHS attribute is specified for the target cyclic handler during configuration.
[ Cyclic handler activation image(the TA_PHS attribute is specified) ]
The target cyclic handler activation timing is set based on the activation phases (initial activation phase
cycphs and activation cycle
cyctim) defined during configuration.
If the target cyclic handler has already been started, however, no processing is performed even if this service call is issued, but it is not handled as an error.
The following shows a cyclic handler activation timing image.
[ Cyclic handler activation image(the TA_PHS attribute is not specified) ]
The target cyclic handler activation timing is set based on the activation phase (activation cycle
cyctim) when this service call is issued.
This setting is performed regardless of the operating status of the target cyclic handler.
The following shows a cyclic handler activation timing image.
7.5.6 Stop cyclic handler operation
Moving to the non-operational state (STP state) is implemented by issuing the following service call from the processing program.
-
stp_cyc
This service call moves the cyclic handler specified by parameter
cycid from the operational state (STA state) to non-operational state (STP state).
As a result, the target cyclic handler is excluded from activation targets of the RI78V4 until issuance of
sta_cyc.
The following describes an example for coding this service call.
#include <kernel.h> /*Standard header file definition*/
#include <kernel_id.h> /*System information header file definition*/
void
func_task ( VP_INT exinf )
{
ID cycid = ID_cycA; /*Declares and initializes variable*/
/* ............ */
stp_cyc ( cycid ); /*Stop cyclic handler operation*/
/* ............ */
}
|
Note This service call does not perform queuing of stop requests. If the target cyclic handler has been moved to the non-operational state (STP state), therefore, no processing is performed but it is not handled as an error.
7.5.7 Reference cyclic handler state
A cyclic handler status by issuing the following service call from the processing program.
-
ref_cyc
Stores cyclic handler state packet (such as current status) of the cyclic handler specified by parameter
cycid in the area specified by parameter
pk_rcyc.
The following describes an example for coding this service call.
#include <kernel.h> /*Standard header file definition*/
#include <kernel_id.h> /*System information header file definition*/
void
func_task ( VP_INT exinf )
{
ID cycid = ID_cycA; /*Declares and initializes variable*/
T_RCYC pk_rcyc; /*Declares data structure*/
STAT cycstat; /*Declares variable*/
RELTIM lefttim; /*Declares variable*/
/* ............ */
ref_cyc ( cycid, &pk_rcyc );/*Reference cyclic handler state*/
cycstat = pk_rcyc.cycstat; /*Reference cyclic handler operational state*/
lefttim = pk_rcyc.lefttim; /*Reference time left before the next activation*/
/* ............ */
}
|