sysinit.c

来自「PPPoE协议在Psos中的实现源代码」· C语言 代码 · 共 596 行 · 第 1/2 页

C
596
字号
    PsosCfg.kc_nio              = SC_DEVMAX + 1;    PsosCfg.kc_iojtable         = PsosIO;    PsosCfg.kc_rootsadr         = root;    PsosCfg.kc_rootsstk         = KC_ROOTSSTK;    PsosCfg.kc_rootustk         = KC_ROOTUSTK;    PsosCfg.kc_rootmode         = KC_ROOTMODE;    PsosCfg.kc_startco          = TaskStartCallout;#ifdef KC_DELETECO    PsosCfg.kc_deleteco         = KC_DELETECO;#endif#ifdef KC_SWITCHCO    PsosCfg.kc_switchco         = KC_SWITCHCO;#endif#ifdef KC_FATAL    PsosCfg.kc_fatal            = KC_FATAL;#endif    PsosCfg.kc_rootpri          = KC_ROOTPRI;    PsosCfg.kc_psoscode         = (fvoidp) & pSOSHead;#ifdef SC_STACK_OVF_CHECK     PsosCfg.kc_stackcheck_size  = SC_STACK_OVF_CHECK;#else    PsosCfg.kc_stackcheck_size  = 2 * sizeof(long);#endif#if SC_PSOSM    MultiprocCfg.mc_nodenum     = SysVars.SmNode;    MultiprocCfg.mc_kicode      = ((void (*) ()) ki_call);    MultiprocCfg.mc_nnode       = SysVars.Kism;    MultiprocCfg.mc_nglbobj     = MC_NGLBOBJ;    MultiprocCfg.mc_nagent      = MC_NAGENT;    MultiprocCfg.mc_flags       = MC_FLAGS;    MultiprocCfg.mc_roster      = MC_ROSTER;    MultiprocCfg.mc_dprext      = (ULONG)-1;    MultiprocCfg.mc_dprint      = (ULONG)-1;    MultiprocCfg.mc_dprlen      = (ULONG)-1;    MultiprocCfg.mc_kimaxbuf    = MC_KIMAXBUF;	/* size not # of buffs! */    MultiprocCfg.mc_asyncerr    = MC_ASYNCERR;#endif    NodeCfg.mp_ct  = &MultiprocCfg;    NodeCfg.psosct = &PsosCfg;/*---------------------------------------------------------------------*//* The memory starting at "FreeMemStart" is available for allocation.  *//* Call any high-level drivers that are configured so they can grab    *//* some of this memory if they need it.  This technique allows us to   *//* build systems in which the drivers use different numbers of buffers *//* without having to re-compile the drivers.                           *//*---------------------------------------------------------------------*/#ifdef __TCS__    mem_size     = ((ULONG)&mem_size) - sbrk(0) - MARGIN;    FreeMemPtr   = (UCHAR *) sbrk(mem_size);#else    mem_size     = 8000000;    FreeMemPtr   = (UCHAR *) malloc(mem_size);#endif    BSP_RAM_BASE = (int) FreeMemPtr;    BSP_RAM_END  = (int) (mem_size + BSP_RAM_BASE - 1);    if (FreeMemPtr == (UCHAR *) -1) SysInitFail(MemErrMsg);/*---------------------------------------------------------------------*//* Check that the parameters make sense, then build the component      *//* configuration tables, and give out memory to the different psos     *//* parts.                                                              *//*---------------------------------------------------------------------*/    FreeMemPtr = BuildConfigTables(FreeMemPtr);    mem_size   = (int)BSP_RAM_END +1 - (int)FreeMemPtr;    if (mem_size < 0) SysInitFail(MemErrMsg);    Carve_PSOS_Memory(&FreeMemPtr, &mem_size);/*---------------------------------------------------------------------*//* Set region 0 area                                                   *//*---------------------------------------------------------------------*/#define EMPTY_REGIONSIZE  1024    /*---------------------------------------------------------------------*/    /* Since region 0 size cannot be greather than 32,767 times the unit   */    /* size calculate the max unit size then choose the lesser of the max  */    /* unit size or the rest of memory.                                    */    /*---------------------------------------------------------------------*/    rn0max = KC_RN0USIZE * ((1 << 15) - 1);    FreeMemPtr = (void *)ALIGN((long)FreeMemPtr, 4);    mem_size   = (int)BSP_RAM_END +1 - (int)FreeMemPtr;    if (mem_size < 0) SysInitFail(MemErrMsg);    PsosCfg.kc_rn0sadr = (void *) FreeMemPtr;#if   defined (TCS_REGION0_SIZE)    if ( mem_size > TCS_REGION0_SIZE ) { mem_size= TCS_REGION0_SIZE; }#elif defined (TCS_MALLOC_USE)#if (TCS_MALLOC_USE != NO)    if ( mem_size > EMPTY_REGIONSIZE ) { mem_size= EMPTY_REGIONSIZE; }#endif#endif    if ( mem_size < EMPTY_REGIONSIZE ) { mem_size= EMPTY_REGIONSIZE; }    if ( mem_size > rn0max ) { mem_size= rn0max; }    mem_size = TRUNC(mem_size,4);    PsosCfg.kc_rn0len = mem_size;    FreeMemPtr += mem_size;    mem_size    = (int)BSP_RAM_END +1 - (int)FreeMemPtr;/*---------------------------------------------------------------------*//* Give all unused memory back to sbrk                                 *//*---------------------------------------------------------------------*/#ifdef __TCS__    BSP_RAM_END -= mem_size;    sbrk( -mem_size );#endif}/***********************************************************************//* InstallDriver: Adds a device driver to PsosIO table                 *//*                                                                     *//*  INPUTS:                                                            *//*  unsigned short major_number    device major number                 *//*  void (*dev_init)(),            device init procedure               *//*  void (*dev_open)(),            device open procedure               *//*  void (*dev_close)(),           device close procedure              *//*  void (*dev_read)(),            device read procedure               *//*  void (*dev_write)(),           device write procedure              *//*  void (*dev_ioctl)(),           device control procedure            *//*  unsigned long rsvd1,           reserved                            *//*  unsigned long rsvd2)           reserved                            *//*                                                                     *//*     RETURNS: 0 if successfull 1 if major number out of range        *//*     NOTE(S): assumes SC_DEVMAX defined in sys_conf.h                *//*              This function is only useful before pSOS+ has been     *//*              initialized.                                           *//*                                                                     *//***********************************************************************/void InstallDriver(	      unsigned short major_number,	      void (*dev_init) (struct ioparms *),	      void (*dev_open) (struct ioparms *),	      void (*dev_close) (struct ioparms *),	      void (*dev_read) (struct ioparms *),	      void (*dev_write) (struct ioparms *),	      void (*dev_ioctl) (struct ioparms *),	      unsigned long rsvd1,	      unsigned long rsvd2_and_flags){    if ((major_number == 0) || (major_number > SC_DEVMAX))    {	SysInitFail("Cannot install driver; major number out of range");    }    else if (PsosIO[major_number].dev_init != (void (*) ()) -1)    {	SysInitFail("Duplicate major device numbers encountered");    }    else    {	PsosIO[major_number].dev_init = dev_init;	PsosIO[major_number].dev_open = dev_open;	PsosIO[major_number].dev_close = dev_close;	PsosIO[major_number].dev_read = dev_read;	PsosIO[major_number].dev_write = dev_write;	PsosIO[major_number].dev_ioctl = dev_ioctl;	PsosIO[major_number].rsvd1 = rsvd1;	PsosIO[major_number].rsvd2 = rsvd2_and_flags;	PsosIO[major_number].flags = rsvd2_and_flags >> 16;    }}/*---------------------------------------------------------------------*//* Compile-time checks                                                 *//*---------------------------------------------------------------------*/#if SC_PSOS && SC_PSOSM#error "Cannot use both pSOS+ and pSOS+m!"#endif#if (SC_DEV_SERIAL && BSP_SERIAL)#if(SC_DEV_SERIAL > SC_DEVMAX)#error "SC_DEV_SERIAL cannot be > SC_DEVMAX"#endif#endif#if SC_DEV_TIMER#if(SC_DEV_TIMER > SC_DEVMAX)#error "SC_DEV_TIMER cannot be > SC_DEVMAX"#endif#if (!SC_PSOS && !SC_PSOSM)#error "Must have pSOS+ or pSOS+m in system to use tick timer!"#endif#endif#if SC_DEV_RAMDISK#if(SC_DEV_RAMDISK > SC_DEVMAX)#error "SC_DEV_RAMDISK cannot be > SC_DEVMAX"#endif#endif#if (SC_DEV_SCSI && BSP_SCSI)#if(SC_DEV_RAMDISK > SC_DEVMAX)#error "SC_DEV_RAMDISK cannot be > SC_DEVMAX"#endif#endif#if (SC_DEV_TFTP)#if(SC_DEV_TFTP > SC_DEVMAX)#error "SC_DEV_TFTP cannot be > SC_DEVMAX"#endif#endif/*---------------------------------------------------------------------*//* PSOS startup as TCS application                                     *//*---------------------------------------------------------------------*/extern long _REDIRECT_MALLOC;int    __argc;char **__argv;#ifdef __TCS__	main(int argc, char **argv)	{	#ifdef TCS_MALLOC_USE	    #if (TCS_MALLOC_USE)		_REDIRECT_MALLOC= 0;	    #endif	#endif	    __argc= argc;	    __argv= argv;		    SysInit();	    InitBoard();	    _psos_start();	}#else	#include <AppModel.h>		static void 	_main(int argc, char **argv)	{	#ifdef TCS_MALLOC_USE	    #if (TCS_MALLOC_USE)		_REDIRECT_MALLOC= 0;	    #endif	#endif	    __argc= argc;	    __argv= argv;		    SysInit();	    InitBoard();	    _psos_start();	}			main(int argc, char **argv)	{	    int         status;	    AppModel_AppId app;	    _AppModel_init(KC_SYSSTK);	    _tmInit();	    app = AppModel_get_new_appid(AppModel_root);	    app->argc = argc;	    app->argv = argv;	    app->entry_point = (Pointer) _main;	    status = _AppModel_run_application(app);	    return status;	}#endif

⌨️ 快捷键说明

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