/* * TOPPERS Software * Toyohashi Open Platform for Embedded Real-Time Systems * * Copyright (C) 2008-2010 by Witz Corporation, JAPAN * * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * @(#) $Id: prc_sil.h 164 2016-03-07 11:33:50Z coas-nagasima $ */ /* * sil.hのプロセッサ依存部(RX630用) */ #ifndef TOPPERS_PRC_SIL_H #define TOPPERS_PRC_SIL_H #define TOPPERS_OMIT_SIL_ACCESS #ifndef TOPPERS_MACRO_ONLY #include "prc_insn.h" /* * 全割込み禁止 */ Inline uint32_t TOPPERS_disint( void ) { volatile uint32_t TOPPERS_psw; TOPPERS_psw = current_psw(); disint(); return( TOPPERS_psw ); } /* * 全割込み許可 */ Inline void TOPPERS_enaint( uint32_t TOPPERS_psw ) { if( TOPPERS_psw & PSW_I_MASK ){ enaint(); } } /* * 全割込みロック状態の制御 */ #define SIL_PRE_LOC uint32_t TOPPERS_i_psw; #define SIL_LOC_INT() ( ( void )( TOPPERS_i_psw = TOPPERS_disint() ) ) #define SIL_UNL_INT() ( TOPPERS_enaint( TOPPERS_i_psw ) ) /* * エンディアンの反転 * * 本開発環境ではエンディアン変換命令が存在するため, * アーキテクチャ依存部にてマクロを上書きする. */ #define TOPPERS_SIL_REV_ENDIAN_UINT16( data ) \ rev_endian_uint16( data ) #define TOPPERS_SIL_REV_ENDIAN_UINT32( data ) \ rev_endian_uint32( data ) /* * 微少時間待ち */ extern void sil_dly_nse( ulong_t dlytim ); #endif /* TOPPERS_MACRO_ONLY */ /* * プロセッサのエンディアン */ #ifdef __LIT #define SIL_ENDIAN_LITTLE /* リトルエンディアン */ #endif #ifdef __BIG #define SIL_ENDIAN_BIG /* ビッグエンディアン */ #endif /* * 8ビット単位の読出し/書込み */ #ifdef UINT8_MAX #pragma inline(sil_reb_mem) static uint8_t sil_reb_mem(const volatile uint8_t __evenaccess *mem) { uint8_t data; data = *mem; return(data); } #pragma inline(sil_wrb_mem) static void sil_wrb_mem(volatile uint8_t __evenaccess *mem, uint8_t data) { *mem = data; } #endif /* UINT8_MAX */ /* * 16ビット単位の読出し/書込み */ #pragma inline(sil_reh_mem) static uint16_t sil_reh_mem(const volatile uint16_t __evenaccess *mem) { uint16_t data; data = *mem; return(data); } #pragma inline(sil_wrh_mem) static void sil_wrh_mem(volatile uint16_t __evenaccess *mem, uint16_t data) { *mem = data; } #ifdef SIL_ENDIAN_BIG /* ビッグエンディアンプロセッサ */ #define sil_reh_bem(mem) sil_reh_mem(mem) #define sil_wrh_bem(mem, data) sil_wrh_mem(mem, data) #ifndef TOPPERS_OMIT_SIL_REH_LEM #pragma inline(sil_reh_lem) static uint16_t sil_reh_lem(const volatile uint16_t __evenaccess *mem) { uint16_t data; data = *mem; return(TOPPERS_SIL_REV_ENDIAN_UINT16(data)); } #endif /* TOPPERS_OMIT_SIL_REH_LEM */ #ifndef TOPPERS_OMIT_SIL_WRH_LEM #pragma inline(sil_wrh_lem) static void sil_wrh_lem(volatile uint16_t __evenaccess *mem, uint16_t data) { *mem = TOPPERS_SIL_REV_ENDIAN_UINT16(data); } #endif /* TOPPERS_OMIT_SIL_WRH_LEM */ #else /* SIL_ENDIAN_BIG */ #ifdef SIL_ENDIAN_LITTLE /* リトルエンディアンプロセッサ */ #define sil_reh_lem(mem) sil_reh_mem(mem) #define sil_wrh_lem(mem, data) sil_wrh_mem(mem, data) #ifndef TOPPERS_OMIT_SIL_REH_BEM #pragma inline(sil_reh_bem) static uint16_t sil_reh_bem(const volatile uint16_t __evenaccess *mem) { uint16_t data; data = *mem; return(TOPPERS_SIL_REV_ENDIAN_UINT16(data)); } #endif /* TOPPERS_OMIT_SIL_REH_BEM */ #ifndef TOPPERS_OMIT_SIL_WRH_BEM #pragma inline(sil_wrh_bem) static void sil_wrh_bem(volatile uint16_t __evenaccess *mem, uint16_t data) { *mem = TOPPERS_SIL_REV_ENDIAN_UINT16(data); } #endif /* TOPPERS_OMIT_SIL_WRH_BEM */ #else /* SIL_ENDIAN_LITTLE */ #error Neither SIL_ENDIAN_BIG nor SIL_ENDIAN_LITTLE is defined. #endif /* SIL_ENDIAN_LITTLE */ #endif /* SIL_ENDIAN_BIG */ /* * 32ビット単位の読出し/書込み */ #pragma inline(sil_rew_mem) static uint32_t sil_rew_mem(const volatile uint32_t __evenaccess *mem) { uint32_t data; data = *mem; return(data); } #pragma inline(sil_wrw_mem) static void sil_wrw_mem(volatile uint32_t __evenaccess *mem, uint32_t data) { *mem = data; } #ifdef SIL_ENDIAN_BIG /* ビッグエンディアンプロセッサ */ #define sil_rew_bem(mem) sil_rew_mem(mem) #define sil_wrw_bem(mem, data) sil_wrw_mem(mem, data) #ifndef TOPPERS_OMIT_SIL_REW_LEM #pragma inline(sil_rew_lem) static uint32_t sil_rew_lem(const volatile uint32_t __evenaccess *mem) { uint32_t data; data = *mem; return(TOPPERS_SIL_REV_ENDIAN_UINT32(data)); } #endif /* TOPPERS_OMIT_SIL_REW_LEM */ #ifndef TOPPERS_OMIT_SIL_WRW_LEM #pragma inline(sil_wrw_lem) static void sil_wrw_lem(volatile uint32_t __evenaccess *mem, uint32_t data) { *mem = TOPPERS_SIL_REV_ENDIAN_UINT32(data); } #endif /* TOPPERS_OMIT_SIL_WRW_LEM */ #else /* SIL_ENDIAN_BIG */ /* リトルエンディアンプロセッサ */ #define sil_rew_lem(mem) sil_rew_mem(mem) #define sil_wrw_lem(mem, data) sil_wrw_mem(mem, data) #ifndef TOPPERS_OMIT_SIL_REW_BEM #pragma inline(sil_rew_bem) static uint32_t sil_rew_bem(const volatile uint32_t __evenaccess *mem) { uint32_t data; data = *mem; return(TOPPERS_SIL_REV_ENDIAN_UINT32(data)); } #endif /* TOPPERS_OMIT_SIL_REW_BEM */ #ifndef TOPPERS_OMIT_SIL_WRW_BEM #pragma inline(sil_wrw_bem) static void sil_wrw_bem(volatile uint32_t __evenaccess *mem, uint32_t data) { *mem = TOPPERS_SIL_REV_ENDIAN_UINT32(data); } #endif /* TOPPERS_OMIT_SIL_WRW_BEM */ #endif /* SIL_ENDIAN_BIG */ #endif /* TOPPERS_PRC_SIL_H */