📄 cpu_defs.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: cpu_defs.c,v 1.14 2003/12/15 07:19:22 takayuki Exp $ */#define _WIN32_WINNT 0x400#include <s_services.h>#include <hal_msg.h>/* * m68kっぽい充哈みエミュレ〖タ (Windows HAL) */ /* 附哼の充哈みマスクレベル */unsigned int CurrentInterruptLevel; /* 充哈み瓷妄テ〖ブル */static struct tagInterruptLevel InterruptLevel[INT_NUMINTERRUPTS]; /* 充哈みマスクレベルの铜跟认跋チェック */#define CHECK_IMS(x) ( (x) != 0 && (x) <= INT_NUMINTERRUPTS ) /* 毋嘲瓷妄テ〖ブル */struct tagExceptionLevel ExceptionLevel[EXC_MAXITEMS]; /* 极尸の涟に判峡されていた菇陇步毋嘲ハンドラのアドレス */static LPTOP_LEVEL_EXCEPTION_FILTER AnotherExceptionFilter;/* * システム链挛のクリティカルセクション栏喇ル〖チン * ˇどうしてCRITICAL_SECTIONを蝗うのをやめたのか * -> Windowsのクリティカルセクションは、ITRONで咐うところのディスパッチ敦贿で悸刘しているらしく、 * 嘲婶イベントで弹静してしまったスレッドがクリティカルセクション柒にいるスレッドの瓢侯を * 匿贿させてしまうことができるらしい。なのでCPUロックのつもりでクリティカルセクションを蝗っていると、 * 悸はただのディスパッチ敦贿なのでハンドラが弹瓢してしまい、PrimaryThreadがSuspendThreadを券乖してデッドロックしてしまう。 * この啼玛は箕」券栏する润撅に恬拆な啼玛だったが、まさかそんなことが付傍だとは蛔いもよらなかった。 * WinProg废のMLでも≈付傍稍汤の稍赖票袋がイヤならクリティカルセクションは蝗わないほうがよい∽といっている。 */static HANDLE SystemMutex = NULL; //システムロック脱のミュ〖テックスオブジェクトstatic DWORD SystemMutexOwnerThreadID = 0; //システムロックを艰评したスレッドのIDstatic DWORD SystemMutexLastOwnerThreadID = 0; //呵稿にシステムロックを艰评していたスレッドのID (デバッグ脱) /* * enter_system_critical_section : システムのロック涪を惩评する * BOOL * lock : クッキ〖(极尸が幌めてロック涪を惩评するとTRUEが手る) */void enter_system_critical_section(BOOL * lock){ if(SystemMutex != NULL && SystemMutexOwnerThreadID != GetCurrentThreadId()) { WaitForSingleObject(SystemMutex, INFINITE); if(lock != NULL) *lock = TRUE; SystemMutexOwnerThreadID = GetCurrentThreadId(); }else { if(lock != NULL) *lock = FALSE; }} /* * leave_system_critical_section : システムのロック涪を倡庶する * BOOL * lock : enter_system_critical_sectionで蝗脱したクッキ〖 */void leave_system_critiacl_section(BOOL * lock){ assert(lock != NULL); if(*lock == TRUE) { SystemMutexLastOwnerThreadID = SystemMutexOwnerThreadID; SystemMutexOwnerThreadID = 0; if(SystemMutex != NULL) ReleaseMutex(SystemMutex); }} /* * wait_for_thread_suspension_completion : スレッドをロック涪倡庶觉轮で匿贿させる */ER wait_for_thread_suspension_completion(HANDLE thread){ BOOL lock; if(thread == 0 || thread == NULL) return E_PAR; enter_system_critical_section(&lock); SuspendThread(thread); leave_system_critiacl_section(&lock); return 0;}/* * 肌に悸乖すべき充哈みハンドラのあるレベルを艰评する * ipl : 充哈みマスクレベル * * 充り哈みレベルマスクがiplまで布がったときに、肌に瓢かすべき充哈みを联买する。 * マスクレベルよりも惧疤の充哈みの眷圭、ペンディングされた妥滇 or 贷に悸乖が * 幌まっているハンドラ を悸乖する。マスクレベル笆布の眷圭、贷に瓢いている * ハンドラがある眷圭のみ悸乖する。部もない眷圭は0を手す。 */static unsigned intisns_int( unsigned int ipl ){ unsigned int result = INT_NUMINTERRUPTS; if((CPUStatus & CPU_STAT_LOCK) != 0) return 0; while(result > ipl) { result --; if( (InterruptLevel[result].Flags & (INT_STAT_PENDING|INT_STAT_RUNNING)) != 0) return result+1; } while(result > 0) { result --; if( (InterruptLevel[result].Flags & INT_STAT_RUNNING) != 0) return result+1; } return 0;}static DWORD WINAPIInterruptHandlerWrapper(LPVOID param){ unsigned int i; unsigned int PrevLevel; BOOL systemLock; struct tagInterruptLevel * intlv = (struct tagInterruptLevel *)param; TlsAlloc(); kprintf(("InterruptHandlerWrapper (%d) : start\n", (intlv - InterruptLevel) + 1 )); while(1==1) { /* 充哈み涟借妄 */ set_logcontrol((intlv->Flags & INT_MOD_LOGMASK) != 0); LOG_INH_ENTER((intlv - InterruptLevel)+1); assert((CPUStatus & CPU_STAT_LOCK) == 0); enter_system_critical_section(&systemLock); PrevLevel = CurrentInterruptLevel; CurrentInterruptLevel = (unsigned int)(intlv - InterruptLevel)+1; intlv->Flags &= ~INT_STAT_PENDING; intlv->Flags |= INT_STAT_RUNNING; leave_system_critiacl_section(&systemLock); ( (void (*)(void) )(intlv->Routine))(); /* 充哈み稿借妄 * ここで办丹にPrevLevelまで皖としてはいけない. * 充り哈みの掐り数によっては、庭黎刨の你い充哈みの忙叫借妄が庭黎刨の光い充り哈みの渴掐借妄の木稿に悸乖され、 * 笨が碍いと庭黎刨の光い充哈みがCurrentInterruptLevel = 0の觉轮で瘤ってしまうことになる。 */ enter_system_critical_section(&systemLock); intlv->Flags &= ~INT_STAT_RUNNING; i = isns_int(PrevLevel); if(i > PrevLevel) CurrentInterruptLevel = i - 1; else CurrentInterruptLevel = PrevLevel; leave_system_critiacl_section(&systemLock); LOG_INH_LEAVE((intlv - InterruptLevel)+1); /* 肌の充哈みを借妄するように奶梦 */ HALInterruptRequestAndWait(); } kprintf(("InterruptHandlerWrapper (%d) : exit\n", (intlv - InterruptLevel) + 1 )); ExitThread(0); return 0;}BOOLdef_int(unsigned int ims, void * rtn){ BOOL lock; if(!CHECK_IMS(ims) || rtn == NULL) return FALSE; kprintf(("def_int : [ims:%d]\n", ims)); ims--; enter_system_critical_section(&lock); if(InterruptLevel[ims].ThreadHandle != NULL) { TerminateThread(InterruptLevel[ims].ThreadHandle,0); CloseHandle(InterruptLevel[ims].ThreadHandle); } InterruptLevel[ims].Routine = rtn; InterruptLevel[ims].ThreadHandle = CreateThread(NULL,0,InterruptHandlerWrapper,(LPVOID)&InterruptLevel[ims],CREATE_SUSPENDED,&InterruptLevel[ims].ThreadID); leave_system_critiacl_section(&lock); return TRUE;}BOOLini_int(void){ int i; kprintf(("ini_int : [Start]\n")); SystemMutex = CreateMutex(NULL,TRUE,NULL); for(i=0;i<INT_NUMINTERRUPTS;i++) { InterruptLevel[i].Routine = (void *)0l; InterruptLevel[i].ThreadHandle = NULL; InterruptLevel[i].ThreadID = 0; InterruptLevel[i].Flags = INT_MOD_LOGMASK; } /* 介袋弹瓢でCPUロック觉轮へ败乖させる */ CurrentInterruptLevel = 0; //充哈みマスクは链钓材 CPUStatus |= CPU_STAT_LOCK; //CPUで充哈み敦贿に ReleaseMutex(SystemMutex); kprintf(("ini_int : [Exit]\n")); return TRUE;}voidfin_int(void){ int i; HANDLE work; kprintf(("fin_int : [Start]\n")); enter_system_critical_section(NULL); for(i=0;i<INT_NUMINTERRUPTS;i++) { if(InterruptLevel[i].ThreadHandle != NULL) { TerminateThread(InterruptLevel[i].ThreadHandle,0); CloseHandle(InterruptLevel[i].ThreadHandle); } InterruptLevel[i].Routine = (void *)0l; InterruptLevel[i].ThreadHandle = NULL; InterruptLevel[i].ThreadID = 0; InterruptLevel[i].Flags = 0; } CurrentInterruptLevel = 0; /* CloseHandle(SystemMutex), SystemMutex = INVALID_HANDLE; を奥链にやる */ work = SystemMutex; SystemMutex = NULL; CloseHandle(work); //これ笆惯はCPUロック觉轮だと蛔い哈む
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -