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"><<font color="blue">unistd.h</font>></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 >= 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"><<font color="blue">limits.h</font>></a><b><font color='DarkGreen'>#include</font></b> <a href="signal.h.FIND-INC"><<font color="blue">signal.h</font>></a><b><font color='DarkGreen'>#include</font></b> <a href="aio.h.FIND-INC"><<font color="blue">aio.h</font>></a><b><font color='DarkGreen'>#include</font></b> <a href="time.h.FIND-INC"><<font color="blue">time.h</font>></a><b><font color='DarkGreen'>#include</font></b> <a href="setjmp.h.FIND-INC"><<font color="blue">setjmp.h</font>></a><b><font color='DarkGreen'>#include</font></b> <a href="errno.h.FIND-INC"><<font color="blue">errno.h</font>></a><b><font color='DarkGreen'>#include</font></b> <a href="ucontext.h.FIND-INC"><<font color="blue">ucontext.h</font>></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 > 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 >= 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) < 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 >= 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<<(((n)-1)&(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))>>5)<b><font color='DarkGreen'>#define</font></b> <font color="maroon"><a name="PSX4_SIGADDSET">PSX4_SIGADDSET</a></font>(s, n) \ ((s)->__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)->__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_SIGISMEMBER">PSX4_SIGISMEMBER</a></font>(s, n) \ (<a href="#PSX4_SIGMASK">PSX4_SIGMASK</a>(n) & (s)->__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)->__sigbits[0])|((s)->__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)->__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)])>>\ (((<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)-1)&(32-1))))&\ <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)->__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)] &= \ ~((<a href="PSX4_INTR_VECTORS_MASK.FIND-DEF">PSX4_INTR_VECTORS_MASK</a>)<<(((<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)-1)&(32-1))); \ (Set)->__sigbits[<a href="#PSX4_SIGWORD">PSX4_SIGWORD</a>(<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)] |= \ ((~Mask)&<a href="PSX4_INTR_VECTORS_MASK.FIND-DEF">PSX4_INTR_VECTORS_MASK</a>)<<(((<a href="#PSX4_SIGRTMIN">PSX4_SIGRTMIN</a>)-1)&(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 + -
显示快捷键?