📄 primary_thread.c
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: primary_thread.c,v 1.9 2003/12/15 07:19:22 takayuki Exp $ */#include <vwindows.h>#include <hal_msg.h>#include <hw_timer.h>#include <objbase.h>#include <shellapi.h>#include <resource.h>#include "jsp_kernel.h"#include "task.h"#include <eventlog.h>#include <cpu_rename.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;BOOL ShutdownPostponementRequest;static HANDLE WorkerThreadHandle = NULL;static struct tagDestructionProcedureQueue * DestructionProcedureQueue; /* * 附哼悸乖面のスレッドが回年されたタスクであるかどうかのチェック */Inline int isTaskThreadRunning(TCB * tcb){ return (tcb != 0) && (tcb->tskctxb.ThreadHandle == CurrentRunningThreadHandle); } /* * カ〖ネルスタ〖タ * kernel_startは呵稿にexit_and_dispatchを钙ぶので、コンテキスト撬逮に * 洒えて糠しいスレッドを栏喇する。 */static DWORD WINAPIKernelStarter(LPVOID param){ TlsAlloc(); TlsSetValue(TLS_LOGMASK, (LPVOID)1); TlsSetValue(TLS_THREADHANDLE, (LPVOID)CurrentRunningThreadHandle); kprintf(("KernelStarter begins performing kernel initialization.\n")); kernel_start(); /* プログラムはここには丸ない */ return 0;} /* * タスク毋嘲弹瓢ル〖チン * Visual C++ -> cpu_config.c に败瓢しました * mingw/cygwin -> cpu_insn.S に败瓢しました */extern void TaskExceptionPerformer(void); /* * 动扩甲们ル〖チン * 炳批を手さないオブジェクト撬逮プロシジャ滦忽 */DWORD WINAPIForceShutdownHandler(LPVOID param){ do { ShutdownPostponementRequest = FALSE; Sleep(5000); } while(ShutdownPostponementRequest == TRUE); ExitProcess(0); return 0;} /* * デバッグ箕脱ダイアログのメッセ〖ジハンドラ */Inline LRESULT CALLBACKPrimaryDialogCommandHandler(WPARAM wParam, LPARAM lParam){ static BOOL lock_flag; switch(wParam) { /* ≈クロックの丁惦を匿贿する∽ボタン */ case IDC_CLOCKSUPPLY: { int state; state = SendDlgItemMessage(PrimaryDialogHandle, IDC_CLOCKSUPPLY,BM_GETCHECK,0,0); switch(state) { /* クロック匿贿 -> クロックを贿める and 海瓢いているスレッドを动扩匿贿 */ case BST_CHECKED: if((lock_flag = sense_lock()) != TRUE) dis_int(0); hw_timer_terminate(); if(CurrentRunningThreadHandle != NULL) SuspendThread(CurrentRunningThreadHandle); break; /* クロック丁惦浩倡 -> 呵稿に贿めたスレッドの浩倡 and クロック丁惦浩倡 */ case BST_UNCHECKED: if(CurrentRunningThreadHandle != NULL) ResumeThread(CurrentRunningThreadHandle); hw_timer_initialize(); if(lock_flag != TRUE) ena_int(0); break; } break; } default: return FALSE; } return TRUE;} /* * TOPPERS/JSP スレッドモデル タスクディスパッチャ */static void task_dispatcher(int is_taskschedule_required){ /* いま瓢いているスレッド(=充哈み+タスク)があれば、それを贿める */ if(CurrentRunningThreadHandle != NULL) { wait_for_thread_suspension_completion(CurrentRunningThreadHandle); //瓢いていたのがタスクであれば、充哈みマスクレベルを瘦赂する if(isTaskThreadRunning(runtsk)) vget_ims(&runtsk->tskctxb.InterruptLevel); } /* タスク磊仑 */ //ディスパッチする涩妥がある if(is_taskschedule_required != 0 && runtsk != schedtsk) runtsk = schedtsk; //磊垂黎タスクが赂哼するなら、そのタスクを弹瓢する if(runtsk != 0l) { CurrentRunningThreadHandle = runtsk->tskctxb.ThreadHandle; /* タスク毋嘲がおこったら */ if (runtsk->enatex && runtsk->texptn != 0) { /* タスク毋嘲弹瓢ル〖チンへと汗し仑える */ CONTEXT context; context.ContextFlags = CONTEXT_FULL; GetThreadContext(CurrentRunningThreadHandle,&context); *(DWORD *)(context.Esp -= 4) = context.Eip; context.Eip = (DWORD)TaskExceptionPerformer; SetThreadContext(CurrentRunningThreadHandle,&context); }else chg_ims(runtsk->tskctxb.InterruptLevel); LOG_DSP_LEAVE(runtsk); ResumeThread(runtsk->tskctxb.ThreadHandle); }else { /* 瓢かすものがないなら、充り哈みをあけて略つ */ CurrentRunningThreadHandle = NULL; ena_int(0); }} /* * TOPPERS/JSP スレッドモデル カ〖ネルメッセ〖ジハンドラ */Inline LRESULT CALLBACKHALMessageHandler(WPARAM wParam,LPARAM lParam){ switch(wParam) { /* *≈タスクを撬逮してください∽メッセ〖ジ * lParam : 撬逮滦据タスクのTCBのアドレス */ case HALMSG_DESTROY: { TCB * tcb = (TCB *)lParam; /* tcb == 0 が喇惟するのは、KernelStarterがexit_and_dispatchしたときのみ */ if(tcb == 0 || isTaskThreadRunning(tcb)){ CurrentRunningThreadHandle = NULL; /* タスクが肌の弹瓢妥滇を叫してext_tskすると、この箕爬ですでに糠しいスレッドのハンドルが掐っているので久してはいけない */ if(tcb == runtsk) runtsk = 0; } } /* *≈タスクを磊り仑えてください∽メッセ〖ジ */ case HALMSG_DISPATCH: task_dispatcher(1); break; /* *≈充り哈みを券栏させてください∽メッセ〖ジ * lParam : 充哈み戎规 (>0) */ case HALMSG_INTERRUPT: if(lParam == 0 || iniflg == FALSE || ras_int((unsigned int)lParam) == FALSE) break; /* 充哈み减烧借妄 : このまま肌に */ /* * ≈肌に悸乖すべき充り哈みを玫して、充哈み借妄を倡幌してください∽メッセ〖ジ */ case HALMSG_INTERRUPT_FINISH: { /* 附哼悸乖しているスレッドを匿贿 */ wait_for_thread_suspension_completion(CurrentRunningThreadHandle); /* 充哈みスレッド栏喇 and ディスパッチ */ if((CurrentRunningThreadHandle = sch_int()) != NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -