📄 cpu_config.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_config.c,v 1.15 2003/12/15 07:19:22 takayuki Exp $ *//* * プロセッサ巴赂モジュ〖ル∈Windows脱∷ */#include <cpu_rename.h>#include <s_services.h>#include "jsp_kernel.h"#include "check.h"#include "task.h"#include <hal_msg.h>volatile char CPUStatus = CPU_STAT_LOCK; //CPU觉轮フラグ/* * タスクディスパッチャ * ディスパッチャ塑挛はprimary_thread.cにある * ここでは瓷妄スレッドにディスパッチ巴完を叫すだけ */voiddispatch(){ LOG_DSP_ENTER_TSK(runtsk); HALDispatchRequest(); }/* 充哈み脱ディスパッチャ (叫蜗するログ攫鼠のみが佰なる) */voididispatch(){ LOG_DSP_ENTER_INT(runtsk); HALDispatchRequest();}/* * 附哼のコンテキストを嘉ててディスパッチ * exit_and_dispatch は·CPUロック觉轮で钙び叫さなければならないˉ * * 附哼悸乖面のタスクのTCBを回年して撬逮巴完。撬逮稿极瓢弄にディスパッチャへ。 */voidexit_and_dispatch() { HANDLE handle; HALDestroyRequest(runtsk); if((handle = (HANDLE)TlsGetValue(TLS_THREADHANDLE)) != NULL) CloseHandle(handle); TlsFree(TLS_THREADHANDLE); TlsFree(TLS_LOGMASK); ExitThread(0);}/* * プロセッサ巴赂の介袋步 */voidcpu_initialize(){ kprintf(("cpu_initialize()\n")); /* * 充哈みエミュレ〖タの介袋步 */ ini_int(); /* * 呵惧疤菇陇步毋嘲ハンドラの肋年 */ ini_exc();}/* * プロセッサ巴赂の姜位借妄 */voidcpu_terminate(){ kprintf(("cpu_terminate()\n")); fin_int(); //充哈みエミュレ〖タの匿贿 fin_exc(); //呵惧疤菇陇步毋嘲ハンドラの豺近}/* * タスク弹瓢ル〖チン * */DWORD WINAPIactivate_r( LPVOID param){ TCB * tcb = (TCB *)param; TlsAlloc(); TlsSetValue(TLS_LOGMASK, 0); TlsSetValue(TLS_THREADHANDLE, tcb->tskctxb.ThreadHandle); kprintf(("Task %d : activated\n", (tcb - tcb_table) + 1)); (*(void(*)(VP_INT))tcb->tinib->task)(tcb->tinib->exinf); ext_tsk(); return 0;}/* * atexitで判峡された簇眶の粕叫し (Windowsは部もしない -> CRTに扦せる) */void call_atexit(void){}/* * 米炭弄な己窃に滦する滦借ル〖チン */void FatalAssertion(int exp, LPCSTR format, ...){ extern HANDLE PrimaryThreadHandle; extern HANDLE CurrentRunningThreadHandle; if(!exp) { va_list vl; char buffer[1024]; /* エラ〖が弹きた付傍を仆き贿める */ wsprintf(buffer, "Critical assertion fail occured !!\nGetLastError = 0x%08x\n\n", GetLastError()); /* カ〖ネルが瓢き叫していたら... */ if(PrimaryThreadHandle != NULL) { /* カ〖ネルの悸乖を贿める */ dis_int(0); if(CurrentRunningThreadHandle != NULL) SuspendThread(CurrentRunningThreadHandle); hw_timer_terminate(); } /* 焚桂山绩 */ va_start(vl, format); wvsprintf(buffer + lstrlen(buffer), format, vl); MessageBox(PrimaryDialogHandle, buffer, "Assertion Failed", MB_OK|MB_ICONERROR); /* カ〖ネル匿贿 */ HALQuitRequest(); }} /* * ログ叫蜗をどうするかの扩告 */void set_logcontrol(BOOL enable){ BOOL result; result = TlsSetValue(TLS_LOGMASK, (LPVOID)(enable == TRUE ? 0 : 1)); if(result == 0) { TlsAlloc(); TlsSetValue(TLS_LOGMASK, (LPVOID)(enable == TRUE ? 0 : 1)); }} /* * カ〖ネルのデバッグ脱printf */void _kernel_debugprintf(const char * format, ... ){ va_list vl; int words; DWORD count; char buffer[1024]; va_start(vl, format); words = wvsprintf(buffer, format, vl); if(words != 0) WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buffer, words, &count, NULL);}#ifdef _MSC_VER //cygwinの眷圭はcpu_insn.Sに淡揭 /* * タスク毋嘲弹瓢ル〖チン * コンテキストを办米させるため、 * タスク毋嘲を瓢かしたタスクのスレッド惧で瓢侯させるためのル〖チン */void __declspec(naked) TaskExceptionPerformer(void){ /* レジスタ锣闰 */ __asm pusha __asm sub esp, FPU_CONTEXTSIZE __asm fsave [esp] /* タスク毋嘲の弹瓢 */ __asm call call_texrtn /* 充哈みマスク提し */ __asm mov ebx, DWORD PTR runtsk __asm mov eax, [ebx]TCB.tskctxb.InterruptLevel __asm push eax __asm call chg_ims __asm add esp, 4 /* レジスタ牲耽 */ __asm finit __asm frstor [esp] __asm add esp, FPU_CONTEXTSIZE __asm popa __asm ret}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -