⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mk_queu.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:

  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 + -