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

📄 system.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/

/*****************************************************
文件说明:操作系统系统功能
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
 
******************************************************/

#include <ewindows.h>
#include <coresrv.h>
#include <epcore.h>
#include <sysintr.h>
#include <oemfunc.h>
#include <epalloc.h>
extern BOOL _InitHandleMgr( void );
extern BOOL _InitSemMgr( void );
extern BOOL _InitAPIMgr( void );
extern BOOL _InitKernelHeap( void );
extern BOOL InitRegistry( void );
extern BOOL InitComputerName( void );
extern void RegisterInlineProgram( void );
extern BOOL InitElfModuleMgr( void );
extern BOOL InitAlarmMgr( void );

#ifdef VIRTUAL_MEM
extern void Seg_GetInfo( LPSEGMENT lpSeg, 
						 LPDWORD lpdwAvailVirtual,
						 LPDWORD lpdwReserve,
						 LPDWORD lpdwCommit
						 );
#endif

#ifdef INLINE_PROGRAM

// ********************************************************************
// 声明:static BOOL RegisterDefaultShell( void  )
// 参数:
//		无
// 返回值:
//		假如成功,返回TRUE;否则,返回失败
// 功能描述:
//		注册默认的shell程序,这是一个内联版的程序
// 引用:
//		
// ********************************************************************
static BOOL RegisterDefaultShell( void  )
{
    extern int CALLBACK Shell_WinMain( HINSTANCE hInstance,
		            HINSTANCE hPrevInstance,
		            LPTSTR    lpCmdLine,
		            int       nCmdShow );

	KL_RegisterApplication( "shell",  Shell_WinMain, NULL ); // 注册到程序管理器
	return TRUE;

}

#endif   //INLINE_PROGRAM


// ********************************************************************
// 声明:BOOL InitialKingmosSystem( void * lpParam )
// 参数:
//		IN lpParam - 保留(为NULL)
// 返回值:
//		假如成功,返回TRUE;否则,返回失败
// 功能描述:
//		初始化Kingmos系统
// 引用:
//		被start.c调用
// ********************************************************************
BOOL InitialKingmosSystem( void * lpParam )
{
	extern void InitRomFsd(void);
	extern BOOL InitialCoreServer( void );
	extern BOOL InitialVirtualMgr( void );
	extern BOOL KHeap_Init( void );

	KL_DebugOutString( "InitialKingmosSystem entry.\r\n" );
    lpParam = 0;  // 去掉编译器警告

	std_srand( KL_GetTickCount() );	//初始化内核随机数种子

	//KL_DebugOutString( "ISR_Init.\r\n" );
    if( ISR_Init() == FALSE )	// 中断服务管理器初始化
		return FALSE;
	//KL_DebugOutString( "_InitSysMem.\r\n" );
	if( _InitSysMem() == FALSE )	// 初始化系统主内存
		return FALSE;
	//KL_DebugOutString( "KHeap_Init.\r\n" );
	if( KHeap_Init() == FALSE )	//初始化快堆管理器
		return FALSE;
	//KL_DebugOutString( "InitScheduler.\r\n" );
    if( InitScheduler() == FALSE )	// 初始化调度器
        return FALSE;
	//KL_DebugOutString( "_InitSemMgr.\r\n" );
	if( _InitSemMgr() == FALSE )	//初始化信号量管理器
		return FALSE;
	//KL_DebugOutString( "InitHandleMgr.\r\n" );
	if( _InitHandleMgr() == FALSE )	//初始化句柄管理器
		return FALSE;
#ifdef VIRTUAL_MEM
	//KL_DebugOutString( "InitialVirtualMgr.\r\n" );
	if( InitialVirtualMgr() == FALSE )	//初始化虚存管理器
		return FALSE;
#endif   //VIRTUAL_MEM
	//KL_DebugOutString( "_InitKernelHeap.\r\n" );
	if( _InitKernelHeap() == FALSE )	//初始化动态堆管理器
        return FALSE;
	//KL_DebugOutString( "_InitAPIMgr.\r\n" );
	if( _InitAPIMgr() == FALSE )	//初始化API服务管理器
		return FALSE;
#ifndef INLINE_PROGRAM
	//KL_DebugOutString( "InitRomFsd.\r\n" );
    InitRomFsd();	//初始化ROM文件系统
#endif  //INLINE_PROGRAM

	//KL_DebugOutString( "InitialCoreServer.\r\n" );
	if( InitialCoreServer() == FALSE )	//初始化核心服务功能
		return FALSE;
	//KL_DebugOutString( "InitComputerName.\r\n" );	
    if( InitComputerName() == FALSE )
    {
		return FALSE;    	
    }
#ifndef INLINE_PROGRAM
	//KL_DebugOutString( "InitElfModuleMgr.\r\n" );	
	if( InitElfModuleMgr() == FALSE )
	{
		return FALSE;
	}
#endif

	//KL_DebugOutString( "InitAlarmMgr.\r\n" );
	if( InitAlarmMgr() == FALSE )
	{
		return FALSE;
	}

	//内核初始化完成,启动shell
#ifdef INLINE_PROGRAM
    //KL_DebugOutString( "InstallSystemServer.\r\n" );
	if( RegisterDefaultShell() == FALSE )
	    return FALSE;

	//KL_DebugOutString( "run shell.exe...\r\n" ); 
	KL_LoadApplication( "shell", NULL );	

#else
	 KL_DebugOutString( "run shell.exe...\r\n" );
#ifdef __CHECK_MEM
	 {
		extern int startCheckMem;
		startCheckMem = 1;
	 }
#endif	 
	 KL_CreateProcess( "\\Kingmos\\shell.exe", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL, NULL );
#endif

	KL_DebugOutString( "InitialKingmosSystem leave.\r\n" );
    return TRUE;
}

