2 * Hyper Operating System Application Framework
5 * @brief %jp{システム用API定義}
7 * Copyright (C) 2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
12 /* ITRONをマイクロカーネルとして、依存性はこのモジュールで極力隠蔽する */
13 /* いわゆるシステムモード(デバイスドライバなど)のみに許すAPIを定義する */
14 /* ユーザーモード用APIは別途作成予定 */
17 #ifndef __HOS__sysapi_h__
18 #define __HOS__sysapi_h__
21 #include "system/type/type.h"
22 #include "library/container/memheap/memheap.h"
26 #define SYSPRC_HANDLE_NULL (0)
27 typedef void* SYSPRC_HANDLE;
29 /* ミューテックスハンドル(システム用) */
30 #define SYSMTX_HANDLE_NULL (0)
31 typedef void* SYSMTX_HANDLE;
34 #define SYSEVT_HANDLE_NULL (0)
35 typedef void* SYSEVT_HANDLE;
37 /* 割込みサービスルーチンハンドル(システム用) */
38 #define SYSISR_HANDLE_NULL (0)
39 typedef void* SYSISR_HANDLE;
42 #define SYSPRC_ATTR_NORMAL 0x00
45 #define SYSEVT_ATTR_NORMAL 0x00
46 #define SYSEVT_ATTR_AUTOCLEAR 0x01
48 /* ミューテックス属性(システム用) */
49 #define SYSMTX_ATTR_NORMAL 0x00
52 typedef _HOS_UINT64 SYSTIM_SYSTIME;
53 typedef _HOS_UINT64 SYSTIM_CPUTIME;
61 void SysApi_Initialize(void *pMem, MEMSIZE MemSize, MEMSIZE MemAlign, void *pIoMem, MEMSIZE IoMemSize, MEMSIZE IoMemAlign);
65 int SysCtx_IsIsr(void); /**< ISRコンテキストかどうか調べる(システム用) */
68 void SysLoc_Lock(void); /**< システム全体のロック(システム用) */
69 void SysLok_Unlock(void); /**< システム全体のロック解除(システム用) */
72 void *SysMem_Alloc(MEMSIZE Size); /**< メモリの割り当て(システム用) */
73 void *SysMem_ReAlloc(void *pMem, MEMSIZE Size); /**< メモリの再割り当て(システム用) */
74 void SysMem_Free(void *pMem); /**< メモリの返却(システム用) */
75 MEMSIZE SysMem_GetSize(void *pMem); /**< メモリのサイズ取得(システム用) */
76 C_MEMHEAP *SysMem_GetMemHeap(void); /**< メモリインターフェースの取得(システム用) */
80 void SysInt_Enable(int iIntNum); /**< 割込み許可(システム用) */
81 void SysInt_Disable(int iIntNum); /**< 割込み禁止(システム用) */
82 void SysInt_Clear(int iIntNum); /**< 割込み要因クリア(システム用) */
83 void SysInt_SetIntTime(int iIntNum, SYSTIM_CPUTIME Time); /**< 割込み計測タイマを初期化 */
84 SYSTIM_CPUTIME SysInt_GetIntTime(int iIntNum); /**< 割込み計測タイマを取得 */
86 /* 割り込みサービスルーチン制御API */
87 SYSISR_HANDLE SysIsr_Create(int iIntNum, void (*pfncIsr)(VPARAM Param), VPARAM Param);
88 void SysIsr_Delete(SYSISR_HANDLE hIsr);
91 SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(void), VPARAM Param, void *pStack, MEMSIZE StackSize, int Priority, int iAttr);
93 void SysPrc_Delete(SYSPRC_HANDLE hPrc); /**< プロセス削除(システム用) */
94 VPARAM SysPrc_GetParam(SYSPRC_HANDLE hPrc); /**< プロセスのパラメータ取得(システム用) */
96 void SysPrc_Terminate(SYSPRC_HANDLE hPrc); /**< プロセス終了(システム用) */
97 void SysPrc_Suspend(SYSPRC_HANDLE hPrc); /**< プロセス強制停止(システム用) */
98 void SysPrc_Resume(SYSPRC_HANDLE hPrc); /**< プロセス強制停止解除(システム用) */
99 void SysPrc_Signal(SYSPRC_HANDLE hPrc, VPARAM Signal); /**< プロセスへのシグナル送信(システム用) */
100 void SysPrc_SetSignalHandler(SYSPRC_HANDLE hPrc, void (*pfncHanler)(VPARAM Signal));
101 /**< プロセスへのシグナルハンドラ登録(システム用) */
102 SYSPRC_HANDLE SysPrc_GetCurrentHandle(void); /**< 現在のプロセスの取得(システム用) */
103 void SysPrc_SetExecTime(SYSPRC_HANDLE hPrc, SYSTIM_CPUTIME Time); /**< プロセス実行時間計測タイマを初期化 */
104 SYSTIM_CPUTIME SysPrc_GetExecTime(SYSPRC_HANDLE hPrc); /**< プロセス実行時間計測タイマを取得 */
106 /* システム用ミューテックス制御API */
107 SYSMTX_HANDLE SysMtx_Create(int iAttr); /**< ミューテックス生成(システム用) */
108 void SysMtx_Delete(SYSMTX_HANDLE hMtx); /**< ミューテックス削除(システム用) */
109 int SysMtx_PolingLock(SYSMTX_HANDLE hMtx); /**< ミューテックスポーリングロック(システム用) */
110 void SysMtx_Lock(SYSMTX_HANDLE hMtx); /**< ミューテックスロック(システム用) */
111 void SysMtx_Unlock(SYSMTX_HANDLE hMtx); /**< ミューテックスロック解除(システム用) */
112 int SysMtx_RefStatus(SYSMTX_HANDLE hMtx); /**< ミューテックスの状態を取得(システム用) */
115 SYSEVT_HANDLE SysEvt_Create(int iAttr); /**< イベント生成(システム用) */
116 void SysEvt_Delete(SYSEVT_HANDLE hEvt); /**< イベント削除(システム用) */
117 void SysEvt_Wait(SYSEVT_HANDLE hEvt); /**< イベント待ち(システム用) */
118 void SysEvt_Set(SYSEVT_HANDLE hEvt); /**< イベントセット(システム用) */
119 void SysEvt_Clear(SYSEVT_HANDLE hEvt); /**< イベントクリア(システム用) */
120 int SysEvt_RefStatus(SYSEVT_HANDLE hEvt); /**< イベントの状態を取得(システム用) */
123 void SysTim_Signal(unsigned long ulTic); /**< タイムティックを与える(システム用) */
124 void SysTim_Wait(unsigned long ulTime); /**< 時間待ち(システム用) */
125 TIME SysTim_GetCurrentTime(void); /**< 現在の時刻取得(システム用) */
126 SYSTIM_SYSTIME SysTim_GetSystemTime(void); /**< 現在のシステム時刻取得(システム用) */
127 SYSTIM_CPUTIME SysTim_GetCpuTime(void); /**< 現在のCPU時刻取得(システム用) */
128 unsigned long SysTim_CpuTimeToSecond(SYSTIM_CPUTIME CpuTime); /**< CPU時刻を秒に換算(システム用) */
129 unsigned long SysTim_CpuTimeToNanosecond(SYSTIM_CPUTIME CpuTime); /**< CPU時刻をナノ秒に換算(システム用) */
133 #ifdef __HOSAPLFW_IOMAPEDIO
135 unsigned char SysIo_InPortB(void *Port); /**< I/Oポートからバイト(8bit)入力 */
136 unsigned short SysIo_InPortH(void *Port); /**< I/Oポートからハーフワード(16bit)入力 */
137 unsigned long SysIo_InPortW(void *Port); /**< I/Oポートからワード(32bit)入力 */
138 unsigned char SysIo_OutPortB(void *Port, unsigned char Data); /**< I/Oポートへバイト(8bit)出力 */
139 unsigned short SysIo_OutPortH(void *Port, unsigned short Data); /**< I/Oポートへハーフワード(16bit)出力 */
140 unsigned long SysIo_OutPortW(void *Port, unsigned long Data); /**< I/Oポートへワード(32bit)出力 */
141 unsigned char SysIo_AndPortB(void *Port, unsigned char Data); /**< I/Oポートをバイト(8bit)単位で論理積 */
142 unsigned short SysIo_AndPortH(void *Port, unsigned short Data); /**< I/Oポートをハーフワード(16bit)単位で論理積 */
143 unsigned long SysIo_AndPortW(void *Port, unsigned long Data); /**< I/Oポートをワード(32bit)単位で論理積 */
144 unsigned char SysIo_OrPortB(void *Port, unsigned char Data); /**< I/Oポートをバイト(8bit)単位で論理和 */
145 unsigned short SysIo_OrPortH(void *Port, unsigned short Data); /**< I/Oポートをハーフワード(16bit)単位で論理和 */
146 unsigned long SysIo_OrPortW(void *Port, unsigned long Data); /**< I/Oポートをワード(32bit)単位で論理和 */
147 unsigned char SysIo_XorPortB(void *Port, unsigned char Data); /**< I/Oポートをバイト(8bit)単位で排他的論理和 */
148 unsigned short SysIo_XorPortH(void *Port, unsigned short Data); /**< I/Oポートをハーフワード(16bit)単位で排他的論理和 */
149 unsigned long SysIo_XorPortW(void *Port, unsigned long Data); /**< I/Oポートをワード(32bit)単位で排他的論理和 */
152 #define SysIo_InPortB(Port) (*(volatile unsigned char *)(Port))
153 #define SysIo_InPortH(Port) (*(volatile unsigned short *)(Port))
154 #define SysIo_InPortW(Port) (*(volatile unsigned long *)(Port))
155 #define SysIo_OutPortB(Port, Data) (*(volatile unsigned char *)(Port) = (unsigned char)(Data))
156 #define SysIo_OutPortH(Port, Data) (*(volatile unsigned short *)(Port) = (unsigned short)(Data))
157 #define SysIo_OutPortW(Port, Data) (*(volatile unsigned long *)(Port) = (unsigned long)(Data))
158 #define SysIo_AndPortB(Port, Data) (*(volatile unsigned char *)(Port) &= (unsigned char)(Data))
159 #define SysIo_AndPortH(Port, Data) (*(volatile unsigned short *)(Port) &= (unsigned short)(Data))
160 #define SysIo_AndPortW(Port, Data) (*(volatile unsigned long *)(Port) &= (unsigned long)(Data))
161 #define SysIo_OrPortB(Port, Data) (*(volatile unsigned char *)(Port) |= (unsigned char)(Data))
162 #define SysIo_OrPortH(Port, Data) (*(volatile unsigned short *)(Port) |= (unsigned short)(Data))
163 #define SysIo_OrPortW(Port, Data) (*(volatile unsigned long *)(Port) |= (unsigned long)(Data))
164 #define SysIo_XorPortB(Port, Data) (*(volatile unsigned char *)(Port) ^= (unsigned char)(Data))
165 #define SysIo_XorPortH(Port, Data) (*(volatile unsigned short *)(Port) ^= (unsigned short)(Data))
166 #define SysIo_XorPortW(Port, Data) (*(volatile unsigned long *)(Port) ^= (unsigned long)(Data))
169 /* システムによっては特定アドレス範囲にしかDMAが使えなかったり、非キャッシュ領域が必要なので別途設ける */
170 void *SysIo_AllocIoMem(MEMSIZE Size); /**< I/O操作に適したメモリの割り当て(システム用) */
171 void SysIo_FreeIoMem(void *pMem); /**< I/O操作に適したメモリの返却(システム用) */