📄 ml_typw.h
字号:
xmk_SendSimple (SIG_IDNODE);
#endif
#else
/*
** No simple output function available - use complex one
** This output function can handle signal priorities.
*/
#define SDL_OUTP_NPAR(PRIO,SIG_NAME,SIG_IDNODE,RECEIVER,NUM,SIG_NAME_STRING) \
PRINTF_OUTPUT(SIG_NAME_STRING); \
XMK_VOID XMK_SF(SIG_IDNODE,PRIO,0,(void xmk_RAM_ptr) NULL,RECEIVER);
#endif
#define SDL_OUTP_PAR(PRIO,SIG_NAME,SIG_IDNODE,RECEIVER,NUM,SIG_NAME_STRING) \
PRINTF_OUTPUT(SIG_NAME_STRING); \
XMK_VOID XMK_SF(SIG_IDNODE,PRIO,sizeof(NUM), \
(void xmk_RAM_ptr) xmk_OutputSignalPtr,RECEIVER); }
#define SDL_OUTP_NPAR_ENV(PRIO,SIG_NAME,SIG_IDNODE,RECEIVER,NUM,SIG_NAME_STRING) \
PRINTF_OUTPUT(SIG_NAME_STRING); \
XMK_VOID XMK_SF (SIG_IDNODE,PRIO,0,(void xmk_RAM_ptr) NULL,RECEIVER);
#define SDL_OUTP_PAR_ENV(PRIO,SIG_NAME,SIG_IDNODE,RECEIVER,NUM,SIG_NAME_STRING) \
PRINTF_OUTPUT(SIG_NAME_STRING); \
XMK_VOID XMK_SF (SIG_IDNODE,PRIO,sizeof (NUM), (void xmk_RAM_ptr) xmk_OutputSignalPtr ,RECEIVER); }
/*
** The following macro is used in SDL_OUTP - macro calls
*/
#ifndef XMK_USED_ONLY_X_1
#define TO_PROCESS(PROC_NAME, PROC_IDNODE) \
xmk_Determine_Receiver(XCAT(XPTID_,PROC_IDNODE))
#else
#define TO_PROCESS(PROC_NAME, PROC_IDNODE) XCAT(XPTID_,PROC_IDNODE)
#endif
/*
** Macro for use in the environment functions for user
** can be used in xInEnv () or in an interrupt service routine
** Main use is to send the ENV-PID to xmk_Send () ...
*/
#define XMK_SEND_ENV(ENV_ID,SIG_IDNODE,PRIO,SIG_PAR_LEN,SIG_PTR,RECEIVER) \
xtmpPID = xRunPID ; \
xRunPID = ENV_ID ; \
XMK_SF(SIG_IDNODE,PRIO,SIG_PAR_LEN,SIG_PTR,RECEIVER); \
xRunPID = xtmpPID;
#define XMK_SEND_TMP_VARS xPID xtmpPID;
/* ---------------------------- Create --------------------------- */
#define STARTUP_VARS
/* empty */
#define ALLOC_STARTUP_NPAR(PROC_NAME, STARTUP_IDNODE, STARTUP_PAR_TYPE, XNL)
/* empty */
/*
** Not relevant for Cmicro in SDT/Tau product release ;
*/
#define ALLOC_STARTUP(PROC_NAME, STARTUP_IDNODE, STARTUP_PAR_TYPE) \
xmk_OutputSignalPtr = getnewmemoryfor_ALLOC_STARTUP ();
/*
** Not relevant for Cmicro in SDT/Tau product release ;
*/
#define ALLOC_STARTUP_THIS \
xmk_OutputSignalPtr = getnewmemoryfor_ALLOC_STARTUP_THIS ();
#define STARTUP_ALLOC_ERROR
#define STARTUP_ALLOC_ERROR_END
#define STARTUP_DATA_PTR \
xmk_OutputSignalPtr->VarP
#define SDL_CREATE(PROC_NAME, PROC_IDNODE, PROC_NAME_STRING, STARTUP_IDNODE, PRIV_DATA_TYPE, PRIO, PAD_FUNCTION) \
PRINTF_CREATE(PROC_NAME_STRING); \
XMK_VOID xmk_CreateProcess (XCAT(XPTID_,PROC_IDNODE));
/* ------------------------- Static Create ------------------------ */
/* Is totally done by Cmicro Kernel, via the <root-process-table> */
/* ----------------------------- Stop ---------------------------- */
/* A stop in a SDL-Process means a return from the yPAD-Function */
/* The Cmicro Kernel handles all further actions. */
#define SDL_STOP \
return (XDORMANT);
/*
** Insert free statements when process stops
*/
#if defined(XMK_USED_DYNAMIC_STOP)
#define XFREEVARS
#endif
/* The following Macro is inserted directly before SDL_STOP and */
/* can be used to free () Processvariables, if wanted in special */
/* applications ... */
#ifdef XFREEVARS
#define FREE_PROCESS_VARS
#endif
/* ---------------------------- Timers --------------------------- */
/* ----- Timermodel 1 ----- */
#ifdef XMK_USE_TIMER_MODEL1
/* -- Definitions */
#define DEF_TIMER_VAR(NAME) /* unnecessary */
#define INIT_TIMER_VAR(TIMER_VAR) /* unnecessary */
#define INPUT_TIMER_VAR(TIMER_VAR) /* unnecessary */
#define RELEASE_TIMER_VAR(TIMER_VAR) /* unnecessary */
#define SDL_NOW xmk_NOW ()
#ifdef XMK_USE_TIMER_SCALE
/*
** Here is a little help to scale timers.
** Timer scaling is always useful only when using the Cmicro Tester,
** so the accuracy is not a problem.
*/
#define SDL_SET(TIME_EXPR, TIMER_NAME, TIMER_IDNODE, TIMER_VAR, TIMER_NAME_STRING) \
xmk_TimerSet((TIME_EXPR-SDL_NOW)*xmk_TimerScaleFactor+SDL_NOW,TIMER_IDNODE);
#define SDL_SET_DUR(TIME_EXPR, DUR_EXPR, TIMER_NAME, TIMER_IDNODE, TIMER_VAR, TIMER_NAME_STRING) \
xmk_TimerSet((TIME_EXPR-SDL_NOW)*xmk_TimerScaleFactor+SDL_NOW,TIMER_IDNODE);
#define SDL_SET_TICKS(TIME_EXPR, DUR_EXPR, TIMER_NAME, TIMER_IDNODE, TIMER_VAR, TIMER_NAME_STRING) \
xmk_TimerSet((TIME_EXPR-SDL_NOW)*xmk_TimerScaleFactor+SDL_NOW,TIMER_IDNODE);
#else
#define SDL_SET(TIME_EXPR, TIMER_NAME, TIMER_IDNODE, TIMER_VAR, TIMER_NAME_STRING) \
xmk_TimerSet(TIME_EXPR,TIMER_IDNODE);
#define SDL_SET_DUR(TIME_EXPR, DUR_EXPR, TIMER_NAME, TIMER_IDNODE, TIMER_VAR, TIMER_NAME_STRING) \
xmk_TimerSet(TIME_EXPR,TIMER_IDNODE);
#define SDL_SET_TICKS(TIME_EXPR, DUR_EXPR, TIMER_NAME, TIMER_IDNODE, TIMER_VAR, TIMER_NAME_STRING) \
xmk_TimerSet(TIME_EXPR,TIMER_IDNODE);
#endif
/* -- Reset without parameters */
#define SDL_RESET(TIMER_NAME, TIMER_IDNODE, TIMER_VAR, TIMER_NAME_STRING) \
xmk_TimerReset(TIMER_IDNODE);
/* -- Active (timer active) */
#define SDL_ACTIVE(TIMER_NAME, TIMER_IDNODE, TIMER_VAR) \
xmk_TimerActive(TIMER_IDNODE)
#endif /* ... XMK_USE_TIMER_MODEL1 */
/* ----- Timermodel 2 ----- */
#ifdef XMK_USE_TIMER_MODEL2
/*
** CAUTION !
** ===================
** This timermodel 2 is not applicable for usual Cmicro Kernel
** Integrations. There might be some customized applications
** not included in Cmicro product, handling timers in a
** different way, but these cannot be used.
*/
#ifdef XMK_USE_TIMER_ROM_TABLE
typedef struct _XTIMER_ROM_TABLE_ENTRY
{
xPID Ownerprocess;
xmk_T_SIGNAL timer_id;
xmk_T_TIME timer_startval;
unsigned int offset;
} XTIMER_ROM_TABLE_ENTRY ;
#define XDEFTIMER_ROM_TABLE_ENTRY(a,b,c,d) a, b, c, d,
#define X_END_TIMER_ROM (xPID) 0xff
#define MAXN 1
#endif /* ... XMK_USE_TIMER_ROM_TABLE */
#ifdef XMK_USE_TIMER_RAM_TABLE
#define MAXI 1
typedef struct _XTIMER_RAM_TABLE_ENTRY
{
/* xPID Ownerprocess; */
/* xmk_T_SIGNAL timer_id; */
xmk_T_TIME timer_val;
/* unsigned int offset; */
} XTIMER_RAM_TABLE_ENTRY ;
#endif /* ... XMK_USE_TIMER_RAM_TABLE */
#endif /* ... XMK_USE_TIMER_MODEL2 */
/* --------------------------- Nextstate ------------------------- */
#define SDL_NEXTSTATE(STATE_NAME, STATE_IDNODE, STATE_NAME_STRING) \
XOS_TRACE_NEXTSTATE(STATE_IDNODE); \
return(STATE_IDNODE);
#define SDL_DASH_NEXTSTATE \
XOS_TRACE_DASHSTATE; \
return(XDASHSTATE);
/* --------------------------- Decision -------------------------- */
#define XDECISION_ERROR ErrorHandler (ERR_N_SDL_DECISION_ELSE);
/* --------------------------- SDL Array ------------------------- */
#define XRANGE_ERROR ErrorHandler (ERR_N_SDL_RANGE);
#define XINDEX_ERROR ErrorHandler (ERR_N_SDL_RANGE);
#ifdef XECSOP
extern void xSDLOpError XPP((char*, char*));
#else
#define xSDLOpError(p1,p2) ErrorHandler(ERR_N_PREDEFINED_OPERATOR_CALL);
#endif
/****+***************************************************************
05 Utility #ifdef
********************************************************************/
#ifndef NIL
#define NIL 0
#endif
/****+***************************************************************
06 Constants
********************************************************************/
#define XMK_STOP 1 /* xmk_RunSDL () */
#define XMK_NORMALRETURN 0 /* xmk_RunSDL () */
#define XMK_RECORDER_TAPE_END 2 /* xmk_RunSDL () */
/****+***************************************************************
07 Forward Declarations
********************************************************************/
/****+***************************************************************
08 SDL predefined types (except SDL_PId)
********************************************************************/
/****+***************************************************************
09 SDL_PId
********************************************************************/
#define SDL_pid xPID
#define SDL_Pid xPID
#define SDL_PId xPID
#define SDL_PID xPID
#ifdef XMK_USED_ONLY_X_1
/* Each SDL-Process in the System is defined as (1,1) or (0,1) or (,1) */
/* +---------------------------+ */
/* + <process-type-id> + */
/* +---------------------------+ */
/* + xPID = unique process-id + */
/* +---------------------------+ */
typedef unsigned char xPID; /* char is enough to handle >250 Processes */
#define GLOBALPID(ptype,pinst) ptype
#define EPIDTYPE(globalpid) globalpid
#define EPIDINST(globalpid) 0
/* Reserved Values, not available for ordinary Process-type-IDs */
#define xNULLTYPE 0xff
#define xNULLINST 0xff
#define xNULLPID 0xff
#define SDL_NULL xNULLPID
#define ENV 0xfe
#define MICROKERNEL 0xfc /* internal purposes */
#define SET_ENVIRONMENT xRunPID = ENV;
#else
/* Anywhere in the System there is a process, which is not defined as */
/* (1,1) or (0,1) or (,1) */
/* +---------------------------+------------------------+ */
/* + higher Byte + lower Byte + */
/* +---------------------------+------------------------+ */
/* + <process-inst-id> + <process-type-id> + */
/* +---------------------------+------------------------+ */
/* + xPID = unique process-id + */
/* +---------------------------+------------------------+ */
typedef unsigned int xPID;/* int is enough to handle >250 P.types */
/* and 255 Instances per Type, easy to */
/* calculate */
#define GLOBALPID(ptype,pinst) ( ptype | (pinst << 8) )
#define EPIDTYPE(globalpid) ( (unsigned char) globalpid & 0xff)
#define EPIDINST(globalpid) ( (unsigned char) (globalpid >> 8) & 0xff)
/* Reserved Value, not available for ordinary Process-type-IDs */
#define xNULLTYPE 0xff
#define xNULLINST 0xff
#define xNULLPID 0xffff
#define SDL_NULL xNULLPID
#define ENV 0xfffe
#define MICROKERNEL 0xfffc /* internal purposes */
#define SET_ENVIRONMENT xRunPID = ENV;
#endif
/* if xPID is of a basic C-type like unsigned char or int */
/* Assignment of PIDs in Process are easy .... . */
#ifndef XMK_USED_ONLY_X_1
#define xEq_SDL_PId(pid1,pid2) (pid1==pid2)
#define xEq_SDL_PIdNULL(pid) (pid==xNULLPID)
#define xDef_SDL_PId(V) *(V) = xNULLPID;
#define yDef_SDL_PId(V) xDef_SDL_PId(V)
#define yAssF_SDL_PId(V,E,A) { V = E; }
#define yEqF_SDL_PId(E1,E2) (E1==E2)
#define yNEqF_SDL_PId(E1,E2) (E1!=E2)
#else
#define xEq_SDL_PId(pid1,pid2) (pid1==pid2)
#define xEq_SDL_PIdNULL(pid) (pid==xNULLPID)
#define xDef_SDL_PId(V) *(V) = xNULLPID;
#define yDef_SDL_PId(V) xDef_SDL_PId(V)
#define yAssF_SDL_PId(V,E,A) { V = E; }
#define yEqF_SDL_PId(E1,E2) (E1==E2)
#define yNEqF_SDL_PId(E1,E2) (E1!=E2)
#endif
#define yDef_xPID yDef_SDL_PId
#define yAssF_xPID yAssF_SDL_PId
#define yEqF_xPID yEqF_SDL_PId
#define yNEqF_xPID yNEqF_SDL_PId
/****+***************************************************************
10 Signal Set
********************************************************************/
/****+***************************************************************
11 Procedure ( = Prd )
********************************************************************/
#define YPRD_YSVARP
#define YPRD_TEMP_VARS \
unsigned char *xmk_OutputSignalPtr;
#define YPRD_YVARP(VDEF_TYPE) \
VDEF_TYPE *yVarP = (VDEF_TYPE*) pRunData;
/*
** Define the following macros outside this headerfile in tight
** integrations to be able to access pid expressions in global procedures
** like in output to (SENDER|PARENT|OFFSPRING|SELF).
**
** The macros cover :
** -function declaration (XGP_.*P),
** -function call (XGP_.*C),
** -function definition for ANSI C (XGP_.*D).
** -function definition for KR C (XGP_.*K and XGP_.*_KD).
** For each of the above, there is one macro for a GP with parameters (XGP_PARAM_.*)
** and one further macro for a GP without parameters (XGP_NOPARAM.*).
*/
/* Global PRD with FPAR */
#ifndef XGP_PARAM_P
#define XGP_PARAM_P
#endif
#ifndef XGP_PARAM_C
#define XGP_PARAM_C
#endif
#ifndef XGP_PARAM_D
#define XGP_PARAM_D
#endif
#ifndef XGP_PARAM_K
#define XGP_PARAM_K
#endif
#ifndef XGP_PARAM_KD
#define XGP_PARAM_KD
#endif
/* Global PRD without FPAR */
#ifndef XGP_PARAM_PE
#define XGP_PARAM_PE
#endif
#ifndef XGP_PARAM_CE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -