📄 mk_queu.c
字号:
XMK_END_CRITICAL_PATH;
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_TRACE_EXIT("xmk_FirstSignal");
#endif
return( ( xmk_T_MESSAGE xmk_RAM_ptr ) XMK_CURRENTSIGNAL ) ;
} /* END OF FUNCTION */
/*+FHDR E*/
/*
+------------------------------------------------------------------------------+
| Functionname : xmk_NextSignal |
| Author : S&P Media GmbH Germany |
+------------------------------------------------------------------------------+
| |
| Description : |
| The signal following the current signal is copied to the current signal. |
| If there are no more signals, NULL is returned. |
| |
| Parameter : - |
| |
| Return : Pointer to the next signal in the queue |
| (NULL if no more signals in the queue) |
| |
+------------------------------------------------------------------------------+
*/
/*-FHDR E*/
/*+FDEF E*/
#ifndef XNOPROTO
xmk_T_MESSAGE xmk_RAM_ptr xmk_NextSignal( void )
#else
xmk_T_MESSAGE xmk_RAM_ptr xmk_NextSignal( )
#endif
/*-FDEF E*/
{
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_FUNCTION("xmk_NextSignal");
#endif
XMK_BEGIN_CRITICAL_PATH;
if( XMK_CURRENTSIGNAL != (T_E_SIGNAL xmk_RAM_ptr) NULL )
{
XMK_CURRENTSIGNAL = (XMK_CURRENTSIGNAL)->next ;
} /* END IF */
XMK_END_CRITICAL_PATH;
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_TRACE_EXIT("xmk_NextSignal");
#endif
return( ( xmk_T_MESSAGE xmk_RAM_ptr) XMK_CURRENTSIGNAL ) ;
} /* END OF FUNCTION */
/*+FHDR E*/
/*
+------------------------------------------------------------------------------+
| Functionname : xmk_InsertSignal |
| Author : S&P Media GmbH Germany |
+------------------------------------------------------------------------------+
| |
| Description : |
| This function puts a signal into the queue. |
| The position depends on the signal-priority (if existing). |
| |
| With the parameter p_Message a pointer to the signal which is to be inserted|
| is given. |
| |
| Parameter : *p_Message - pointer to signal which is to be inserted |
| |
| Return : - |
| |
+------------------------------------------------------------------------------+
*/
/*-FHDR E*/
/*+FDEF E*/
#ifndef XNOPROTO
void xmk_InsertSignal( xmk_T_MESSAGE xmk_RAM_ptr p_Message )
#else
void xmk_InsertSignal ( p_Message )
xmk_T_MESSAGE xmk_RAM_ptr p_Message ;
#endif
/*-FDEF E*/
{
X_REGISTER T_E_SIGNAL xmk_RAM_ptr xmk_RAM_ptr rover ;
X_STATIC T_E_SIGNAL xmk_RAM_ptr element ;
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_FUNCTION("xmk_InsertSignal");
#endif
element = ( T_E_SIGNAL xmk_RAM_ptr )p_Message ;
/*
** search for signal's position in queue
*/
element->next = (T_E_SIGNAL xmk_RAM_ptr) NULL ;
#ifdef XMK_USE_SIGNAL_PRIORITIES
#ifdef XMK_USE_PREEMPTIVE
for( rover = &(Prio_Queue[EPRIOLEVEL]); *rover != (T_E_SIGNAL xmk_RAM_ptr) NULL;
rover = &(( *rover )->next ) )
#else
for( rover = XMK_QUEUE_ADR; *rover != (T_E_SIGNAL xmk_RAM_ptr) NULL; rover = &(( *rover )->next ) )
#endif
{
if( p_Message->prio < ( *rover )->Signal.prio )
{
/*
** Position found, if signal with lower priority detected
*/
break ;
} /* END IF */
} /* END FOR */
/*
** signal-priority not used
*/
#else
/*
** In both cases inserting signal at the queue's end
*/
#ifdef XMK_USE_PREEMPTIVE
for( rover = &(Prio_Queue[EPRIOLEVEL]); *rover != (T_E_SIGNAL xmk_RAM_ptr) NULL;
rover = &(( *rover )->next ) );
#else
for( rover = XMK_QUEUE_ADR; *rover != (T_E_SIGNAL xmk_RAM_ptr) NULL; rover = &(( *rover )->next ) );
#endif
#endif
/*
** Insert signal into queue
*/
element->next = *rover ;
*rover = element ;
XMK_Q_INCR_ACT
XMK_Q_SET_MAX
/*+PREEMPT*/
#ifdef XMK_USE_PREEMPTIVE
xmk_CheckIfSchedule();
#endif
/*-PREEMPT*/
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_TRACE_EXIT("xmk_InsertSignal");
#endif
} /* END OF FUNCTION */
/*+FHDR E*/
/*
+------------------------------------------------------------------------------+
| Functionname : xmk_RemoveCurrentSignal |
| Author : S&P Media GmbH Germany |
+------------------------------------------------------------------------------+
| |
| Description : |
| The signal currently worked on is removed from the queue and is inserted |
| into the list of free signals. |
| |
| Parameter : - |
| |
| Return : - |
| |
+------------------------------------------------------------------------------+
*/
/*-FHDR E*/
/*+FDEF E*/
#ifndef XNOPROTO
void xmk_RemoveCurrentSignal( void )
#else
void xmk_RemoveCurrentSignal( )
#endif
/*-FDEF E*/
{
X_REGISTER T_E_SIGNAL xmk_RAM_ptr rover ;
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_FUNCTION("xmk_RemoveCurrentSignal");
#endif
XMK_BEGIN_CRITICAL_PATH;
/*
** If the first signal in the queue is the one to be removed
*/
if( XMK_QUEUE == XMK_CURRENTSIGNAL )
{
/*
** move the pointer to the signal's successor
*/
XMK_QUEUE = (XMK_QUEUE)->next ;
} /* END IF */
else
{
/*
** for all the other signals
*/
for( rover = XMK_QUEUE; rover != (T_E_SIGNAL xmk_RAM_ptr) NULL; rover = rover->next )
{
/*
** if signal to be removed is found
*/
if( rover->next == XMK_CURRENTSIGNAL )
{
rover->next = rover->next->next ;
/*
** move the pointer to the signal following to the found one
*/
break;
} /* END IF */
} /* END OF FUNCTION */
} /* END ELSE */
/*
** remove the signal from the queue and insert it in the free list
*/
xmk_FreeSignal( ( xmk_T_MESSAGE xmk_RAM_ptr )XMK_CURRENTSIGNAL ) ;
/*
** Set current signal to NULL
*/
XMK_CURRENTSIGNAL = (T_E_SIGNAL xmk_RAM_ptr) NULL ;
XMK_END_CRITICAL_PATH;
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_TRACE_EXIT("xmk_RemoveCurrentSignal");
#endif
} /* END OF FUNCTION */
/*+FHDR E*/
/*
+------------------------------------------------------------------------------+
| Functionname : xmk_RemoveSignalBySignalID |
| Author : S&P Media GmbH Germany |
+------------------------------------------------------------------------------+
| |
| |
| Description : |
| Signals with a given signal-code directed towards the current process |
| are removed from the queue and inserted in the list of free signals. |
| |
| The signal currently worked on mustn't be removed, because it is |
| necessary for the current actions. It is anyhow removed after having |
| finished its treatment. |
| |
| |
| Parameter : SignalID - signal ID of the signals to be removed |
| |
| Return : - |
| |
+------------------------------------------------------------------------------+
*/
/*-FHDR E*/
/*+FDEF E*/
#ifndef XNOPROTO
void xmk_RemoveSignalBySignalID( xmk_T_SIGNAL SignalId )
#else
void xmk_RemoveSignalBySignalID ( SignalId )
xmk_T_SIGNAL SignalId ;
#endif
/*-FDEF E*/
{
X_REGISTER T_E_SIGNAL xmk_RAM_ptr xmk_RAM_ptr rover ;
#ifndef XMK_USE_RECEIVER_PID_IN_SIGNAL
xPID OwnerProcessPID ; /* temp.variable */
#endif
#ifdef XMK_ADD_PRINTF_QUEUE
XMK_FUNCTION("xmk_RemoveSignalBySignalID");
#endif
XMK_BEGIN_CRITICAL_PATH;
/*
** for all the signals in the queue
*/
rover = XMK_QUEUE_ADR;
while ( *rover != (T_E_SIGNAL xmk_RAM_ptr) NULL)
{
/*
** does the current signal have the wanted signalID ?
*/
#ifdef XMK_USE_RECEIVER_PID_IN_SIGNAL
if( ( *rover != XMK_CURRENTSIGNAL ) &&
( ( *rover )->Signal.rec == xRunPID ) &&
( ( *rover )->Signal.signal == SignalId ))
#else
OwnerProcessPID = xRouteSignal ( SignalId ) ;
if( ( *rover != XMK_CURRENTSIGNAL ) &&
( OwnerProcessPID == xRunPID ) &&
( ( *rover )->Signal.signal == SignalId ))
#endif
{
T_E_SIGNAL xmk_RAM_ptr f ;
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -