/* * TOPPERS/ASP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Advanced Standard Profile Kernel * * Copyright (C) 2014 Cores Co., Ltd. Japan * * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * @(#) $Id: prc_support.cpp 164 2016-03-07 11:33:50Z coas-nagasima $ */ #include "StdAfx.h" #include "prc_insn.h" #include "WinKernel.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // 贋ITRONカーネル extern CKernel *g_Kernel; uint32_t psw = PSW_I_MASK; uint32_t current_psw(void) { return psw; } void set_psw(uint32_t psw) { uint32_t temp = ::psw ^ psw; ::psw = psw; if((temp & PSW_I_MASK) != 0) { if((psw & PSW_I_MASK) != 0) g_Kernel->LockCPU(); else g_Kernel->UnlockCPU(); } } /* * NMIを除くすべての割込みの禁止 */ void disint(void) { g_Kernel->LockCPU(); psw |= PSW_I_MASK; } /* * NMIを除くすべての割込みの許可 */ void enaint(void) { psw &= ~PSW_I_MASK; g_Kernel->UnlockCPU(); } /* * 割込みハンドラの設定 */ void x_define_inh(uint_t inhno, FP int_entry) { g_Kernel->DefineInterruptHandler(inhno, int_entry); } void i_begin_int(INTNO intno) { g_Kernel->BeginInt(); } void i_end_int(INTNO intno) { g_Kernel->EndInt(); } bool starting = true; bool_t t_sense_lock() { return g_Kernel->CurrentIsLocked(); } bool_t i_sense_lock() { return g_Kernel->IsLocked(); } bool_t x_sense_lock() { if(g_Kernel->InTaskContext()) return g_Kernel->CurrentIsLocked(); else return g_Kernel->IsLocked(); } /* * コンテキストの参照 */ bool_t sense_context(void) { return !g_Kernel->InTaskContext() && !starting; } /* * CPU例外の発生した時のコンテキストの参照 */ bool_t exc_sense_context( void *p_excinf ) { return !g_Kernel->InTaskContext() && !starting; } /* * カーネル起動時タスクディスパッチャ */ void _start_dispatch(void) { starting = false; } /* * タスクディスパッチャ */ void dispatch(void) { g_Kernel->Dispatch(); } /* * 現在のコンテキストを捨ててディスパッチ */ void _exit_and_dispatch(void) { g_Kernel->ExitAndDispatch(); } /* * カーネルの終了処理の呼出し * * スタックを非タスクコンテキスト用に切り替え. * */ void call_exit_kernel(void) { g_Kernel->Terminate(); } /* * タスク起動処理 * */ void start_r(void) { #if TIPM_LOCK != -15 lock_flag = false; #endif /* TIPM_LOCK != -15 */ } extern "C" void Throw() { throw std::exception(); } extern "C" void trigger_cpu_exception( void ) { throw std::exception(); }