| /************************************************************************ | 
 | * °æÈ¨ËùÓÐ (C)2007,ÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£ | 
 | *  | 
 | * ÎļþÃû³Æ£º ms_os.h | 
 | * Îļþ±êʶ£º  | 
 | * ÄÚÈÝÕªÒª£º External declarations of interface routines to the operation system. | 
 | * | 
 | * ÐÞ¸ÄÈÕÆÚ     °æ±¾ºÅ     Ð޸ıê¼Ç     ÐÞ¸ÄÈË	     ÐÞ¸ÄÄÚÈÝ       | 
 | * ----------------------------------------------------------------------- | 
 | * 2008/06/27  	    V0.5		                                ¹¨Òí               ´´½¨ | 
 | ************************************************************************/ | 
 |  | 
 | #ifndef _MS_OS_H_ | 
 | #define _MS_OS_H_ | 
 |  | 
 | #include <stddef.h> | 
 | #include "base_api.h" | 
 | /*#include "ms_hwtrc.h"*/   /* Trace interface as standard out, hwtrc_print(). */ | 
 |  | 
 | #if MS_OS_CRITICAL_SECTION_SUPPORT > 0 | 
 | #include "ms_crit.h" | 
 | #endif | 
 |  | 
 |  | 
 | /*=========================================================================== | 
 | Exported Type Declarations | 
 | ===========================================================================*/ | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        OS_pid_t | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      PID of an operation system process. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define OS_pid_t     SDL_PId | 
 | #define OS_SDL_NULL  SDL_NULL | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        OS_no_sig_params_t | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Used to allocate a signal without parameters. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define OS_no_sig_params_t  XSIGNALHEADERTYPE | 
 |  | 
 |  | 
 | /*=========================================================================== | 
 | Exported Macro Declarations | 
 | ===========================================================================*/ | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_mem_xalloc | 
 |  *---------------------------------------------------------------------------- | 
 |  * Purpose:      mallocs dynamic memory | 
 |  * | 
 |  * Parameters:   size: number of bytes to be malloced | 
 |  * | 
 |  * Returns:      pointer to first byte of memory | 
 |  * | 
 |  * Remarks: | 
 |  ***E************************************************************************/ | 
 | /**B************************************************************************* | 
 |  * Macro:        os_mem_xfree | 
 |  *---------------------------------------------------------------------------- | 
 |  * Purpose:      frees dynamic memory | 
 |  * | 
 |  * Parameters:   ptr:  pointer to memory to be returned | 
 |  * | 
 |  * Returns:      nothing | 
 |  * | 
 |  * Remarks: | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_mem_xalloc(ptr_, size_)  (ptr_) = ps_malloc(size_); | 
 | #define os_mem_xfree(ptr_)          {ps_free( *((void **)&(ptr_))); *((void **)&(ptr_)) = NULL;} | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_msleep | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      see below os_sleep_ms | 
 |  * | 
 |  * Parameters:   see below. | 
 |  * | 
 |  * Returns:      see below. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_msleep(millisec_)    os_sleep_ms(millisec_) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_next_state | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Go back to the read entry point of the process. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_next_state(p_var_, state_)  goto os_process_loop_l | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_now | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Return the number of ticks since system start. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_now(sample_id)    RetrieveClock(sample_id) | 
 |  | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_outsig_declare | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Declaration of an output signal. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_outsig_declare  xSignalHeaderRec  *yOutputSignalPtr; | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_outsig_get | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Get the pointer to the output signal. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      Pointer to the output signal. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_outsig_get()  (void *)(yOutputSignalPtr) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        OS_PROCESS | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Declaration of an operating system task. | 
 |  * | 
 |  * Parameters:   x: task name. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 | #ifdef OS_PROCESS | 
 | #undef OS_PROCESS | 
 | #endif | 
 | #define OS_PROCESS(x) void x(UNSIGNED argc, VOID *argv) | 
 | #define OS_PROCESS_RETURN(value_)  return; | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_process_begin | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Define the startup of an operting system process with | 
 |  *               input queue. | 
 |  * | 
 |  * Parameters:   Process variables with the generic header os_process_var. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 | /* | 
 | // P98C-YXS #if 0 | 
 | // P98C-YXS //#ifdef _OS_WIN | 
 | // P98C-YXS #if defined UNITEST | 
 | // P98C-YXS #define os_process_begin(var_, self_id_) \ | 
 | // P98C-YXS    unsigned char SelfId = self_id_; \ | 
 | // P98C-YXS    memset ( (void *) yVarP, 0, sizeof ( var_ ) ); \ | 
 | // P98C-YXS    yVarP->Self = ( (struct args *) argv ) -> self; \ | 
 | // P98C-YXS    yVarP->SelfId = (unsigned char)( ( (struct args *) argv ) -> self_id ); \ | 
 | // P98C-YXS    yVarP->Offspring = SDL_NULL; \ | 
 | // P98C-YXS    yVarP->SaveQ.succ = &(yVarP->SaveQ); \ | 
 | // P98C-YXS    yVarP->SaveQ.pred = &(yVarP->SaveQ); \ | 
 | // P98C-YXS    yVarP->CurrentInSaveQ = &(yVarP->SaveQ); \ | 
 | // P98C-YXS    yVarP->yInSignalPtr = 0;  | 
 | // P98C-YXS #else | 
 | // P98C-YXS #define os_process_begin(var_, self_id_) \ | 
 | // P98C-YXS    unsigned char SelfId = self_id_; \ | 
 | // P98C-YXS    (void) argc; \ | 
 | // P98C-YXS    memset ( (void *) yVarP, 0, sizeof ( var_ ) ); \ | 
 | // P98C-YXS    yVarP->Self = ( (struct args *) argv ) -> self; \ | 
 | // P98C-YXS    yVarP->SelfId = (unsigned char)( ( (struct args *) argv ) -> self_id ); \ | 
 | // P98C-YXS    yVarP->Offspring = SDL_NULL; \ | 
 | // P98C-YXS    yVarP->SaveQ.succ = &(yVarP->SaveQ); \ | 
 | // P98C-YXS    yVarP->SaveQ.pred = &(yVarP->SaveQ); \ | 
 | // P98C-YXS    yVarP->CurrentInSaveQ = &(yVarP->SaveQ); \ | 
 | // P98C-YXS    yVarP->yInSignalPtr = 0;  | 
 | // P98C-YXS #endif | 
 | // P98C-YXS //#endif | 
 | // P98C-YXS //#else | 
 | // P98C-YXS #endif | 
 | */ | 
 |  | 
 | #if defined UNITEST | 
 | #define os_process_begin(var_) \ | 
 |    TID            SelfId; \ | 
 |    memset ( (void *) yVarP, 0, sizeof ( var_ ) ); \ | 
 |    yVarP->Self = ( (struct args *) argv ) -> self; \ | 
 |    yVarP->SelfId = (unsigned char)( ( (struct args *) argv ) -> self_id ); \ | 
 |    yVarP->Offspring = SDL_NULL; \ | 
 |    yVarP->SaveQ.succ = &(yVarP->SaveQ); \ | 
 |    yVarP->SaveQ.pred = &(yVarP->SaveQ); \ | 
 |    yVarP->CurrentInSaveQ = &(yVarP->SaveQ); \ | 
 |    yVarP->yInSignalPtr = 0;  | 
 | #else | 
 | #define os_process_begin(var_) \ | 
 |    TID            SelfId; \ | 
 |    (void) argc; \ | 
 |    memset ( (void *) yVarP, 0, sizeof ( var_ ) ); \ | 
 |    yVarP->Self = ( (struct args *) argv ) -> self; \ | 
 |    yVarP->SelfId = (unsigned char)( ( (struct args *) argv ) -> self_id ); \ | 
 |    yVarP->Offspring = SDL_NULL; \ | 
 |    yVarP->SaveQ.succ = &(yVarP->SaveQ); \ | 
 |    yVarP->SaveQ.pred = &(yVarP->SaveQ); \ | 
 |    yVarP->CurrentInSaveQ = &(yVarP->SaveQ); \ | 
 |    yVarP->yInSignalPtr = 0;  | 
 | #endif | 
 | //#endif | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_process_loop | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Free the consumed signal and wait for the next signal on the | 
 |  *               input queue with the blocked method. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_process_loop(var_) \ | 
 |     os_process_loop_l: \ | 
 |         os_signal_free (var_##.yInSignalPtr); \ | 
 |         var_##.yInSignalPtr = os_signal_receive (var_##.Self); | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_process_vars | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Generic header of the process variables. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_process_vars   PROCESS_VARS | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        OS_PROCESS_ID | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Process Id of the current process | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_current_process()  (yVarP->Self) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_is_booting | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Return 1 if the OS executes the boot procedure otherwise 0. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | extern SINT32 nu_is_booting(VOID); | 
 | #define os_is_booting()   nu_is_booting() | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_t | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Semaphore data type | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | typedef NU_SEMAPHORE os_sem_t; | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_p | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Semaphore pointer declaration | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | typedef NU_SEMAPHORE *os_sem_p; | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_protect_t | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Semaphore data type | 
 |  *               This can oly be used in HISR context for Tasks use | 
 |  *               os_sem_t | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | typedef NU_PROTECT os_protect_t; | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_addr | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Address of a semaphore | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_sem_addr(sem_)  &sem_ | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macros:        OS_SEM_[TYPE] | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Define several styles of semaphores | 
 |  *               order of pending task execution. | 
 |  *               semaphore obtainer task acceleration | 
 |  *               task preemption deactivation | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define OS_SEM_FIFO 1 | 
 | #define OS_SEM_PRIORITY 2 | 
 | #define OS_SEM_CUSTOM_TYPES 3 | 
 | #define OS_SEM_CRIT_SECT OS_SEM_CUSTOM_TYPES | 
 | #define OS_SEM_NO_PREEMPT (OS_SEM_CUSTOM_TYPES+1) | 
 | #define OS_SEM_IRQ_LOCK (OS_SEM_CUSTOM_TYPES+2) | 
 | #define OS_SEM_CRIT_SECT_SIMPLE (OS_SEM_CUSTOM_TYPES+3) | 
 | #define OS_SEM_CS_DEFAULT OS_SEM_CRIT_SECT | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_create, os_ssem_create, os_protect_create | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Create a (static) semaphore and define the initial state. 1 means | 
 |  *               do not block after the first call, otherwise use 0. | 
 |  * | 
 |  * Parameters:   sem_:           Pointer to the semaphore. | 
 |  *               name_pref_:     Prefix of the semaphore's name. | 
 |  *               name_no_:       Postfix of the name to make the name unique. | 
 |  *               initial_count_: Initial semaphore count. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_ssem_create  os_sem_create | 
 | #define os_protect_create(sem_, name_pref_, name_no_, initial_count_)  | 
 |  | 
 | #if MS_OS_CRITICAL_SECTION_SUPPORT > 0 | 
 | extern VOID os_sem_create_t_func(NU_SEMAPHORE *sem_p, CHAR const*name_pref, | 
 |                                          SINT32 name_no, SINT32 initial_count_, SINT32 sema_style); | 
 |  | 
 | #define os_sem_create_t(sem_, name_pref_, name_no_, initial_count_, sema_style) \ | 
 | os_sem_create_t_func(&(sem_), name_pref_, name_no_, initial_count_, sema_style) | 
 |  | 
 | #define os_sem_create(sem_, name_pref_, name_no_, initial_count_) \ | 
 |  os_sem_create_t(sem_, name_pref_, name_no_, initial_count_, OS_SEM_FIFO) | 
 |  | 
 | #else | 
 |  | 
 | #define os_sem_create(sem_, name_pref_, name_no_, initial_count_) \ | 
 | do { \ | 
 |     UINT32  status; \ | 
 |     status = NU_Create_Semaphore( &(sem_), name_pref_, (initial_count_), NU_FIFO); \ | 
 |     if (status != ZOSS_SUCCESS) \ | 
 |         zOss_ASSERT(0); \ | 
 | } while (0) | 
 |  | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_reset | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Set the semaphore counter to the initial value. | 
 |  * | 
 |  * Parameters:   sem_:           Pointer to the semaphore. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_sem_reset(sem_)  \ | 
 | do { \ | 
 |     STATUS  status = NU_Reset_Semaphore ( &(sem_), 0 ); \ | 
 |     if (status != NU_SUCCESS) \ | 
 |         zOss_ASSERT(0); \ | 
 | } while (0) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_signal, os_protect | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Releases a previously obtained semaphore. If one or  | 
 |  *               more tasks are waiting, the first task is given the released | 
 |  *               instance of the semaphore.  Otherwise, the semaphore instance | 
 |  *               counter is simply incremented. | 
 |  * | 
 |  * Parameters:   sem_:           Pointer to the semaphore. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_protect(sem_)   | 
 |  | 
 | #if MS_OS_CRITICAL_SECTION_SUPPORT > 0 | 
 |  | 
 | extern VOID os_sem_signal_func(NU_SEMAPHORE *sem_p); | 
 | #define os_sem_signal(sem_)  \ | 
 | os_sem_signal_func(&(sem_)) | 
 |  | 
 | #else | 
 |  | 
 | #define os_sem_signal(sem_)  \ | 
 | do { \ | 
 |     UINT32  status = NU_Release_Semaphore(&(sem_)); \ | 
 |     if (status != ZOSS_SUCCESS) \ | 
 |         zOss_ASSERT(0); \ | 
 | } while (0) | 
 |  | 
 | #endif | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_wait, os_unprotect | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Decrement the semphore counter by 1. If the counter is | 
 |  *               greater than zero at the time of this call, this function can | 
 |  *               be completed immediately, otherwise suspension. | 
 |  * | 
 |  * Parameters:   sem_:           Pointer to the semaphore. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 |  | 
 | #define os_unprotect(sem_)   | 
 |  | 
 | #if MS_OS_CRITICAL_SECTION_SUPPORT > 0 | 
 |  | 
 | extern VOID os_sem_wait_func (NU_SEMAPHORE *sem_p); | 
 | #define os_sem_wait(sem_)  os_sem_wait_func(&(sem_)) | 
 |  | 
 | #else | 
 | #define os_sem_wait(sem_)  \ | 
 | do { \ | 
 |     UINT32 status = NU_Obtain_Semaphore ( &(sem_), NU_SUSPEND ); \ | 
 |     if (status != ZOSS_SUCCESS) \ | 
 |         zOss_ASSERT(0); \ | 
 | } while (0) | 
 | #endif | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sem_kill, os_ssem_kill,  os_protect_kill | 
 |  | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Destroy a (static) semphore. | 
 |  * | 
 |  * Parameters:   sem_:           Pointer to the semaphore. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_protect_kill | 
 | #define os_ssem_kill  os_sem_kill | 
 |  | 
 |  | 
 | #if MS_OS_CRITICAL_SECTION_SUPPORT > 0 | 
 |  | 
 | extern VOID os_sem_kill_func(NU_SEMAPHORE *sem_p); | 
 |  | 
 | #define os_sem_kill(sem_)  \ | 
 | os_sem_kill_func(&(sem_)) | 
 |  | 
 | #else | 
 | #define os_sem_kill(sem_)  \ | 
 | do { \ | 
 |     STATUS status = NU_Delete_Semaphore ( &(sem_) ); \ | 
 |     if (status != NU_SUCCESS) \ | 
 |         zOss_ASSERT(0); \ | 
 | } while (0) | 
 | #endif | 
 |  | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_t | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Generic part of an I/O signal. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | typedef xSignalHeaderRec os_signal_t; | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_print | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Prints strings to the trace output. | 
 |  * | 
 |  * Parameters:   str_: String to be printed. | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 | #if 0 | 
 | #define os_print(str_)    hwtrc_print (str_) | 
 | #define os_task_info(state_, self_id_, sig_cod_, msg_, len_)  \ | 
 |             hwtrc_task_info(state_, self_id_, sig_cod_, msg_, len_)  | 
 |  | 
 |      | 
 | /**B************************************************************************* | 
 |  * Macro:        os_nprint | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Prints the first n chars of a string to the trace output. | 
 |  * | 
 |  * Parameters:   str_: string | 
 |  *               n_:   number of chars in str_ | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_nprint(str_, n_)    hwtrc_write (str_, n_) | 
 |  | 
 |      | 
 | /**B************************************************************************* | 
 |  * Macro:        os_write | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Send n bytes to the trace output. | 
 |  * | 
 |  * Parameters:   buf_: char sequence | 
 |  *               n_: number of chars in buf_ | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_write(buf_, n_)    hwtrc_write (buf_, n_) | 
 | #endif | 
 |      | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_alloc | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Allocation of a message buffer for a signal from the  | 
 |  *               specified partition pool. | 
 |  * | 
 |  * Parameters:   signal_id_:   Corresponding ID (process index + message id) | 
 |  *                             to the message type. | 
 |  *               signal_type_: Message type used to allocate a message buffer. | 
 |  * | 
 |  * Returns:      Pointer to the allocated message buffer. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_alloc(signal_id_, signal_type_) \ | 
 |      { xSignalHeader yOutputSignalPtr = \ | 
 |        alloc_sig( sizeof (signal_type_) ); \ | 
 |        yOutputSignalPtr->Sender = 0; \ | 
 |        yOutputSignalPtr->SignalCode = (signal_id_); | 
 |      | 
 |      | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_alloc_from | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Allocation of a message buffer for a signal from the  | 
 |  *               specified partition pool. | 
 |  * | 
 |  * Parameters:   sender_pid_:  Used to send back signals. | 
 |  *               signal_id_:   Corresponding ID (process index + message id) | 
 |  *                             to the message type. | 
 |  *               signal_type_: Message type used to allocate a message buffer. | 
 |  * | 
 |  * Returns:      Pointer to the allocated message buffer. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_alloc_from(sender_pid_, signal_id_, signal_type_) \ | 
 |      { xSignalHeader yOutputSignalPtr = \ | 
 |        alloc_sig( sizeof (signal_type_) ); \ | 
 |        yOutputSignalPtr->Sender = (sender_pid_); \ | 
 |        yOutputSignalPtr->SignalCode = (signal_id_); | 
 |      | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_alloc_from_to | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Allocation of a message buffer for a signal from the  | 
 |  *               specified partition pool with generic receiver. | 
 |  * | 
 |  * Parameters:   signal_id_:   Corresponding ID (process index + message id) | 
 |  *                             to the message type. | 
 |  *               signal_type_: Message type used to allocate a message buffer. | 
 |  *               receiver_:    PID of the receiver process.* | 
 |  *                | 
 |  * Returns:      Pointer to the allocated message buffer. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_alloc_from_to(sender_pid_, receiver_, signal_id_, signal_type_) \ | 
 |      yOutputSignalPtr = \ | 
 |        alloc_sig(sizeof(signal_type_)); \ | 
 |        yOutputSignalPtr->Sender = (sender_pid_); \ | 
 |        yOutputSignalPtr->SignalCode = (signal_id_);  | 
 |      | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_alloc_to | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Allocation of a message buffer for a signal from the  | 
 |  *               specified partition pool with generic receiver. | 
 |  * | 
 |  * Parameters:   signal_id_:   Corresponding ID (process index + message id) | 
 |  *                             to the message type. | 
 |  *               signal_type_: Message type used to allocate a message buffer. | 
 |  *               receiver_:    PID of the receiver process.* | 
 |  *                | 
 |  * Returns:      Pointer to the allocated message buffer. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_alloc_to(receiver_, signal_id_, signal_type_) \ | 
 |      yOutputSignalPtr = \ | 
 |        alloc_sig(sizeof(signal_type_)); \ | 
 |        yOutputSignalPtr->SignalCode = (signal_id_);  | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_paramassign | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Set a scalar paramter value. | 
 |  * | 
 |  * Parameters:   sig_:      Pointer to the signal header. | 
 |  * | 
 |  *               param_no_: Number of the parameter to be set. | 
 |  * | 
 |  *               value_:    Source value. | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_paramassign(sig_, param_no_, value_) \ | 
 |   ((yPDef_##sig_ *) OUTSIGNAL_DATA_PTR)->Param##param_no_ = (value_) | 
 |  | 
 |   | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_paramcopy | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Copies parameter values into a signal message buffer. | 
 |  * | 
 |  * Parameters:   sig_:      Pointer to the signal header. | 
 |  * | 
 |  *               param_no_: Number of the parameter to be set | 
 |  * | 
 |  *               src_adr_:  Source address | 
 |  * | 
 |  *               size_t:    Parameter size | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_paramcopy(sig_, param_no_, src_adr_, size_) \ | 
 |  memcpy( (void *) &(((yPDP_##sig_)(OUTSIGNAL_DATA_PTR))->Param##param_no_), \ | 
 |          (void *)(src_adr_), \ | 
 |          (size_) ); | 
 |  | 
 |   | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_paramreset | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Resets parameter values of a signal message buffer. | 
 |  * | 
 |  * Parameters:   sig_:      Pointer to the signal header. | 
 |  * | 
 |  *               param_no_: Number of the parameter to be reset | 
 |  * | 
 |  *               size_t:    Parameter size | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_paramreset(sig_, param_no_, size_) | 
 |      | 
 |   | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_free | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Deallocation of a message buffer for a signal.  | 
 |  * | 
 |  * Parameters:   signal_ptr: pointer to the signal allocated with | 
 |  *               os_signal_alloc(). | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |   | 
 | #define os_signal_free  free_sig | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_id | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Extract the signal id from the received input signal | 
 |  * | 
 |  * Parameters:   signal_ptr:: pointer to the received signal. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_id(signal_ptr_)  SIGNAL_NAME (signal_ptr_->SignalCode, 0) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_receive | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Wait for a signal to arrive. After having performed a | 
 |  *               transition, | 
 |  *               each process waits here for the next signal to arrive. Once | 
 |  *               a signal is available, it is taken out of the queue and the  | 
 |  *               next transition takes place. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      Pointer to message buffer. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_receive(self_)  receive_sig(self_) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_route | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Route and send signal according to signal code. | 
 |  *               The signal code is an element of the generic signal header. | 
 |  *               This element is set in os_signal_alloc(). | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_route(signal_id_, signal_name_) \ | 
 |     send_sig_no_to (yOutputSignalPtr, signal_id_, signal_name_); } | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_send | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      The given signal is send to the specified task queue. | 
 |  * | 
 |  * Parameters:   receiver_: PID of the receiver process. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_send(receiver_, signal_name_) \ | 
 |     SEND_SIG (yOutputSignalPtr, receiver_, signal_name_ ); | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_signal_vars | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Generic signal header. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_signal_vars   SIGNAL_VARS | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_timer_t | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Type definition of a timer mapped to an input signal. | 
 |  * | 
 |  * Parameters:   None. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | typedef char  os_timer_t;  /* It is a dummy type. */ | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_timer_start | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      A timer is started with an expiry time relative to the  | 
 |  *               current system time. The call of os_timer_start() | 
 |  *               causes an implicit stop of the timer. | 
 |  *               The timer queue, the processes' save and input queues are | 
 |  *               searched for the timer signal. | 
 |  *               If the timer signal can be found there, it is taken from the | 
 |  *               queue and the timer is started anew. If the timer is neither | 
 |  *               running nor can the timer signal be found in the process | 
 |  *               queues, a message buffer for the timer signal is allocated. | 
 |  *               This block (re-used or newly allocated) is | 
 |  *               then enqueued at the proper place in the timer queue. | 
 |  * | 
 |  * Parameters:   Import of the process variables as yVarP with the generic  | 
 |  *               header (os_process_var). | 
 |  *               t_name_: name of the timer variable, must be an element of  | 
 |  *               the process variables. | 
 |  *               t_id_: timer id, used as input signal. | 
 |  *               secs_: number of seconds (long). | 
 |  *               nano_secs_: nano seconds (long). | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_timer_start(t_name_, t_id_, tick_expr_,sample_id) \ | 
 | do { \ | 
 |     SDL_SET_DUR (0, tick_expr_, t_id_, 0, t_name_, "",sample_id); \ | 
 | } while (0) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_timer_stop | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      A timer is stopped. | 
 |  *               The timer queue, the processes' save and input queues are | 
 |  *               searched for the timer signal.  | 
 |  *               If the timer signal can be found there, it is removed from | 
 |  *               the queue, and the timer signal (i. e. the message buffer) | 
 |  *               is freed. | 
 |  * | 
 |  * Parameters:   Import of the process variables as yVarP with the generic | 
 |  *               header (os_process_var). | 
 |  *               t_name_: name of the timer variable, | 
 |  *                        must be an element of the process variables. | 
 |  *               t_id_: timer id, used as input signal. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_timer_stop(t_name_, t_id_) \ | 
 | do { \ | 
 |     SDL_RESET (t_id_, 0, t_name_, ""); \ | 
 | } while (0) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_timer_stop_with_para | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      A timer is stopped. | 
 |  *               The timer queue, the processes' save and input queues are | 
 |  *               searched for the timer signal.  | 
 |  *               If the timer signal can be found there, it is removed from | 
 |  *               the queue, and the timer signal (i. e. the message buffer) | 
 |  *               is freed. | 
 |  * | 
 |  * Parameters:   Import of the process variables as yVarP with the generic | 
 |  *               header (os_process_var). | 
 |  *               t_name_: name of the timer variable, | 
 |  *                        must be an element of the process variables. | 
 |  *               t_id_: timer id, used as input signal. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_timer_stop_with_para(t_name_, t_id_, t_param,sample_id) \ | 
 | do { \ | 
 |     SDL_Reset (t_id_, t_param, (t_process_vars *) yVarP,sample_id); \ | 
 | } while (0) | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_timer_start_with_para | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      A timer is started with an expiry time relative to the  | 
 |  *               current system time. The call of os_timer_start() | 
 |  *               causes an implicit stop of the timer. | 
 |  *               The timer queue, the processes' save and input queues are | 
 |  *               searched for the timer signal. | 
 |  *               If the timer signal can be found there, it is taken from the | 
 |  *               queue and the timer is started anew. If the timer is neither | 
 |  *               running nor can the timer signal be found in the process | 
 |  *               queues, a message buffer for the timer signal is allocated. | 
 |  *               This block (re-used or newly allocated) is | 
 |  *               then enqueued at the proper place in the timer queue. | 
 |  * | 
 |  * Parameters:   Import of the process variables as yVarP with the generic  | 
 |  *               header (os_process_var). | 
 |  *               t_name_: name of the timer variable, must be an element of  | 
 |  *               the process variables. | 
 |  *               t_id_: timer id, used as input signal. | 
 |  *               secs_: number of seconds (long). | 
 |  *               nano_secs_: nano seconds (long). | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | #if defined (SDL_SET_DUR_EX) | 
 |   | 
 | #define os_timer_soft_start_with_para(t_name_, t_id_, t_param, earliest_tick_expr_, latest_tick_expr_,sample_id) \ | 
 | do { \ | 
 |     SDL_Set_Dur_Ex (earliest_tick_expr_, latest_tick_expr_, t_id_, t_param, (t_process_vars *) yVarP,sample_id); \ | 
 | } while (0) | 
 |  | 
 | #define os_timer_start_with_para(t_name_, t_id_, t_param, tick_expr_,sample_id) \ | 
 | do { \ | 
 |     SDL_Set_Dur (tick_expr_, t_id_, t_param, (t_process_vars *) yVarP,sample_id); \ | 
 | } while (0) | 
 |  | 
 | #else | 
 |   | 
 | #define os_timer_start_with_para(t_name_, t_id_, t_param, tick_expr_,sample_id) \ | 
 | do { \ | 
 |     SDL_Set_Dur (tick_expr_, t_id_, t_param, (t_process_vars *) yVarP,sample_id); \ | 
 | } while (0) | 
 |  | 
 | #define os_timer_soft_start_with_para(t_name_, t_id_, t_param, earliest_tick_expr_, latest_tick_expr_,sample_id) \ | 
 | do { \ | 
 |     SDL_Set_Dur (earliest_tick_expr_, t_id_, t_param, (t_process_vars *) yVarP,sample_id); \ | 
 | } while (0) | 
 |   | 
 | #endif | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_is_task_call | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:    Nucleus often crashes if a TASK functions are called  | 
 |  *             from HISR and LISR  context      | 
 |  *              | 
 |  * | 
 |  * Parameters: NONE | 
 |  * | 
 |  * Returns:   0 if it is a HISR or LISR context   | 
 |  *            1 if it is a TASK context | 
 |  ***E************************************************************************/ | 
 |  | 
 | #define os_is_task_call() (NU_Current_Task_Pointer() != NULL) | 
 |  | 
 |  | 
 | /*=========================================================================== | 
 | EXPORTED TYPE DECLARATIONS | 
 | ===========================================================================*/ | 
 |  | 
 | typedef void (* os_timeout_handler) (void *arg); | 
 |  | 
 |  | 
 | /*============================================================================ | 
 | EXPORTED FUNCTIONS | 
 | ============================================================================*/ | 
 |  | 
 | /**B************************************************************************ | 
 |  * Function:     os_init | 
 |  *-------------------------------------------------------------------------- | 
 |  * Purpose:      Module initialization for MS OS abstraction layer. | 
 |  * | 
 |  * Parameters:   None | 
 |  * | 
 |  * Returns:      None | 
 |  ***E***********************************************************************/ | 
 |  | 
 | extern VOID os_init(VOID); | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Function:     os_sdlpid_current | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Return the SDL pid of the current task. | 
 |  * | 
 |  * Parameters:   None | 
 |  * | 
 |  * Returns:      SDL pid. | 
 |  ***E************************************************************************/ | 
 |  | 
 | extern OS_pid_t os_sdlpid_current(VOID); | 
 |  | 
 |   | 
 | /**B************************************************************************* | 
 |  * Function:     os_sdlpid_deregister | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Remove the pid of an SDL process. | 
 |  * | 
 |  * Parameters:   None | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 |  | 
 | extern VOID os_sdlpid_deregister(VOID); | 
 |  | 
 |   | 
 | /**B************************************************************************* | 
 |  * Function:     os_sdlpid_register | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      os_sdlpid_current | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Return the SDL pid of the current task. | 
 |  * | 
 |  * Parameters:   None | 
 |  * | 
 |  * Returns:      SDL pid. | 
 |  ***E************************************************************************/ | 
 |  | 
 | extern OS_pid_t os_sdlpid_current(VOID); | 
 |   | 
 |   | 
 | /**B************************************************************************* | 
 |  * Function:     os_sdlpid_deregister | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Save the pid of an SDL process. | 
 |  * | 
 |  * Parameters:   SDL pid | 
 |  * | 
 |  * Returns:      None | 
 |  ***E************************************************************************/ | 
 |  | 
 | // P98C-YXS extern VOID os_sdlpid_register(OS_pid_t sdl_pid); | 
 |  | 
 |   | 
 | /**B************************************************************************* | 
 |  * Macro:        os_sleep_ms | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      os_sleep_ms() makes the current process sleep until ms | 
 |  *               milliseconds have  elapsed. | 
 |  * | 
 |  * Parameters:   unsigned long ms: # of milliseconds | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | extern VOID os_sleep_ms(UNSIGNED ms);  | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_task_create | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      This procedure creates an application task.  | 
 |  * | 
 |  * Parameters: | 
 |  * task        Pointer to th user-supplied task control block. | 
 |  * name        Pointer to an 8 character name for the task. | 
 |  * entry       Specifies the entry function of the task. | 
 |  * stack       Designates the starting memory location of the tasks | 
 |  *             stack area. | 
 |  * stack_size  Specifies the number of bytes in the stack. | 
 |  * priority    Specifies a priority value between 0 and 255. The lower | 
 |  *             numeric value, the higher the tasks priority. | 
 |  * | 
 |  * Returns:    1 indicates successful completion of the service, | 
 |  *             otherwise 0 or soft crash.. | 
 |  ***E************************************************************************/ | 
 | typedef NU_TASK *os_task_id_t; | 
 | typedef VOID    *os_task_stack_t; | 
 | typedef VOID (*os_task_func_t)(SINT32); | 
 | typedef OPTION  os_task_prio_t; | 
 |  | 
 | // P98C-YXS extern SINT32 os_task_create (os_task_id_t     *id, | 
 | // P98C-YXS 			   CHAR             *name, | 
 | // P98C-YXS 			   os_task_func_t    entry, | 
 | // P98C-YXS 			   os_task_stack_t  *stack, | 
 | // P98C-YXS 			   UNSIGNED            stack_size, | 
 | // P98C-YXS 			   os_task_prio_t    priority); | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_timeout | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Schedule a timeout a specified amount of seconds in the | 
 |  *               future. When the timeout occurs, the specified timeout | 
 |  *               handler will be called. The handler will be passed the | 
 |  *               "arg" argument when called. | 
 |  * | 
 |  * Parameters:   unsigned char secs:    # of seconds | 
 |  *               os_timeout_handler h:  timer handler. | 
 |  *               void *arg:             argument of the timer handler. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | // P98C-YXS extern VOID os_timeout(UINT8 secs, os_timeout_handler h, VOID *arg); | 
 |  | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_timeout_ms | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Schedule a timeout a specified amount of milliseconds in the | 
 |  *               future. When the timeout occurs, the specified timeout | 
 |  *               handler will be called. The handler will be passed the | 
 |  *               "arg" argument when called. | 
 |  * | 
 |  * Parameters:   unsigned long ms:      # of seconds | 
 |  *               os_timeout_handler h:  timer handler. | 
 |  *               void *arg:             argument of the timer handler. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |   | 
 | // P98C-YXS extern VOID os_timeout_ms(UNSIGNED ms, os_timeout_handler h, VOID *arg); | 
 |   | 
 |  | 
 | /**B************************************************************************* | 
 |  * Macro:        os_untimeout | 
 |  *--------------------------------------------------------------------------- | 
 |  * Purpose:      Deinstall the timeout handler activated about os_timeout or | 
 |  *               about os_timeout_ms. | 
 |  * | 
 |  * Parameters:   os_timeout_handler h:  timer handler. | 
 |  *               void *arg:             argument of the timer handler. | 
 |  * | 
 |  * Returns:      None. | 
 |  ***E************************************************************************/ | 
 |  | 
 | // P98C-YXS extern VOID os_untimeout(os_timeout_handler h, VOID *arg); | 
 |   | 
 | #endif  | 
 |  | 
 | /* ms_os.h ends here. */ | 
 |  |