start.c

来自「嵌入式系统开发 TOPPERS and JSP Kernel Release 」· C语言 代码 · 共 366 行

C
366
字号
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  *  惧淡螟侯涪荚は·Free Software Foundation によって给山されている  *  GNU General Public License の Version 2 に淡揭されている掘凤か·笆 *  布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ *  アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ *      ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 *      に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· *      この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 *      み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ *    (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 *        涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する *        ことˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚を倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· *  塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ *  ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい *  かなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: start.c,v 1.7 2002/04/10 11:20:09 takayuki Exp $ */#include "jsp_kernel.h"#include "task.h"#include "vwindows.h"#include "hal_msg.h"#include "hw_timer.h"#include "objbase.h"#include "shellapi.h"#include "resource.h"struct tagDestructionProcedureQueue{	struct tagDestructionProcedureQueue * Next;	void (*DestructionProcedure)(void *);	void * Parameter;};extern void kernel_start();extern void kernel_exit();HINSTANCE ProcessInstance;HANDLE PrimaryThreadHandle;HWND PrimaryDialogHandle;HANDLE CurrentRunningThreadHandle;HANDLE ForceShutdownHandle = INVALID_HANDLE_VALUE;struct tagDestructionProcedureQueue * DestructionProcedureQueue; /*  * カ〖ネルスタ〖タ  *   kernel_startは呵稿にexit_and_dispatchを钙ぶので、コンテキスト撬逮に  *   洒えて糠しいスレッドを栏喇する。  */DWORD WINAPIKernelStarter(LPVOID param){	kernel_start();	return 0;}DWORD WINAPIForceShutdownHandler(LPVOID param){	Sleep(10000);	ExitProcess(0);	return 0;}Inline LRESULT CALLBACKPrimaryDialogCommandHandler(WPARAM wParam, LPARAM lParam){	switch(wParam)	{		case IDC_CLOCKSUPPLY:		{			int state;			state = SendDlgItemMessage(PrimaryDialogHandle, IDC_CLOCKSUPPLY,BM_GETCHECK,0,0);			if(state == BST_CHECKED)			{				hw_timer_terminate();				if(CurrentRunningThreadHandle != INVALID_HANDLE_VALUE)					SuspendThread(CurrentRunningThreadHandle);			}else			{				if(state == BST_UNCHECKED)				{					if(CurrentRunningThreadHandle != INVALID_HANDLE_VALUE)						ResumeThread(CurrentRunningThreadHandle);					hw_timer_initialize();				}			}			break;		}	default:		return FALSE;	}	return TRUE;}Inline LRESULT CALLBACKHALMessageHandler(WPARAM wParam,LPARAM lParam){	switch(wParam)	{	case HALMSG_DESTROY:		if(lParam != 0)		{			TCB * tcb = (TCB *)lParam;			TerminateThread(tcb->tskctxb.ThreadHandle,0);			CloseHandle(tcb->tskctxb.ThreadHandle);			tcb->tskctxb.ThreadHandle = INVALID_HANDLE_VALUE;		}else		{			if(CurrentRunningThreadHandle != INVALID_HANDLE_VALUE)			{				TerminateThread(CurrentRunningThreadHandle,0);				CloseHandle(CurrentRunningThreadHandle);				if(runtsk != 0)					runtsk->tskctxb.ThreadHandle = INVALID_HANDLE_VALUE;				CurrentRunningThreadHandle = INVALID_HANDLE_VALUE;			}		}		runtsk = 0l;	case HALMSG_DISPATCH:		if(CurrentRunningThreadHandle != INVALID_HANDLE_VALUE)			SuspendThread(CurrentRunningThreadHandle);		if(runtsk != schedtsk)		{			if((int)((long)schedtsk-(long)tcb_table)/sizeof(TCB)>10)				runtsk = 0l;		}		if(lParam == 0)			runtsk = schedtsk;		else			runtsk = (TCB *)lParam;		if(runtsk != 0l)		{			CurrentRunningThreadHandle = runtsk->tskctxb.ThreadHandle;			_kernel_calltex();			ResumeThread(runtsk->tskctxb.ThreadHandle);		}else		{			CurrentRunningThreadHandle = 0l;		}		break;	case HALMSG_INTERRUPT:		{			HANDLE work;			if(lParam != 0)				ras_int((unsigned int)lParam);			if((work = sch_int()) != INVALID_HANDLE_VALUE)			{				SuspendThread(CurrentRunningThreadHandle);				CurrentRunningThreadHandle = work;				ResumeThread(work);			}			break;		}	case HALMSG_EXECUTEPROCEDURE:		{			void ** work = (void **)lParam;			((void (*)(void *))(*work))(*(work+1));			break;		}	case HALMSG_ADDDESTRUCTIONPROCEDURE:		{			struct tagDestructionProcedureQueue * scope;			void ** work = (void **)lParam;			scope = DestructionProcedureQueue;			if((DestructionProcedureQueue = GlobalAlloc(GMEM_FIXED, sizeof(struct tagDestructionProcedureQueue))) != NULL)			{				DestructionProcedureQueue->DestructionProcedure = *(work);				DestructionProcedureQueue->Parameter = *(work+1);				DestructionProcedureQueue->Next = scope;			}			break;		}	case HALMSG_QUITREQUEST:		{			struct tagDestructionProcedureQueue * destqueue;			void * destarea;			ForceShutdownHandle = CreateThread(NULL, 0, ForceShutdownHandler, 0, NULL, NULL);			hw_timer_terminate();			if(CurrentRunningThreadHandle != NULL)				SuspendThread(CurrentRunningThreadHandle);			destqueue = DestructionProcedureQueue;			while(destqueue != NULL)			{				(*destqueue->DestructionProcedure)(destqueue->Parameter);				destarea = destqueue;				destqueue = destqueue->Next;				GlobalFree((HGLOBAL)destarea);			}			fin_int();			fin_exc();			DeleteCriticalSection(&CPULock);			DestroyWindow(PrimaryDialogHandle);			break;		}	default:		return FALSE;	}	return TRUE;}LRESULT CALLBACK PrimaryDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam){	switch(Msg)	{	case HALMSG_MESSAGE+1:		if(lParam == WM_RBUTTONUP)			kernel_exit();		break;	case HALMSG_MESSAGE:		return HALMessageHandler(wParam,lParam);	case WM_COMMAND:		return PrimaryDialogCommandHandler(wParam,lParam);		case WM_INITDIALOG:		{			DWORD ThreadID;			NOTIFYICONDATA nid;			PrimaryDialogHandle = hDlg;			nid.cbSize = sizeof(NOTIFYICONDATA);			nid.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE;			nid.uID = ID_NOTIFYICON;			lstrcpy(nid.szTip,"TOPPERS/JSP");			nid.hWnd = hDlg;			nid.uCallbackMessage = HALMSG_MESSAGE+1;			nid.hIcon = LoadIcon(ProcessInstance,MAKEINTRESOURCE(IDI_ERTLICON));			Shell_NotifyIcon(NIM_ADD,&nid);			PrimaryThreadHandle = (HANDLE)hDlg;			CurrentRunningThreadHandle = CreateThread(NULL,0,KernelStarter,NULL,0,&ThreadID);			break;		}	case WM_CLOSE:			kernel_exit();			break;	case WM_DESTROY:		{			NOTIFYICONDATA nid;			nid.cbSize = sizeof(NOTIFYICONDATA);			nid.hWnd = PrimaryThreadHandle;			nid.uID = ID_NOTIFYICON;			Shell_NotifyIcon(NIM_DELETE,&nid);			PrimaryThreadHandle = INVALID_HANDLE_VALUE;			PostQuitMessage(0);			break;		}	case WM_TIMER:		if((wParam & 0xffff0000) == 0xffff0000)		{			return HALMessageHandler(HALMSG_INTERRUPT,(wParam&0xffff));		}	default:		return FALSE;	}	return TRUE;}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShow){	MSG msg;	if(FAILED(CoInitialize(NULL)))		return 0;	ProcessInstance = hInstance;	DestructionProcedureQueue = NULL;	OnDebug InitializeDebugServices(hInstance,PrimaryDialogHandle);	OnDevice InitializeDeviceSupportModule();	CurrentRunningThreadHandle = INVALID_HANDLE_VALUE;	CreateDialog(hInstance,"PrimaryDialog",NULL,PrimaryDialogProc);	ShowWindow(PrimaryDialogHandle,SW_HIDE);	OnDebug ShowWindow(PrimaryDialogHandle,SW_SHOW);	while(GetMessage(&msg,NULL,0,0) != 0)	{		TranslateMessage(&msg);		DispatchMessage(&msg);		if(msg.message == WM_QUIT)			msg.message = 0;	}	OnDevice FinalizeDeviceSupportModule();	OnDebug FinalizeDebugServices();	{		int i;			for(i=0;i<_kernel_tmax_tskid;i++)			{				if(_kernel_tcb_table[i].tskctxb.ThreadHandle != INVALID_HANDLE_VALUE)				{					TerminateThread(_kernel_tcb_table[i].tskctxb.ThreadHandle,0);					CloseHandle(_kernel_tcb_table[i].tskctxb.ThreadHandle);					_kernel_tcb_table[i].tskctxb.ThreadHandle = INVALID_HANDLE_VALUE;				}			}	}	CoUninitialize();	if(ForceShutdownHandle != INVALID_HANDLE_VALUE)	{		TerminateThread(ForceShutdownHandle,0);		CloseHandle(ForceShutdownHandle);	}	ExitProcess(msg.wParam);	return msg.wParam;}

⌨️ 快捷键说明

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