//查询所有的服务是否许可挂起
#define DEBUG_DoPowerQuerySuspend 1
static BOOL CALLBACK DoPowerQuerySuspend( APIINFO * lpAPI, LPVOID lpParam )
{
//	CALLSTACK cs;
	CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
	BOOL bRetv = FALSE;
	if( SwitchToProcess( lpAPI->lpProcess, lpcs ) )
	{
		lpcs->dwCallInfo |= CALL_ALLOC;
		DEBUGMSG( DEBUG_DoPowerQuerySuspend, ( "DoPowerQuerySuspend call pServerHandler(%s).\r\n", lpAPI->lpProcess->lpszApplicationName ) );
		bRetv = ( (PSERVER_HANDLER)lpAPI->lpServerCtrlInfo->pServerHandler )( lpAPI->hServer, SCC_BROADCAST_POWER, SBP_APMQUERYSUSPEND, 0 );
		DEBUGMSG( DEBUG_DoPowerQuerySuspend, ( "DoPowerQuerySuspend pServerHandler(%s) return(%d).\r\n", lpAPI->lpProcess->lpszApplicationName, bRetv ) );
		SwitchBackProcess();
	}
	KHeap_Free( lpcs, sizeof( CALLSTACK ) );
	return bRetv;
}

// ********************************************************************
// 声明:void WINAPI KL_PowerOffSystem( void )
// 参数:
//		无
// 返回值:
//		无
// 功能描述:
//		执行关掉电源工作
// 引用:
//		
// ********************************************************************
#define DEBUG_KL_PowerOffSystem 1
void WINAPI KL_PowerOffSystem( void )
{
	DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem entry.\r\n" ) );
	
	LOCK_SCHE();//锁住调度器
	// power off

	//EnumServerHandler( SCC_BROADCAST_POWEROFF, 0, 0 );//向所有服务程序广播关电源事件
	//向所有服务程序请求关电源许可
	DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call  EnumServer.\r\n" ) );
	if( EnumServer( DoPowerQuerySuspend, 0 ) )
	{
		//向所有服务程序广播关电源事件
		DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call  SBP_APMSUSPEND.\r\n" ) );
		EnumServerHandler( SCC_BROADCAST_POWER, SBP_APMSUSPEND, 0 );
		//执行物理关电源工作
		DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call  OEM_PowerOff.\r\n" ) );
		OEM_PowerOff( 0 );
		// 电源已打开。power on	
		// 向所有服务程序广播开电源事件
		DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: OEM_PowerOff return.\r\n" ) );
		DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call  SBP_APMRESUMESUSPEND.\r\n" ) );
		EnumServerHandler( SCC_BROADCAST_POWER, SBP_APMRESUMESUSPEND, 0 );
	}
	else
	{
		DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call  SBP_APMQUERYSUSPENDFAILED.\r\n" ) );
		EnumServerHandler( SCC_BROADCAST_POWER, SBP_APMQUERYSUSPENDFAILED, 0 );
	}

	UNLOCK_SCHE();//解开调度器
 
	DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem leave.\r\n" ) );
//#endif

}

// ********************************************************************
// 声明:
// 参数:
//		IN  
// 返回值:
//		
// 功能描述:
//		
// 引用:
//		
// ********************************************************************
BOOL WINAPI KL_ExitSystem(
						  UINT uFlags,       // shutdown operation
						  DWORD dwReserved   // reserved
						  )
{
	switch( uFlags )
	{
	case EXS_POWEROFF:
		KL_PowerOffSystem();
		return TRUE;
	case EXS_REBOOT:
	case EXS_SHUTDOWN:
		//KL_SetEvent( hDeviceExitEvent );
		EnumServerHandler( SCC_BROADCAST_SHUTDOWN, 0, 0 );
#ifdef EML_WIN32
		{
			extern void CPU_Reset( void );
			CPU_Reset();
			while(1);
		}
#else
		OEM_PowerOff( 0 );//执行物理关电源工作
		break;
#endif
	default:
		return FALSE;
	}
	return TRUE;
}

⌨️ 快捷键说明

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