$(OBJS_DIR)/sysprc_resume.$(EXT_OBJ): $(SYSAPI_DIR)/sysprc_resume.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)/sysprc_getparam.$(EXT_OBJ): $(SYSAPI_DIR)/sysprc_getparam.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)/sysprc_getcurrenthandle.$(EXT_OBJ): $(SYSAPI_DIR)/sysprc_getcurrenthandle.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
+$(OBJS_DIR)/systim_signal.$(EXT_OBJ): $(SYSAPI_DIR)/systim_signal.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)/systim_wait.$(EXT_OBJ): $(SYSAPI_DIR)/systim_wait.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)/systim_getsystemtime.$(EXT_OBJ): $(SYSAPI_DIR)/systim_getsystemtime.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)/systim_getcputime.$(EXT_OBJ): $(SYSAPI_DIR)/systim_getcputime.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
CSRCS += $(SYSAPI_DIR)/sysprc_resume.c
CSRCS += $(SYSAPI_DIR)/sysprc_getparam.c
CSRCS += $(SYSAPI_DIR)/sysprc_getcurrenthandle.c
+CSRCS += $(SYSAPI_DIR)/systim_signal.c
CSRCS += $(SYSAPI_DIR)/systim_wait.c
CSRCS += $(SYSAPI_DIR)/systim_getsystemtime.c
CSRCS += $(SYSAPI_DIR)/systim_getcputime.c
$(OBJS_DIR)\sysprc_getcurrenthandle.c : $(SYSAPI_DIR)\sysprc_getcurrenthandle.c
$(CMD_CP) $(SYSAPI_DIR)\sysprc_getcurrenthandle.c $(OBJS_DIR)\
+$(OBJS_DIR)\systim_signal.c : $(SYSAPI_DIR)\systim_signal.c
+ $(CMD_CP) $(SYSAPI_DIR)\systim_signal.c $(OBJS_DIR)\
+
$(OBJS_DIR)\systim_wait.c : $(SYSAPI_DIR)\systim_wait.c
$(CMD_CP) $(SYSAPI_DIR)\systim_wait.c $(OBJS_DIR)\
$(OBJS_DIR)\sysprc_resume.$(EXT_OBJ): $(OBJS_DIR)\sysprc_resume.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)\sysprc_getparam.$(EXT_OBJ): $(OBJS_DIR)\sysprc_getparam.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)\sysprc_getcurrenthandle.$(EXT_OBJ): $(OBJS_DIR)\sysprc_getcurrenthandle.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
+$(OBJS_DIR)\systim_signal.$(EXT_OBJ): $(OBJS_DIR)\systim_signal.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)\systim_wait.$(EXT_OBJ): $(OBJS_DIR)\systim_wait.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)\systim_getsystemtime.$(EXT_OBJ): $(OBJS_DIR)\systim_getsystemtime.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
$(OBJS_DIR)\systim_getcputime.$(EXT_OBJ): $(OBJS_DIR)\systim_getcputime.c $(COMMON_HEADERS) $(SYSTEM_HEADERS)
OBJS = $(OBJS) $(OBJS_DIR)\sysprc_getparam.$(EXT_OBJ)
CSRCS = $(CSRCS) $(SYSAPI_DIR)\sysprc_getcurrenthandle.c
OBJS = $(OBJS) $(OBJS_DIR)\sysprc_getcurrenthandle.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(SYSAPI_DIR)\systim_signal.c
+OBJS = $(OBJS) $(OBJS_DIR)\systim_signal.$(EXT_OBJ)
CSRCS = $(CSRCS) $(SYSAPI_DIR)\systim_wait.c
OBJS = $(OBJS) $(OBJS_DIR)\systim_wait.$(EXT_OBJ)
CSRCS = $(CSRCS) $(SYSAPI_DIR)\systim_getsystemtime.c
"sysprc_resume.c",
"sysprc_getparam.c",
"sysprc_getcurrenthandle.c",
+ "systim_signal.c",
"systim_wait.c",
"systim_getsystemtime.c",
"systim_getcputime.c",
OBJS_DIR = objs_$(TARGET)
-# %jp{ディレクトリ定義}
-TOP_DIR = ..\..\..\..\..
-KERNEL_DIR = $(TOP_DIR)\kernel
-KERNEL_MAKINC_DIR = $(KERNEL_DIR)\build\common\nmake
-OBJS_DIR = objs_$(TARGET)
-
-
# %jp{共通定義読込み}
!include $(KERNEL_MAKINC_DIR)\common.inc
INC_DIRS = $(INC_DIRS) $(KERNEL_DIR)\include
-# %jp{オプションフラグの追加}
-CFLAGS = $(CFLAGS)
-AFLAGS = $(AFLAGS)
-LNFLAGS = $(LNFLAGS)
+# %jp{オプションフラグ}
+CFLAGS =
+AFLAGS =
+LNFLAGS =
# %jp{リンク制御対象制御}
# %jp{ツール定義}
-GCC_SYS ?= elf
-CMD_CC ?= sh-$(GCC_SYS)-gcc
-CMD_ASM ?= sh-$(GCC_SYS)-gcc
-CMD_LIBR ?= sh-$(GCC_SYS)-ar
+GCC_ARCH ?= sh-elf-
+CMD_CC ?= $(GCC_ARCH)gcc
+CMD_ASM ?= $(GCC_ARCH)gcc
+CMD_LIBR ?= $(GCC_ARCH)ar
# %jp{ディレクトリ定義}
TARGET ?= sample
# %jp{ツール定義}
-GCC_SYS ?= arm-elf-
-CMD_CC ?= $(GCC_SYS)gcc
-CMD_ASM ?= $(GCC_SYS)gcc
-CMD_LINK ?= $(GCC_SYS)gcc
-CMD_OBJCNV ?= $(GCC_SYS)objcopy
+GCC_ARCH ?= arm-elf-
+CMD_CC ?= $(GCC_ARCH)gcc
+CMD_ASM ?= $(GCC_ARCH)gcc
+CMD_LINK ?= $(GCC_ARCH)gcc
+CMD_OBJCNV ?= $(GCC_ARCH)objcopy
# %jp{ディレクトリ}
OS_DIR = ../../../../..
#include "driver/serial/renesas/scidrv.h"
#include "driver/console/vt100/vt100drv.h"
#include "application/syscmd/shell/shell.h"
+#include "application/syscmd/processlist/processlist.h"
#include "application/filecmd/filelist/filelist.h"
+#include "application/utility/timecmd/timecmd.h"
#include "application/utility/memdump/memdump.h"
#include "application/utility/memwrite/memwrite.h"
#include "application/utility/memtest/memtest.h"
#include "application/utility/keytest/keytest.h"
#include "application/example/hello/hello.h"
#include "boot.h"
+#include "ostimer.h"
#include "regs_sh7144.h"
/*************************/
+ /* OSタイマ初期化 */
+ /*************************/
+
+ OsTimer_Initialize();
+
+
+ /*************************/
/* デバイスドライバ */
/*************************/
/* SCIデバドラ生成 */
hDriver = SciDrv_Create((void *)REG_SCI0_SMR, 128, 24000000L, 64); /* SCI0生成 */
File_AddDevice("com0", hDriver); /* /dev/com0 に登録 */
-
+
hDriver = SciDrv_Create((void *)REG_SCI1_SMR, 132, 24000000L, 64); /* SCI1生成 */
File_AddDevice("com1", hDriver); /* /dev/com1 に登録 */
-
+
hDriver = SciDrv_Create((void *)REG_SCI2_SMR, 168, 24000000L, 64); /* SCI2生成 */
File_AddDevice("com2", hDriver); /* /dev/com2 に登録 */
-
+
hDriver = SciDrv_Create((void *)REG_SCI3_SMR, 172, 24000000L, 64); /* SCI3生成 */
File_AddDevice("com3", hDriver); /* /dev/com3 に登録 */
/* コマンド登録 */
/*************************/
Command_AddCommand("sh", Shell_Main);
- Command_AddCommand("hello", Hello_Main);
+ Command_AddCommand("ps", ProcessList_Main);
Command_AddCommand("ls", FileList_Main);
+ Command_AddCommand("time", TimeCmd_Main);
Command_AddCommand("memdump", MemDump_Main);
Command_AddCommand("memwrite", MemWrite_Main);
Command_AddCommand("memtest", MemTest_Main);
Command_AddCommand("keytest", KeyTest_Main);
+ Command_AddCommand("hello", Hello_Main);
/* 起動メッセージ */
OBJS_DIR = objs_$(TARGET)
+# %jp{カーネルフックの設定}
+KERNEL_HOK_TSK = Yes
+KERNEL_HOK_ISR = Yes
+
+
# %jp{共通定義読込み}
include $(KERNEL_MAKINC_DIR)/common.inc
MEMORY
{
vector : o = 0x0000000, l = 0x00400
- rom : o = 0x0000400, l = 0x07c00
+ rom : o = 0x0000400, l = 0x3fc00
ram : o = 0x0040000, l = 0x80000
}
#include "kernel.h"
#include "ostimer.h"
#include "regs_sh7144.h"
+#include "system/sysapi/sysapi.h"
-#define INHNO_OSTIMER 144 /**< %jp{割り込みハンドラ番号} */
#define PERIPHERAL_CLOCK (24000000UL) /**< %jp{ペリフェラルクロック(24MHz)} */
-static void OsTimer_IrqHandler(void); /**< %jp{タイマ割り込みハンドラ} */
+static void OsTimer_Isr(VPARAM Param); /**< %jp{タイマ割り込みハンドラ} */
/** %jp{OS用タイマ初期化ルーチン} */
-void OsTimer_Initialize(VP_INT exinf)
+void OsTimer_Initialize(void)
{
- T_DINH dfinh;
- return;
-
- /* %jp{割り込みハンドラ定義} */
- dfinh.inthdr = (FP)OsTimer_IrqHandler;
- def_inh(INHNO_OSTIMER, &dfinh);
+ /* %jp{割り込みサービスルーチン登録} */
+ SysIsr_Create(144, OsTimer_Isr, (VPARAM)0);
/* %jp{タイマ動作開始} */
*REG_STANDBY_MSTCR2 &= 0xefff;
/** %jp{タイマ割り込みハンドラ} */
-void OsTimer_IrqHandler(void)
+void OsTimer_Isr(VPARAM Param)
{
*REG_CMT0_CMCSR &= 0xff7f;
- isig_tim();
+ SysTim_Signal(1000000UL);
}
#endif
/** %jp{OS用タイマ初期化ルーチン} */
-void OsTimer_Initialize(VP_INT exinf);
+void OsTimer_Initialize(void);
#ifdef __cplusplus
}
KERNEL_MAX_ISRID(32);
-/* %jp{OSタイマの設定}%en{OS timer} */
-INCLUDE("\"ostimer.h\"");
-ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
/* %jp{サンプル}%en{Sample program} */
INCLUDE("\"boot.h\"");
CRE_TSK(TSKID_BOOT, {TA_HLNG | TA_ACT, 0, Boot_Task, 2, 1024, NULL});
+
/* end of file */
/* ITRONをマイクロカーネルとして、依存性はこのモジュールで極力隠蔽する */
-/* ã\81\84ã\82\8fã\82\86ã\82\8bã\82·ã\82¹ã\83\86ã\83 ã\83¢ã\83¼ã\83\89(ã\83\87ã\83\90ã\83\89ã\83©ã\81¨ã\81\8b)のみに許すAPIを定義する */
+/* ã\81\84ã\82\8fã\82\86ã\82\8bã\82·ã\82¹ã\83\86ã\83 ã\83¢ã\83¼ã\83\89(ã\83\87ã\83\90ã\82¤ã\82¹ã\83\89ã\83©ã\82¤ã\83\90ã\81ªã\81©)のみに許すAPIを定義する */
/* ユーザーモード用APIは別途作成予定 */
int SysMtx_PolingLock(SYSMTX_HANDLE hMtx); /**< ミューテックスポーリングロック(システム用) */
void SysMtx_Lock(SYSMTX_HANDLE hMtx); /**< ミューテックスロック(システム用) */
void SysMtx_Unlock(SYSMTX_HANDLE hMtx); /**< ミューテックスロック解除(システム用) */
-int SysMtx_RefStatus(SYSMTX_HANDLE hMtx); /**< ã\82¤ã\83\99ã\83³ã\83\88の状態を取得(システム用) */
+int SysMtx_RefStatus(SYSMTX_HANDLE hMtx); /**< ã\83\9fã\83¥ã\83¼ã\83\86ã\83\83ã\82¯ã\82¹の状態を取得(システム用) */
/* システム用イベント制御API */
SYSEVT_HANDLE SysEvt_Create(int iAttr); /**< イベント生成(システム用) */
int SysEvt_RefStatus(SYSEVT_HANDLE hEvt); /**< イベントの状態を取得(システム用) */
/* 時間管理 */
+void SysTim_Signal(unsigned long ulTic); /**< タイムティックを与える(システム用) */
void SysTim_Wait(unsigned long ulTime); /**< 時間待ち(システム用) */
TIME SysTim_GetCurrentTime(void); /**< 現在の時刻取得(システム用) */
SYSTIM_SYSTIME SysTim_GetSystemTime(void); /**< 現在のシステム時刻取得(システム用) */
#include "kernel.h"
-SYSMTX_HANDLE SysMem_hMtx; /* システムメモリ管理用ミューテックス */
-C_MEMPOL SysMem_MemPol; /* システムヒープメモリ */
-T_SYSPRC_INF *SysPrc_InfTbl; /* プロセス管理用テーブル */
-T_SYSISR_INF *SysIsr_InfTbl; /* ISR管理用テーブル */
+SYSMTX_HANDLE SysMem_hMtx; /* システムメモリ管理用ミューテックス */
+C_MEMPOL SysMem_MemPol; /* システムヒープメモリ */
+T_SYSPRC_INF *SysPrc_InfTbl; /* プロセス管理用テーブル */
+T_SYSISR_INF *SysIsr_InfTbl; /* ISR管理用テーブル */
/* システムの初期化 */
/* プロセス固有情報管理 */
typedef struct t_sysprc_inf
{
- VPARAM Param; /* プロセス固有パラメータ */
- SYSTIM_CPUTIME ExecTime; /* プロセス実行時間計測 */
+ VPARAM Param; /* プロセス固有パラメータ */
+ SYSTIM_CPUTIME ExecTime; /* プロセス実行時間計測 */
} T_SYSPRC_INF;
/* ISR固有情報管理 */
typedef struct t_sysisr_inf
{
- SYSTIM_CPUTIME ExecTime; /* ISR実行時間計測 */
+ SYSTIM_CPUTIME ExecTime; /* ISR実行時間計測 */
} T_SYSISR_INF;
-extern SYSMTX_HANDLE SysMem_hMtx; /* システムメモリ管理用ミューテックス */
-extern C_MEMPOL SysMem_MemPol; /* システムヒープメモリ */
-extern T_SYSPRC_INF *SysPrc_InfTbl; /* プロセス管理用テーブル */
-extern T_SYSISR_INF *SysIsr_InfTbl; /* ISR管理用テーブル */
+extern SYSMTX_HANDLE SysMem_hMtx; /* システムメモリ管理用ミューテックス */
+extern C_MEMPOL SysMem_MemPol; /* システムヒープメモリ */
+extern T_SYSPRC_INF *SysPrc_InfTbl; /* プロセス管理用テーブル */
+extern T_SYSISR_INF *SysIsr_InfTbl; /* ISR管理用テーブル */
+extern SYSTIM_CPUTIME SysTim_TimeCounter; /* デフォルトのタイマカウンタ */
+
#ifdef __cplusplus
#include "sysapi_local.h"
+
+/* SysTim_GetCpuTime をオーバーライドする場合は一緒に
+ オーバーライドすること */
+
+
/** CPU時刻をナノ秒に換算(システム用) */
unsigned long SysTim_CpuTimeToNanosecond(SYSTIM_CPUTIME CpuTime)
{
- return (unsigned long)CpuTime;
+ return (unsigned long)(CpuTime % 1000000000UL); /* デフォルトではナノ秒単位 */
}
#include "sysapi_local.h"
+/* SysTim_GetCpuTime をオーバーライドする場合は一緒に
+ オーバーライドすること */
+
/* CPU時刻を秒に換算(システム用) */
unsigned long SysTim_CpuTimeToSecond(SYSTIM_CPUTIME CpuTime)
{
- return 0;
+ return (unsigned long)(CpuTime / 1000000000UL); /* デフォルトではナノ秒単位 */
}
#include "sysapi_local.h"
+/* 精度の良いタイマを持ったシステムでは本関数を
+ オーバーライドすることで、高精度のCPU時刻計測が可能となる */
+
/**< 現在のCPU時刻取得(システム用) */
SYSTIM_CPUTIME SysTim_GetCpuTime(void)
{
- return 0;
+ return SysTim_TimeCounter;
}
/** %jp{他タスクを終了する} */
void _kernel_dsp_ter_tsk(_KERNEL_T_TSKHDL tskhdl)
{
- _KERNEL_T_TCB_PTR tcb;
+ _KERNEL_T_TCB_PTR tcb;
+ _KERNEL_TSK_T_TSKSTAT tskstat;
/* %jp{TCBを取得} */
tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
+ /* %jp{現在の状態を取得} */
+ tskstat = _KERNEL_TSK_GET_TSKSTAT(tcb);
+
+ if ( tskstat == _KERNEL_TTS_RDY )
+ {
+ /* %jp{レディーキューから削除} */
+ _KERNEL_SYS_RMV_RDQ(tskhdl);
+ }
+ else
+ {
+ /* 待ちキューから取り外す */
+ _KERNEL_SYS_RMV_TOQ(tskhdl);
+ _KERNEL_TRM_QUE(tskhdl);
+ }
+
/* %jp{休止状態に設定} */
- _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_DMT);
-
- /* %jp{レディーキューから取り外す} */
- _KERNEL_SYS_RMV_RDQ(tskhdl);
+ _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_DMT);
}
*/
ER ter_tsk(ID tskid)
{
- _KERNEL_T_TSKHDL tskhdl;
- _KERNEL_T_TCB *tcb;
- _KERNEL_T_TCB_RO *tcb_ro;
- _KERNEL_TSK_T_ACTCNT actcnt;
-
+ _KERNEL_T_TSKHDL tskhdl;
+ _KERNEL_T_TCB_PTR tcb;
+ _KERNEL_T_TCB_RO_PTR tcb_ro;
+ _KERNEL_TSK_T_ACTCNT actcnt;
+
+
/* %jp{ID のチェック} */
#if _KERNEL_SPT_TER_TSK_E_ID
if ( !_KERNEL_TSK_CHECK_TSKID(tskid) )
return E_ILUSE; /* %jp{サービスコール不正使用} */
}
#endif
-
- /* %jp{レディーキューから削除} */
- _KERNEL_DSP_EXT_TSK(tskhdl);
+
+
+ /* 状態チェック */
+#if _KERNEL_SPT_TER_TSK_E_OBJ
+ if ( _KERNEL_TSK_GET_TSKSTAT(tcb) == _KERNEL_TTS_DMT )
+ {
+ _KERNEL_LEAVE_SVC(); /* %jp{サービスコールを出る}%en{leave service-call} */
+ return E_OBJ; /* %jp{オブジェクト状態エラー} */
+ }
+
+#endif
+
+
+ /* タスクを終了させる */
+ _KERNEL_DSP_TER_TSK(tskhdl);
+
/* %jp{所有ミューテックスがあれば開放} */
#if _KERNEL_SPT_MTX