posix4.c

来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 1,531 行 · 第 1/5 页

C
1,531
字号
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/ports/posix4/src/posix4.c</TITLE></HEAD><BODY><pre><font color="#6920ac">/*************************************************************************/</font><font color="#6920ac">/*                                                                       */</font><font color="#6920ac">/*     Copyright (c) 1997-1999 Australian Real Time Embedded Systems     */</font><font color="#6920ac">/*                                                                       */</font><font color="#6920ac">/* PROPRIETARY RIGHTS of Australian Real Time Embedded Systems           */</font><font color="#6920ac">/* are involved in the subject matter of this material. All reproduction,*/</font><font color="#6920ac">/* manufacturing, use, and sales rights pertaining to this subject matter*/</font><font color="#6920ac">/* are governed by the license agreement. The recipient of this software */</font><font color="#6920ac">/* implicitly accepts the terms of the license.                          */</font><font color="#6920ac">/*                                                                       */</font><font color="#6920ac">/*************************************************************************/</font><font color="#6920ac">/************************************************************************* * * FILE NAME * *      posix4.c * * SYSTEM COMPONENT * *      POSIX.4 Family * * DESCRIPTION * *      This file contains services specific for POSIX.4 real-time *      extension * * SCCS HISTORY * *      @(#)posix4.c    1.12, 03/06/00, 19:32:44 * * SERVICES * *      POSIX.4 specific services *      ------------------------- * *      psx4_SignalHandler      - real-time signal handler *      psx4_GetSignalInfo      - get pointer to signal info block *      psx4_VecToSignal        - convert intr vector into posix signal *      psx4_SigTovector        - convert posix signal into intr vector  * *      Services for hardware interrupt manager *      --------------------------------------- *      hrdi_Start              - activate hardware interrupt system *      hrdi_Inc                - atomic increment *      hrdi_Dec                - atomic decrement  *      hrdi_Zero               - atomic zero *      hrdi_Assign             - atomic assignment *      hrdi_And                - atomic bit-wise and *      hrdi_Or                 - atomic bit-wise or *      hrdi_Xor                - atomic bit-wise xor *      hrdi_Not                - atomic not *      hrdi_FastIntrEnable     - enable interrupts quickly *      hrdi_FastIntrDisable    - disable registered interrupts quickly *      hrdi_GlobalIntrDisable  - disable global interrupt flag *      hrdi_GlobalIntrEnable   - enable global interrupt flag *      hrdi_Dispatcher         - default hardware interrupt dispatcher *      hrdi_SwitchStack        - switch to LISR stack and execute LISR handler *      hrdi_EnableVector *      hrdi_DisableVector *      hrdi_Mask *      hrdi_Disable *      hrdi_Enable *      hrdi_SetLisrIntrMask *      hrdi_IsNested *      hrdi_MakeLisrStackFrame *      hrdi_PrepareStack *      hrdi_CheckStack *      hrdi_RegisterDISR *      hrdi_UnregisterDISR *      hrdi_RegisterDispatcher *      hrdi_UnregisterDispatcher * *      Services for software interrupt manager *      --------------------------------------- *      sfti_MakeHisrStackFrame *      sfti_CheckStack *      sfti_PrepareStack *      sfti_SwitchStack        - switch to HISR stack and execute HISR handler * *      Services for thread control component  *      ------------------------------------- *      thrd_MakeThreadStackFrame *      thrd_CheckStack *      thrd_MaxSP *      thrd_AdjustMaxSP *      thrd_StackUsage *      thrd_GetStackFrames *      thrd_Idlethread *      thrd_SwitchStack        - switch thread context *      thrd_GetStackFrameRegs * *      GDB monitor support *      ------------------- *      gdbm_GetRegisters * *      Services for System Timer *      ------------------------- *      tick_LISR *      tick_SetupSystemTimer *      tick_ClocksSinceReset * *      Others *      ------ *      port_Init *      port_Fatal *      port_Abort *      port_Exit *      port_InitSerial *      port_Putc * * AUTHOR * *      Vadim N. Azarovsky * * CREATED * *      14-Feb-1998         by Vadim N. Azarovsky * * REVISION HISTORY * *      NAME                DATE                    REMARKS * **************************************************************************/</font><b><font color='DarkGreen'>#include</font></b> <a href="env_defs.h.FIND-INC"><font color="blue">"env_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="crt_defs.h.FIND-INC"><font color="blue">"crt_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="sys_priv.h.FIND-INC"><font color="blue">"sys_priv.h"</font></a><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (CRTX_CPU_FAMILY==CRTX_POSIX4)</font><b><font color='DarkGreen'>#define</font></b>  <font color="maroon"><a name="_POSIX_SOURCE">_POSIX_SOURCE</a></font><b><font color='DarkGreen'>#define</font></b>  <font color="maroon"><a name="_POSIX_C_SOURCE">_POSIX_C_SOURCE</a></font>    199309L     <font color="#6920ac">/* Release: September 1993 */</font><b><font color='DarkGreen'>#define</font></b>  <font color="maroon"><a name="_REENTRANT">_REENTRANT</a></font><b><font color='DarkGreen'>#include</font></b> <a href="unistd.h.FIND-INC">&lt;<font color="blue">unistd.h</font>&gt;</a><font color="#6920ac">/*  * Verify that POSIX.4 and all required POSIX's components are available */</font><b><font color='DarkGreen'>#ifndef</font></b><font color="maroon">  _POSIX_VERSION</font><b><font color='DarkGreen'># error</font></b><font color="maroon">  <font color="DarkGreen">"POSIX is not supported!"</font></font><b><font color='DarkGreen'>#else</font></b><font color="maroon"> <font color="#6920ac">/* _POSIX_VERSION */</font></font><b><font color='DarkGreen'># if</font></b><font color="maroon">  _POSIX_VERSION == 199009L         <font color="#6920ac">/* Release: September 1990 */</font></font><b><font color='DarkGreen'>#  error</font></b><font color="maroon"> <font color="DarkGreen">"POSIX.1 is supported but not POSIX.4!"</font></font><b><font color='DarkGreen'># else</font></b><font color="maroon"></font><b><font color='DarkGreen'>#  if</font></b><font color="maroon"> _POSIX_VERSION &gt;= 199309L</font><b><font color='DarkGreen'>#   ifndef</font></b><font color="maroon"> _POSIX_TIMERS</font><b><font color='DarkGreen'>#    error</font></b><font color="maroon"> <font color="DarkGreen">"POSIX TIMERS are not supported!"</font></font><b><font color='DarkGreen'>#   endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#   ifndef</font></b><font color="maroon"> _POSIX_REALTIME_SIGNALS</font><b><font color='DarkGreen'>#    error</font></b><font color="maroon"> <font color="DarkGreen">"POSIX REAL-TIME SIGNALS are not supported!"</font></font><b><font color='DarkGreen'>#   endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#   ifndef</font></b><font color="maroon"> _POSIX_ASYNCHRONOUS_IO</font><b><font color='DarkGreen'>#    error</font></b><font color="maroon"> <font color="DarkGreen">"POSIX ASYNCHRONOUS I/O is not supported!"</font></font><b><font color='DarkGreen'>#   endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#  else</font></b><font color="maroon"></font><b><font color='DarkGreen'>#   error</font></b><font color="maroon"> <font color="DarkGreen">"POSIX VERISON value is between 199009 an199309!"</font></font><b><font color='DarkGreen'>#  endif</font></b><font color="maroon"></font><b><font color='DarkGreen'># endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* _POSIX_VERSION */</font></font><b><font color='DarkGreen'>#include</font></b> <a href="limits.h.FIND-INC">&lt;<font color="blue">limits.h</font>&gt;</a><b><font color='DarkGreen'>#include</font></b> <a href="signal.h.FIND-INC">&lt;<font color="blue">signal.h</font>&gt;</a><b><font color='DarkGreen'>#include</font></b> <a href="aio.h.FIND-INC">&lt;<font color="blue">aio.h</font>&gt;</a><b><font color='DarkGreen'>#include</font></b> <a href="time.h.FIND-INC">&lt;<font color="blue">time.h</font>&gt;</a><b><font color='DarkGreen'>#include</font></b> <a href="setjmp.h.FIND-INC">&lt;<font color="blue">setjmp.h</font>&gt;</a><b><font color='DarkGreen'>#include</font></b> <a href="errno.h.FIND-INC">&lt;<font color="blue">errno.h</font>&gt;</a><b><font color='DarkGreen'>#include</font></b> <a href="ucontext.h.FIND-INC">&lt;<font color="blue">ucontext.h</font>&gt;</a><b><font color='DarkGreen'>#include</font></b> <a href="ass_defs.h.FIND-INC"><font color="blue">"ass_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="hwi_priv.h.FIND-INC"><font color="blue">"hwi_priv.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="swi_priv.h.FIND-INC"><font color="blue">"swi_priv.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="thr_priv.h.FIND-INC"><font color="blue">"thr_priv.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="tck_priv.h.FIND-INC"><font color="blue">"tck_priv.h"</font></a><font color="#6920ac">/* Verify max number of supported task arguments */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> THRD_MAX_ARGS_NUM &gt; 10</font><b><font color='DarkGreen'># error</font></b><font color="maroon"> <font color="DarkGreen">"Too many thread arguments are requested."</font></font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGRTMIN">PSX4_SIGRTMIN</a></font>   psx4_SigRTMin_g<b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGRTMAX">PSX4_SIGRTMAX</a></font>   psx4_SigRTMax_g<font color="#6920ac">/* macro to convert interrupt vector into signal number */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_VEC_TO_SIGNAL">PSX4_VEC_TO_SIGNAL</a></font>(Vector_a)    (PSX4_SIGRTMIN+(Vector_a))<font color="#6920ac">/* macro to convert signal number into interrupt vector */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIG_TO_VECTOR">PSX4_SIG_TO_VECTOR</a></font>(Signal_a)    ((Signal_a)-PSX4_SIGRTMIN)<b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL &gt;= 1</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGPROCMASK">PSX4_SIGPROCMASK</a></font>(op,nset,oset) \        <b>if</b> (<a href="sigprocmask.FIND-FUNC">sigprocmask</a>(op,nset,oset) &lt; 0) \            <a href="syst_Fatal.FIND-FUNC">syst_Fatal</a>(<font color="DarkGreen">"sigprocmask() failed (Errno %d)\n"</font>, errno)<b><font color='DarkGreen'>#else</font></b><font color="maroon"></font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGPROCMASK">PSX4_SIGPROCMASK</a></font>(op,nset,oset) sigprocmask(op,nset,oset)<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL &gt;= 1 */</font></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> defined(__sparc)</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGMASK">PSX4_SIGMASK</a></font>(n)     ((unsigned int)1&lt;&lt;(((n)-1)&amp;(32-1)))<b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGWORD">PSX4_SIGWORD</a></font>(n)     (((unsigned int)((n)-1))&gt;&gt;5)<b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGADDSET">PSX4_SIGADDSET</a></font>(s, n) \                            ((s)-&gt;__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(n)]|=<a href="#PSX4_SIGMASK">PSX4_SIGMASK</a>(n))<b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGDELSET">PSX4_SIGDELSET</a></font>(s, n) \                            ((s)-&gt;__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(n)]&amp;=~<a href="#PSX4_SIGMASK">PSX4_SIGMASK</a>(n))<b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGISMEMBER">PSX4_SIGISMEMBER</a></font>(s, n) \                            (<a href="#PSX4_SIGMASK">PSX4_SIGMASK</a>(n) &amp; (s)-&gt;__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(n)])<b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGISEMPTY">PSX4_SIGISEMPTY</a></font>(s) \                            (!(((s)-&gt;__sigbits[0])|((s)-&gt;__sigbits[1])))<font color="#6920ac">/* macro to convert signal set into interrupt mask */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SET_TO_MASK">PSX4_SET_TO_MASK</a></font>(Set,Mask) \    Mask = \    ((~(((Set)-&gt;__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)])&gt;&gt;\            (((<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)-1)&amp;(32-1))))&amp;\            <a href="PSX4_INTR_VECTORS_MASK.FIND-DEF">PSX4_INTR_VECTORS_MASK</a>)<font color="#6920ac">/* macro to convert interrupt mask into signal set */</font><b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_MASK_TO_SET">PSX4_MASK_TO_SET</a></font>(Mask,Set) \    (Set)-&gt;__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)] &amp;= \            ~((<a href="PSX4_INTR_VECTORS_MASK.FIND-DEF">PSX4_INTR_VECTORS_MASK</a>)&lt;&lt;(((<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)-1)&amp;(32-1))); \    (Set)-&gt;__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)] |= \            ((~Mask)&amp;<a href="PSX4_INTR_VECTORS_MASK.FIND-DEF">PSX4_INTR_VECTORS_MASK</a>)&lt;&lt;(((<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)-1)&amp;(32-1))<b><font color='DarkGreen'>#else</font></b><font color="maroon"></font><b><font color='DarkGreen'># error</font></b><font color="maroon"> <font color="DarkGreen">"Unsupported CPU!!!"</font></font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> HRDI_USE_CORTEX_SCNDRY_INTR_TBL == 1</font><i>crtx_Void_t</i> *_hrdi_ISRsCode_g[<a href="PSX4_INTR_VECTORS.FIND-DEF">PSX4_INTR_VECTORS</a>] = {    (<i>crtx_Void_t</i>*)hrdi_Dispatcher,          <font color="#6920ac">/* PSX4_TIMER1_VECTOR  */</font>    (<i>crtx_Void_t</i>*)hrdi_Dispatcher,          <font color="#6920ac">/* PSX4_TIMER2_VECTOR  */</font>    (<i>crtx_Void_t</i>*)hrdi_Dispatcher,          <font color="#6920ac">/* PSX4_SERIAL1_VECTOR */</font>    (<i>crtx_Void_t</i>*)hrdi_Dispatcher           <font color="#6920ac">/* PSX4_SERIAL2_VECTOR */</font>};<b><font color='DarkGreen'># if</font></b><font color="maroon"> HRDI_SCNDRY_INTR_TBL_IN_RAM == 1</font><i>crtx_Void_t</i> *_hrdi_ISRs_g[<a href="PSX4_INTR_VECTORS.FIND-DEF">PSX4_INTR_VECTORS</a>];<b><font color='DarkGreen'># endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_SCNDRY_INTR_TBL_IN_RAM == 1 */</font></font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_USE_CORTEX_SCNDRY_INTR_TBL == 1 */</font></font><font color="#6920ac">/* base address of secondary interrupt table */</font><b><font color='DarkGreen'># if</font></b><font color="maroon"> HRDI_SCNDRY_INTR_TBL_IN_RAM == 1</font><i>crtx_Void_t</i> *hrdi_VectorBase_g = _hrdi_ISRs_g;<b><font color='DarkGreen'>#else</font></b><font color="maroon"></font><i>crtx_Void_t</i> *hrdi_VectorBase_g = _hrdi_ISRsCode_g;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* HRDI_SCNDRY_INTR_TBL_IN_RAM == 1 */</font></font><font color="#6920ac">/* pointer to primary interrupt table */</font><i>crtx_Void_t</i>     *hrdi_Vectors_g;<font color="#6920ac">/* signal mask/set to be used to disable all interrupt sources */</font>sigset_t        psx4_SigSetDisableAll_g;<font color="#6920ac">/* system timer */</font>timer_t     psx4_SystemTimer_g;<font color="#6920ac">/* min and max real-time signals */</font><i>crtx_Int_t</i> psx4_SigRTMin_g;<i>crtx_Int_t</i> psx4_SigRTMax_g;<font color="#6920ac">/* previous signal disposition */</font>sigset_t      psx4_PrevIntrMask_g;<font color="#6920ac">/* signal info data for all signals */</font>siginfo_t  psx4_SigInfo_g [<a href="PSX4_INTR_VECTORS.FIND-DEF">PSX4_INTR_VECTORS</a>];ucontext_t psx4_UContext_g[<a href="PSX4_INTR_VECTORS.FIND-DEF">PSX4_INTR_VECTORS</a>];<i><a name="psx4_ThreadFrame_t">typedef</a></i> <i>struct</i> psx4_ThreadFrame_s {    jmp_buf         JmpBuf;             <font color="#6920ac">/* long jump frame */</font>} <i><font color='DarkBlue'>psx4_ThreadFrame_t</font></i>;<i><a name="psx4_LisrFrame_t">typedef</a></i> <i>struct</i> psx4_LisrFrame_s {    jmp_buf         JmpBuf;             <font color="#6920ac">/* long jump frame */</font>    <i>hrdi_ISRCB_t</i>    *pLISR;             <font color="#6920ac">/* pointer to LISR control block */</font>} <i><font color='DarkBlue'>psx4_LisrFrame_t</font></i>;<i><a name="psx4_HisrFrame_t">typedef</a></i> <i>struct</i> psx4_HisrFrame_s {    jmp_buf         JmpBuf;             <font color="#6920ac">/* long jump frame */</font>    <i>sfti_ISRCB_t</i>    *pHISR;             <font color="#6920ac">/* pointer to HISR control block */</font>} <i><font color='DarkBlue'>psx4_HisrFrame_t</font></i>;<b><font color='DarkGreen'>#if</font></b><font color="maroon"> defined(__sparc)</font><i><a name="crtx_JmpBuf_t">typedef</a></i> <i>struct</i> crtx_JmpBuf_s {    <i>crtx_Uint32_t</i>   Unknown_1;      <font color="#6920ac">/* unknown field */</font>    <i>crtx_Uint32_t</i>   SP;             <font color="#6920ac">/* stack pointer */</font>    <i>crtx_Uint32_t</i>   PC;             <font color="#6920ac">/* program pointer */</font>    <i>crtx_Uint32_t</i>   FP;             <font color="#6920ac">/* frame pointer */</font>    <i>crtx_Uint32_t</i>   I7, L7, L0, L1, L2, L3, L4, L5;     <font color="#6920ac">/* registers */</font>} <i><font color='DarkBlue'>crtx_JmpBuf_t</font></i>;<b><font color='DarkGreen'>#endif</font></b><font color="maroon"></font><font color="#6920ac">/* common signal handler for all signals. Helps to simulate hardware  * interrupt system */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="psx4_SignalHandler">psx4_SignalHandler</a></font></b>(    <i>int</i>         SigNo_a,    siginfo_t   *pInfo_a,    <i>void</i>        *pContext_a){</font>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?