fprintf(fp, "\t\t{(FP)(_kernel_hw_fault_handler)},\t\t/* hard fault handler */\n");
break;
+ case 14:
+ fprintf(fp, "\t\t{(FP)(_kernel_pendsv_handler)},\t\t/* hard fault handler */\n");
+ break;
+
default:
for ( j = 0; j < m_iObjs; j++ )
{
{
FILE* fpInput;
FILE* fpCfg;
- FILE* fpVct;
FILE* fpId;
int iErr;
int i;
#ifdef _KERNEL_PROCATR_ARM_CORTEX_M3
// ベクタファイルオープン
+ FILE* fpVct;
if ( (fpVct = fopen(s_szVctFile, "w")) == NULL )
{
fprintf(stderr, "could not open file \"%s\"\n", s_szVctFile);
if ( strcmp(pszStack, "NULL") == 0 )
{
- fprintf(fp, "&_kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)]", pszSize, pszSize);
+ fprintf(fp, "&_kernel_int_stkblk[((%s) + sizeof(VP) - 1) / sizeof(VP)]", pszSize);
}
else
{
ASRCS += $(SRC_PROC_CC_DIR)/krst_hdr.S
ASRCS += $(SRC_PROC_CC_DIR)/knmi_hdr.S
ASRCS += $(SRC_PROC_CC_DIR)/khwf_hdr.S
+ASRCS += $(SRC_PROC_CC_DIR)/kpnd_hdr.S
ASRCS += $(SRC_PROC_CC_DIR)/kdis_int.S
ASRCS += $(SRC_PROC_CC_DIR)/kena_int.S
ASRCS += $(SRC_PROC_CC_DIR)/kcre_ctx.S
ASRCS += $(SRC_PROC_CC_DIR)/krst_ctx.S
ASRCS += $(SRC_PROC_CC_DIR)/kswi_ctx.S
ASRCS += $(SRC_PROC_CC_DIR)/kwai_int.S
-
-
-
+ASRCS += $(SRC_PROC_CC_DIR)/kref_ctl.S
# %jp{C言語ファイルの追加}%en{C sources}
-#CSRCS += $(SRC_PROC_DIR)/val_int.c
-#CSRCS += $(SRC_IRC_DIR)/kini_irc.c
-#CSRCS += $(SRC_IRC_DIR)/kexe_irc.c
-#CSRCS += $(SRC_IRC_DIR)/ena_int.c
-#CSRCS += $(SRC_IRC_DIR)/dis_int.c
-#CSRCS += $(SRC_IRC_DIR)/vclr_int.c
-
+CSRCS += $(SRC_PROC_DIR)/ena_int.c
+CSRCS += $(SRC_PROC_DIR)/dis_int.c
+CSRCS += $(SRC_PROC_DIR)/vclr_int.c
# %jp{カーネル共通ソースの追加}%en{kernel common sources}
include $(KERNEL_MAKINC_DIR)/knlsrc.inc
#define _KERNEL_PROCATR_STK_ALIGN 1 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN TRUE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
#endif /* _KERNEL__arch__proc__8080__z80__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 8 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
/* %jp{ARM固有の定数} */
#define _KERNEL_ARM_INHNO_IRQ 0 /**< %jp{IRQ割込みの割込みハンドラ番号} */
-
-
#endif /* _KERNEL__arch__proc__arm__arm_v4t__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 8 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
/* %jp{ARM固有の定数} */
#define _KERNEL_ARM_INHNO_IRQ 0 /**< %jp{IRQ割込みの割込みハンドラ番号} */
-/**
+/**
* Hyper Operating System V4 Advance
*
* @file proc.h
#ifndef _KERNEL__arch__proc__arm__arm_v7m__proc_h__
#define _KERNEL__arch__proc__arm__arm_v7m__proc_h__
+#define _KERNEL_REG_INT_CONTROL ((volatile UW *)0xE000ED04) /**< %jp{割り込み制御状態レジスタ}%en{Interrupt Control State Register} */
-
-#define _KERNEL_IMSK_F 0x40 /**< %jp{FIQ割込みマスクビット} */
-#define _KERNEL_IMSK_I 0x80 /**< %jp{IRQ割込みマスクビット} */
-
-#define _KERNEL_IMSK_LV0 0xc0 /**< %jp{割込みマスクレベル0(すべてマスク)} */
-#define _KERNEL_IMSK_LV1 0x80 /**< %jp{割込みマスクレベル1(FIQのみ許可)} */
-#define _KERNEL_IMSK_LV2 0x00 /**< %jp{割込みマスクレベル2(すべて許可)} */
+#define _KERNEL_REG_INT_SETENA_BASE ((volatile UW *)0xE000E100) /**< %jp{割り込みイネーブルセットレジスタ} */
+#define _KERNEL_REG_INT_CLRENA_BASE ((volatile UW *)0xE000E180) /**< %jp{割り込みイネーブルクリアレジスタ} */
+#define _KERNEL_REG_INT_SETPEND_BASE ((volatile UW *)0xE000E200) /**< %jp{割り込み保留セットレジスタ} */
+#define _KERNEL_REG_INT_CLRPEND_BASE ((volatile UW *)0xE000E280) /**< %jp{割り込み保留クリアレジスタ} */
/** %jp{コンテキスト制御ブロック} */
VP sp;
} _KERNEL_T_CTXCB;
-#if 0
-/** %jp{割込みコンテキスト制御ブロック} */
-typedef struct _kernel_t_ictxcb
-{
- UB imsk;
- UB intcnt;
- VP isp;
-} _KERNEL_T_ICTXCB;
-
-
-extern _KERNEL_T_ICTXCB _kernel_ictxcb; /**< %jp{割込みコンテキスト制御ブロック} */
-#endif
#ifdef __cplusplus
#endif
void _kernel_reset_handler(void);
-void _kernel_nmi_handler();
-void _kernel_hw_fault_handler();
+void _kernel_nmi_handler(void);
+void _kernel_hw_fault_handler(void);
+void _kernel_pendsv_handler(void);
+
+int _kernel_ref_cpu_control(void); /**< %jp{CONTROLレジスタの取得} */
+
void _kernel_ena_int(void); /**< %jp{割込み許可} */
void _kernel_dis_int(void); /**< %jp{割込み禁止} */
#define _KERNEL_WAI_INT() _kernel_wai_int() /**< %jp{割込み待ち(アイドル時の処理)} */
#define _KERNEL_CRE_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2) \
- _kernel_cre_ctx((pk_ctxcb), (isp), (entry), (exinf1), (exinf2)) /**< %jp{実行コンテキストの作成} */
+ _kernel_cre_ctx((pk_ctxcb), (isp), (entry), (exinf1), (exinf2)) /**< %jp{実行コンテキストの作成} */
#define _KERNEL_DEL_CTX(pk_ctxcb) do {} while (0) /**< %jp{実行コンテキストの削除} */
#define _KERNEL_RST_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2) \
_kernel_rst_ctx((exinf1), (exinf2), (entry), (isp)) /**< %jp{実行コンテキストのリスタート} */
_kernel_swi_ctx((pk_ctxinf_nxt), (pk_ctxcb_now)) /**< %jp{実行コンテキストの切替} */
+#define _KERNEL_PROC_SET_CTX() do { } while (0)
+#define _KERNEL_PROC_CLR_CTX() do { } while (0)
+#define _KERNEL_PROC_SNS_CTX() ((_kernel_ref_cpu_control() & 0x00000002) != 0)
+
+#define _KERNEL_PROC_SET_DLY() do { *_KERNEL_REG_INT_CONTROL |= 0x10000000; } while (0)
+#define _KERNEL_PROC_CLR_DLY() do { *_KERNEL_REG_INT_CONTROL |= 0x08000000; } while (0)
+#define _KERNEL_PROC_SNS_DLY() ((*_KERNEL_REG_INT_CONTROL & 0x10000000) != 0)
+
+
#endif /* _KERNEL__arch__proc__arm__arm_v7m__proc_h__ */
-/**
+/**
* Hyper Operating System V4 Advance
*
* @file procatr.h
#define _KERNEL_PROCATR_SPT_MULTINT TRUE /**< %jp{多重割込みに対応しているか?} */
#define _KERNEL_PROCATR_TMIN_INHNO 0 /**< %jp{割込みハンドラ番号の最小値} */
-#define _KERNEL_PROCATR_TMAX_INHNO 64 /**< %jp{割込みハンドラ番号の最大値} */
+#define _KERNEL_PROCATR_TMAX_INHNO 255 /**< %jp{割込みハンドラ番号の最大値} */
#define _KERNEL_PROCATR_TMIN_EXCNO 0 /**< %jp{CPU例外ハンドラ番号の最小値} */
-#define _KERNEL_PROCATR_TMAX_EXCNO 4 /**< %jp{CPU例外ハンドラ番号の最大値} */
+#define _KERNEL_PROCATR_TMAX_EXCNO 15 /**< %jp{CPU例外ハンドラ番号の最大値} */
-#define _KERNEL_PROCATR_SYSSTK_NUM 2 /**< %jp{システムスタックは何本必要か?} */
+#define _KERNEL_PROCATR_SYSSTK_NUM 1 /**< %jp{システムスタックは何本必要か?} */
#define _KERNEL_PROCATR_SIGNED_INT 0 /**< %jp{符号付整数と符号無し整数のどちらが得意か?(符号付き:1, 符号無し:-1, 同じ:0)} */
#define _KERNEL_PROCATR_TBIT_INT 32 /**< %jp{プロセッサに最適な整数型のビット数} */
#define _KERNEL_PROCATR_TBIT_PTR 32 /**< %jp{ポインタのビット数} */
-#define _KERNEL_PROCATR_MEM_ALIGN 32 /**< %jp{適切なメモリのアライメント(byte単位)} */
+#define _KERNEL_PROCATR_MEM_ALIGN 4 /**< %jp{適切なメモリのアライメント(byte単位)} */
#define _KERNEL_PROCATR_STK_ALIGN 8 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX TRUE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY TRUE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__arm__arm_v7m__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 8 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__h8__h8300h__procatr_h__ */
#define _KERNEL_PROCATR_ALLOW_UNALIGN TRUE /**< %jp{データのアンアラインアクセスは可能か?} */
#define _KERNEL_PROCATR_ALLOW_INST_UNALIGN TRUE /**< %jp{命令のアンアライン配置は可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
+
#endif /* _KERNEL__arch__proc__h8__h8300ha__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 8 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__h8__h8300h__procatr_h__ */
#define _KERNEL_PROCATR_ALLOW_UNALIGN TRUE /**< %jp{データのアンアラインアクセスは可能か?} */
#define _KERNEL_PROCATR_ALLOW_INST_UNALIGN TRUE /**< %jp{命令のアンアライン配置は可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__h8__h8s2600a__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 8 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN TRUE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__ia32__i386__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 4 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__mb__mb_v8__procatr_h__ */
#define _KERNEL_ARM_EXCNO_PRE 3 /**< %jp{プリフェッチアボートのCPU例外ハンドラ番号} */
#define _KERNEL_ARM_EXCNO_ABT 4 /**< %jp{データアボートのCPU例外ハンドラ番号} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__mips__mips1__procatr_h__ */
#define _KERNEL_ARM_EXCNO_PRE 3 /**< %jp{プリフェッチアボートのCPU例外ハンドラ番号} */
#define _KERNEL_ARM_EXCNO_ABT 4 /**< %jp{データアボートのCPU例外ハンドラ番号} */
-
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
#define _KERNEL_PROCATR_STK_ALIGN 4 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__sh__sh2__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 4 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__sh__sh2a_fpu__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 4 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__v850__v850e__procatr_h__ */
#define _KERNEL_PROCATR_STK_ALIGN 1 /**< %jp{適切なスタックのアライメント(byte単位)} */
#define _KERNEL_PROCATR_ALLOW_UNALIGN TRUE /**< %jp{アンアラインアクセスは可能か?} */
+#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */
+#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */
+
#endif /* _KERNEL__arch__proc__win__win32__procatr_h__ */
-/**
+/**
* Hyper Operating System V4 Advance
*
* @file sys.h
{
_KERNEL_T_RDQCB rdqcb; /**< %jp{レディーキュー}%en{ready-queue} */
- _KERNEL_T_TIMCB timcb;
+ _KERNEL_T_TIMCB timcb;
#if _KERNEL_SPT_TOQ
_KERNEL_T_TOQCB toqcb; /**< %jp{タイムアウトキュー}%en{timeout-queue} */
#define _KERNEL_SYS_INI_TIM() _KERNEL_INI_TIM(_KERNEL_SYS_GET_TIMCB(), _KERNEL_SYS_GET_TIMCB_RO())
#define _KERNEL_SYS_SIG_TIM() _KERNEL_SIG_TIM(_KERNEL_SYS_GET_TIMCB(), _KERNEL_SYS_GET_TIMCB_RO())
#define _KERNEL_SYS_GET_TIC() _KERNEL_GET_TIC(_KERNEL_SYS_GET_TIMCB(), _KERNEL_SYS_GET_TIMCB_RO())
-#define _KERNEL_SYS_SET_TIM(p_tim) _KERNEL_SET_TIM(_KERNEL_SYS_GET_TIMCB(), (p_tim))
-#define _KERNEL_SYS_GET_TIM() _KERNEL_GET_TIM(_KERNEL_SYS_GET_TIMCB())
+#define _KERNEL_SYS_SET_TIM(p_tim) _KERNEL_SET_TIM(_KERNEL_SYS_GET_TIMCB(), (p_tim))
+#define _KERNEL_SYS_GET_TIM() _KERNEL_GET_TIM(_KERNEL_SYS_GET_TIMCB())
/* timeout queue */
#define _KERNEL_SYS_GET_TOQCB() (&_kernel_syscb.toqcb) /**< %jp{タイムアウトキューの取得} */
-#define _KERNEL_SYS_ADD_TOQ(tskhdl, tmout) _KERNEL_ADD_TOQ(_KERNEL_SYS_GET_TOQCB(), (tskhdl), (tmout))
-#define _KERNEL_SYS_RMV_TOQ(tskhd) _KERNEL_RMV_TOQ(_KERNEL_SYS_GET_TOQCB(), (tskhd))
-#define _KERNEL_SYS_SIG_TOQ(tictim) _KERNEL_SIG_TOQ(_KERNEL_SYS_GET_TOQCB(), (tictim))
+#define _KERNEL_SYS_ADD_TOQ(tskhdl, tmout) _KERNEL_ADD_TOQ(_KERNEL_SYS_GET_TOQCB(), (tskhdl), (tmout))
+#define _KERNEL_SYS_RMV_TOQ(tskhd) _KERNEL_RMV_TOQ(_KERNEL_SYS_GET_TOQCB(), (tskhd))
+#define _KERNEL_SYS_SIG_TOQ(tictim) _KERNEL_SIG_TOQ(_KERNEL_SYS_GET_TOQCB(), (tictim))
/* timer queue */
#define _KERNEL_SYS_GET_TMQ() (&_kernel_syscb.tmqcb) /**< %jp{タイマキューの取得} */
#define _KERNEL_SYS_GET_SYSISP() ((VP)((UB *)_KERNEL_SYS_GET_SYSSTK() + _KERNEL_SYS_GET_SYSSTKSZ())) /**< %jp{カレントプロセッサのシステムコンテキストの初期スタックポインタ取得} */
+#if _KERNEL_PROCATR_SYS_CTX
+#define _KERNEL_SYS_SET_CTX() _KERNEL_PROC_SET_CTX() /**< %jp{非タスクコンテキストに設定} */
+#define _KERNEL_SYS_CLR_CTX() _KERNEL_PROC_CLR_CTX() /**< %jp{非タスクコンテキストを解除} */
+#define _KERNEL_SYS_SNS_CTX() _KERNEL_PROC_SNS_CTX() /**< %jp{コンテキスト状態を参照} */
+#else
#define _KERNEL_SYS_SET_CTX() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_CTX; } while (0) /**< %jp{非タスクコンテキストに設定} */
#define _KERNEL_SYS_CLR_CTX() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_CTX; } while (0) /**< %jp{非タスクコンテキストを解除} */
#define _KERNEL_SYS_SNS_CTX() ((_KERNEL_SYS_GET_PRCCB()->stat & _KERNEL_TSS_CTX) ? TRUE : FALSE) /**< %jp{コンテキスト状態を参照} */
+#endif
+#if _KERNEL_PROCATR_SYS_LOC
+#define _KERNEL_SYS_SET_LOC() _KERNEL_PROC_SET_CTX() /**< %jp{ロック状態を設定} */
+#define _KERNEL_SYS_CLR_LOC() _KERNEL_PROC_CLR_CTX() /**< %jp{ロック状態を解除} */
+#define _KERNEL_SYS_SNS_LOC() _KERNEL_PROC_SNS_CTX() /**< %jp{ロック状態を参照} */
+#else
#define _KERNEL_SYS_SET_LOC() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_LOC; } while (0) /**< %jp{ロック状態を設定} */
#define _KERNEL_SYS_CLR_LOC() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_LOC; } while (0) /**< %jp{ロック状態を解除} */
#define _KERNEL_SYS_SNS_LOC() ((_KERNEL_SYS_GET_STST() & _KERNEL_TSS_LOC) ? TRUE : FALSE) /**< %jp{ロック状態を参照} */
+#endif
+#if _KERNEL_PROCATR_SYS_DSP
+#define _KERNEL_SYS_SET_DSP() _KERNEL_PROC_SET_DSP() /**< %jp{ディスパッチ禁止状態を設定} */
+#define _KERNEL_SYS_CLR_DSP() _KERNEL_PROC_CLR_DSP() /**< %jp{ディスパッチ禁止状態を解除} */
+#define _KERNEL_SYS_SNS_DSP() _KERNEL_PROC_SNS_DSP() /**< %jp{ディスパッチ禁止状態を参照} */
+#else
#define _KERNEL_SYS_SET_DSP() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_DSP; } while (0) /**< %jp{ディスパッチ禁止状態を設定} */
#define _KERNEL_SYS_CLR_DSP() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_DSP; } while (0) /**< %jp{ディスパッチ禁止状態を解除} */
#define _KERNEL_SYS_SNS_DSP() ((_KERNEL_SYS_GET_PRCCB()->stat & _KERNEL_TSS_DSP) ? TRUE : FALSE) /**< %jp{ディスパッチ禁止状態を参照} */
+#endif
+#if _KERNEL_PROCATR_SYS_SYS
+#define _KERNEL_SYS_SET_SYS() _KERNEL_PROC_SET_SYS() /**< %jp{ディスパッチ禁止状態を設定} */
+#define _KERNEL_SYS_CLR_SYS() _KERNEL_PROC_CLR_SYS() /**< %jp{ディスパッチ禁止状態を解除} */
+#define _KERNEL_SYS_SNS_SYS() _KERNEL_PROC_SNS_SYS() /**< %jp{ディスパッチ禁止状態を参照} */
+#else
#define _KERNEL_SYS_SET_SYS() do { _KERNEL_SYS_GET_PRCCB()->stat |= _KERNEL_TSS_SYS; } while (0) /**< %jp{システム状態を設定} */
#define _KERNEL_SYS_CLR_SYS() do { _KERNEL_SYS_GET_PRCCB()->stat &= ~_KERNEL_TSS_SYS; } while (0) /**< %jp{システム状態を解除} */
#define _KERNEL_SYS_SNS_SYS() ((_KERNEL_SYS_GET_PRCCB()->stat & _KERNEL_TSS_SYS) ? TRUE : FALSE) /**< %jp{システム状態を参照} */
+#endif
+#if _KERNEL_PROCATR_SYS_DLY
+#define _KERNEL_SYS_SET_DLY() _KERNEL_PROC_SET_DLY() /**< %jp{ディスパッチ禁止状態を設定} */
+#define _KERNEL_SYS_CLR_DLY() _KERNEL_PROC_CLR_DLY() /**< %jp{ディスパッチ禁止状態を解除} */
+#define _KERNEL_SYS_SNS_DLY() _KERNEL_PROC_SNS_DLY() /**< %jp{ディスパッチ禁止状態を参照} */
+#else
#define _KERNEL_SYS_SET_DLY() do { _KERNEL_SYS_GET_PRCCB()->dlydsp = TRUE;} while (0) /**< %jp{ディスパッチ遅延中を設定} */
#define _KERNEL_SYS_CLR_DLY() do { _KERNEL_SYS_GET_PRCCB()->dlydsp = FALSE;} while (0) /**< %jp{ディスパッチ遅延中を解除} */
#define _KERNEL_SYS_SNS_DLY() (_KERNEL_SYS_GET_PRCCB()->dlydsp) /**< %jp{ディスパッチ遅延中を参照} */
+#endif
+#if !_KERNEL_PROCATR_SYS_CTX && !_KERNEL_PROCATR_SYS_LOC && !_KERNEL_PROCATR_SYS_DSP && !_KERNEL_PROCATR_SYS_SYS && !_KERNEL_PROCATR_SYS_DLY
#define _KERNEL_SYS_SNS_DPN() ((_KERNEL_SYS_GET_PRCCB()->stat != _KERNEL_TSS_TSK) ? TRUE : FALSE) /**< %jp{ディスパッチ不能を参照} */
-
+#else
+#define _KERNEL_SYS_SNS_DPN() (_KERNEL_SYS_SNS_CTX() || _KERNEL_SYS_SNS_LOC() || _KERNEL_SYS_SNS_DSP() || _KERNEL_SYS_SNS_SYS())
+#endif
#if _KERNEL_SPT_DPC /* %jp{遅延プロシージャコールの場合} */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file dis_int.c
+ * @brief %jp{ARMv7-M}%en{ARMv7-M}
+ *
+ * Copyright (C) 1998-2011 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+
+
+/* 割込みの禁止 */
+ER dis_int(INTNO intno)
+{
+ if ( intno < _KERNEL_PROCATR_TMIN_INHNO || intno > _KERNEL_PROCATR_TMAX_INHNO )
+ {
+ return E_PAR;
+ }
+
+ *(_KERNEL_REG_INT_CLRENA_BASE + (intno >> 2)) = (1 << (intno & 3));
+
+ return E_OK;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file dis_int.c
+ * @brief %jp{ARMv7-M}%en{ARMv7-M}
+ *
+ * Copyright (C) 1998-2011 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+
+
+/* 割込みの許可 */
+ER ena_int(INTNO intno)
+{
+ if ( intno < _KERNEL_PROCATR_TMIN_INHNO || intno > _KERNEL_PROCATR_TMAX_INHNO )
+ {
+ return E_PAR;
+ }
+
+ *(_KERNEL_REG_INT_SETENA_BASE + (intno >> 2)) = (1 << (intno & 3));
+
+ return E_OK;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * Copyright (C) 1998-2011 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+ .syntax unified
+
+ .text
+ .align 2
+
+ .global _kernel_dsp_tsk
+
+/************************************************
+ PendSV ハンドラ
+ ************************************************/
+ .global _kernel_pendsv_handler
+ .thumb
+ .thumb_func
+ .type _kernel_pendsv_handler, %function
+_kernel_pendsv_handler:
+ /* 割り込み禁止 */
+ cpsid i
+
+ /* スレッドモードへ */
+ mrs r0, control
+ bic r0, r0, #1
+ msr control, r0
+ isb
+
+ /* 遅延ディスパッチ */
+ blx _kernel_dsp_tsk
+
+ /* ハンドラモードへ */
+ mrs r0, control
+ orr r0, r0, #1
+ msr control, r0
+ isb
+
+ /* 割り込み許可 */
+ cpsie i
+
+ /* スレッドモードへの復帰 */
+ movw lr, #0xfffd
+ movt lr, #0xffff
+ bx lr
+
+ .size _kernel_pendsv_handler, .-_kernel_pendsv_handler
+
+
+ .end
+
+
+; end of file
+
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * Copyright (C) 1998-2011 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+ .text
+ .align 2
+
+
+/************************************************
+ CONTROLレジスタの取得
+ int _kernel_ref_cpu_control(void)
+ ************************************************/
+ .global _kernel_ref_cpu_control
+ .thumb
+ .thumb_func
+ .type _kernel_ref_cpu_control, %function
+_kernel_ref_cpu_control:
+ mrs r0, CONTROL
+ bx lr
+ .size _kernel_ref_cpu_control, .-_kernel_ref_cpu_control
+
+ .end
+
+
+/* end of file */
-/**
+/**
* Hyper Operating System V4 Advance
*
* Copyright (C) 1998-2011 by Project HOS
/************************************************
実行コンテキストの切替
void _kernel_swi_ctx(
- _KERNEL_T_CTXCB *pk_ctxinf_nxt, r0 : ç\8f¾å\9c¨ã\81®ã\82³ã\83³ã\83\86ã\82ã\82¹ã\83\88ã\81®ä¿\9då\98å\85\88
- _KERNEL_T_CTXCB *pk_ctxinf_now) r1 : å\88\87ã\82\8aæ\9b¿ã\81\88ã\82\8bã\82³ã\83³ã\83\86ã\82ã\82¹ã\83\88
+ _KERNEL_T_CTXCB *pk_ctxinf_nxt, r0 : å\88\87ã\82\8aæ\9b¿ã\81\88ã\82\8bã\82³ã\83³ã\83\86ã\82ã\82¹ã\83\88
+ _KERNEL_T_CTXCB *pk_ctxinf_now) r1 : ç\8f¾å\9c¨ã\81®ã\82³ã\83³ã\83\86ã\82ã\82¹ã\83\88ã\81®ä¿\9då\98å\85\88
************************************************/
.global _kernel_swi_ctx
.thumb
.thumb_func
.type _kernel_wai_int, %function
_kernel_wai_int:
- /* mcr p15, 0, r0, c7, c0, 4 */ /* WaitForInterrupt */
+ /* WaitForInterrupt */
b _kernel_wai_int
.size _kernel_wai_int, .-_kernel_wai_int
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file dis_int.c
+ * @brief %jp{ARMv7-M}%en{ARMv7-M}
+ *
+ * Copyright (C) 1998-2011 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+
+
+/* 割込みのクリア */
+ER vclr_int(INTNO intno)
+{
+ if ( intno < _KERNEL_PROCATR_TMIN_INHNO || intno > _KERNEL_PROCATR_TMAX_INHNO )
+ {
+ return E_PAR;
+ }
+
+ *(_KERNEL_REG_INT_CLRPEND_BASE + (intno >> 2)) = (1 << (intno & 3));
+
+ return E_OK;
+}
+
+
+
+/* end of file */
-/**
+/**
* Hyper Operating System V4 Advance
*
* @file del_cyc.c
ER del_cyc(ID cycid)
{
_KERNEL_T_CYCCB *cyccb;
- _KERNEL_T_TCB *tcb;
/* %jp{IDチェック}%en{check ID} */
#if _KERNEL_SPT_DEL_CYC_E_ID
if ( !_KERNEL_CYC_CHECK_CYCID(cycid) )
{
return E_ID; /* %jp{不正ID番号}%en{Invalid ID number} */
- }
+ }
#endif
-
+
_KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */
-
+
/* %jp{存在チェック}%en{check object} */
#if _KERNEL_SPT_DEL_CYC_E_NOEXS
if ( !_KERNEL_CYC_CHECK_EXS(cycid) )
return E_NOEXS;
}
#endif
-
+
/* %jp{周期ハンドラコントロールブロック取得} */
cyccb = _KERNEL_CYC_ID2CYCCB(cycid);
-
+
/* %jp{オブジェクト削除} */
#if _KERNEL_CYCCB_ALGORITHM == _KERNEL_CYCCB_ALG_PTRARRAY
_KERNEL_SYS_FRE_HEP(cyccb); /* %jp{メモリ開放} */
#endif
_KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */
-
+
return E_OK;
}
extern VP _kernel_int_stkblk[((512) + sizeof(VP) - 1) / sizeof(VP)];
-_KERNEL_T_INHINF _kernel_inh_tbl[65] =
+_KERNEL_T_INHINF _kernel_inh_tbl[256] =
{
{(FP)(&_kernel_int_stkblk[((512) + sizeof(VP) - 1) / sizeof(VP)])}, /* stack pointer */
{(FP)(_kernel_reset_handler)}, /* reset handler */
{(FP)NULL},
{(FP)NULL},
{(FP)NULL},
+ {(FP)(_kernel_pendsv_handler)}, /* hard fault handler */
+ {(FP)(OsTimer_Isr)},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
+ {(FP)NULL},
{(FP)NULL},
{(FP)NULL},
{(FP)NULL},
+++ /dev/null
-/* ------------------------------------------------------------------------ */
-/* Hyper Operating System V4 サンプルプログラム */
-/* ベクタテーブル */
-/* */
-/* Copyright (C) 1998-2007 by Project HOS */
-/* http://sourceforge.jp/projects/hos/ */
-/* ------------------------------------------------------------------------ */
-
-
- /* --- 外部定数宣言 */
- .global _reset_handler
- .global _kernel_und_hdr
- .global _kernel_swi_hdr
- .global _kernel_pre_hdr
- .global _kernel_abt_hdr
- .global _kernel_irq_hdr
- .global _kernel_fiq_hdr
-
-
- .text
- .align 2
-
-/* --------------------------------------- */
-/* ベクタ定義 */
-/* --------------------------------------- */
- ldr pc, adr_rst_hdr
- ldr pc, adr_und_hdr
- ldr pc, adr_swi_hdr
- ldr pc, adr_pre_hdr
- ldr pc, adr_abt_hdr
- nop
- ldr pc, adr_irq_hdr
- ldr pc, adr_fiq_hdr
-
-
-adr_rst_hdr:
- .long _reset_handler
-adr_und_hdr:
- .long _kernel_und_hdr
-adr_swi_hdr:
- .long _kernel_swi_hdr
-adr_pre_hdr:
- .long _kernel_pre_hdr
-adr_abt_hdr:
- .long _kernel_abt_hdr
-adr_irq_hdr:
- .long _kernel_irq_hdr
-adr_fiq_hdr:
- .long _kernel_fiq_hdr
-
-
- .end
-
-
-/* end of file */
-/**
+/**
* Sample program for Hyper Operating System V4 Advance
*
* @file ostimer.c
#include "ostimer.h"
-#define INTNO_TIMER0 4
-
-
-static void OsTimer_Isr(VP_INT exinf); /**< %jp{タイマ割込みサービスルーチン} */
+#define REG_SCSR ((volatile UW *)0xE000E010) /* SysTick Control and Status Register */
+#define REG_SRVR ((volatile UW *)0xE000E014) /* SysTick Reload Value Register */
+#define REG_SCUVR ((volatile UW *)0xE000E018) /* SysTick Current Value Register */
+#define REG_SCAVR ((volatile UW *)0xE000E01c) /* SysTick Calibration Value Register */
/** %jp{OS用タイマ初期化ルーチン} */
void OsTimer_Initialize(VP_INT exinf)
{
- T_CISR cisr;
-
- /* %jp{割込みサービスルーチン生成} */
-/*
- cisr.isratr = TA_HLNG;
- cisr.exinf = 0;
- cisr.intno = INTNO_TIMER0;
- cisr.isr = (FP)OsTimer_Isr;
- acre_isr(&cisr);
-*/
-
-/* ena_int(INTNO_TIMER0); */
-
/* %jp{タイマ動作開始} */
+ *REG_SRVR = 1000000;
+ *REG_SCUVR = 0;
+ *REG_SCSR = 0x00000007;
+
+ ena_int(15);
}
/** %jp{タイマ割込みハンドラ} */
-void OsTimer_Isr(VP_INT exinf)
+void OsTimer_Isr(void)
{
/* %jp{割込み要因クリア} */
-
+ vclr_int(15);
+
/* %jp{タイムティック供給} */
isig_tim();
}
-/**
+/**
* Sample program for Hyper Operating System V4 Advance
*
* @file ostimer.c
/** %jp{OS用タイマ初期化ルーチン} */
void OsTimer_Initialize(VP_INT exinf);
+void OsTimer_Isr(void);
#ifdef __cplusplus
}
-/**
+/**
* Sample program for Hyper Operating System V4 Advance
*
* @file sample.c
#define RIGHT(num) ((num) >= 5 ? 1 : (num) + 1)
-ID mbxid;
-ID mpfid;
-
-
-/** %jp{メッセージ構造体} */
-typedef struct t_print_msg
-{
- T_MSG msg;
- char text[32];
-} T_PRINT_MSG;
-
-
/** %jp{初期化ハンドラ} */
void Sample_Initialize(VP_INT exinf)
{
- T_CMPF cmpf;
- T_CMBX cmbx;
-
/* %jp{UART初期化} */
Uart_Initialize();
-
- /* %jp{固定長メモリプール生成} */
- cmpf.mpfatr = TA_TFIFO;
- cmpf.blkcnt = 3;
- cmpf.blksz = sizeof(T_PRINT_MSG);
- cmpf.mpf = NULL;
- mpfid = acre_mpf(&cmpf);
-
- /* %jp{メールボックス生成} */
- cmbx.mbxatr = TA_TFIFO | TA_TFIFO;
- cmbx.maxmpri = 1;
- cmbx.mprihd = NULL;
- mbxid = acre_mbx(&cmbx);
-
- /* %jp{タスク起動} */
- act_tsk(TSKID_PRINT);
- act_tsk(TSKID_SAMPLE1);
- act_tsk(TSKID_SAMPLE2);
- act_tsk(TSKID_SAMPLE3);
- act_tsk(TSKID_SAMPLE4);
- act_tsk(TSKID_SAMPLE5);
}
int r;
wai_sem(SEMID_RAND);
- r = rand();
+ r = 500; /*rand();*/
sig_sem(SEMID_RAND);
dly_tsk((r % 100) + 10);
/** %jp{状態表示} */
void print_state(int num, char *text)
{
- T_PRINT_MSG *msg;
- VP mem;
-
- /* %jp{メモリ取得} */
- get_mpf(mpfid, &mem);
- msg = (T_PRINT_MSG *)mem;
+ wai_sem(SEMID_UART);
/* %jp{文字列生成} */
- msg->text[0] = '0' + num;
- msg->text[1] = ' ';
- msg->text[2] = ':';
- msg->text[3] = ' ';
- strcpy(&msg->text[4], text);
- strcat(msg->text, "\n");
-
- /* %jp{表示タスクに送信} */
- snd_mbx(mbxid, (T_MSG *)msg);
+ Uart_PutChar('0' + num);
+ Uart_PutChar(' ');
+ Uart_PutChar(':');
+ Uart_PutChar(' ');
+ Uart_PutString(text);
+
+ sig_sem(SEMID_UART);
}
void Sample_Task(VP_INT exinf)
{
int num;
-
+
num = (int)exinf;
-
+
/* %jp{いわゆる哲学者の食事の問題} */
for ( ; ; )
{
/* %jp{適当な時間考える} */
print_state(num, "thinking");
rand_wait();
-
+
/* %jp{左右のフォークを取るまでループ} */
for ( ; ; )
{
break; /* %jp{両方取れた} */
}
sig_sem(LEFT(num)); /* %jp{取れなければ離す} */
-
+
/* %jp{適当な時間待つ} */
print_state(num, "hungry");
rand_wait();
print_state(num, "hungry");
rand_wait();
}
-
+
/* %jp{適当な時間、食べる} */
print_state(num, "eating");
rand_wait();
-
+
/* %jp{フォークを置く} */
sig_sem(LEFT(num));
sig_sem(RIGHT(num));
}
-/** %jp{表示タスク} */
-void Sample_Print(VP_INT exinf)
-{
- T_PRINT_MSG *msg;
-
- for ( ; ; )
- {
- rcv_mbx(mbxid, (T_MSG **)&msg);
- Uart_PutString(msg->text);
- rel_mpf(mpfid, msg);
- }
-}
-
-
/* end of file */
-/**
+/**
* Sample program for Hyper Operating System V4 Advance
*
* @file system.cfg
KERNEL_SYS_STK(256, NULL);
KERNEL_INT_STK(512, NULL);
KERNEL_MAX_TSKID(5);
-KERNEL_MAX_SEMID(6);
-KERNEL_MAX_FLGID(2);
-KERNEL_MAX_MBXID(2);
-KERNEL_MAX_MPFID(2);
-KERNEL_MAX_ISRID(4);
+KERNEL_MAX_SEMID(7);
+KERNEL_MAX_FLGID(0);
+KERNEL_MAX_MBXID(0);
+KERNEL_MAX_MPFID(0);
+KERNEL_MAX_MTXID(0);
/* %jp{OSタイマの設定}%en{OS timer} */
INCLUDE("\"ostimer.h\"");
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
+DEF_INH(15, {TA_HLNG, OsTimer_Isr}); /* 15:SysTick */
/* %jp{サンプル}%en{Sample program} */
INCLUDE("\"sample.h\"");
ATT_INI({TA_HLNG, 0, Sample_Initialize});
-CRE_TSK(TSKID_PRINT, {TA_HLNG, 1, Sample_Print, 1, 512, NULL});
-CRE_TSK(TSKID_SAMPLE1, {TA_HLNG, 1, Sample_Task, 2, 512, NULL});
-CRE_TSK(TSKID_SAMPLE2, {TA_HLNG, 2, Sample_Task, 2, 512, NULL});
-CRE_TSK(TSKID_SAMPLE3, {TA_HLNG, 3, Sample_Task, 2, 512, NULL});
-CRE_TSK(TSKID_SAMPLE4, {TA_HLNG, 4, Sample_Task, 2, 512, NULL});
-CRE_TSK(TSKID_SAMPLE5, {TA_HLNG, 5, Sample_Task, 2, 512, NULL});
+CRE_TSK(TSKID_SAMPLE1, {TA_HLNG | TA_ACT, 1, Sample_Task, 2, 512, NULL});
+CRE_TSK(TSKID_SAMPLE2, {TA_HLNG | TA_ACT, 2, Sample_Task, 2, 512, NULL});
+CRE_TSK(TSKID_SAMPLE3, {TA_HLNG | TA_ACT, 3, Sample_Task, 2, 512, NULL});
+CRE_TSK(TSKID_SAMPLE4, {TA_HLNG | TA_ACT, 4, Sample_Task, 2, 512, NULL});
+CRE_TSK(TSKID_SAMPLE5, {TA_HLNG | TA_ACT, 5, Sample_Task, 2, 512, NULL});
CRE_SEM(1, {TA_TFIFO, 1, 1});
CRE_SEM(2, {TA_TFIFO, 1, 1});
CRE_SEM(3, {TA_TFIFO, 1, 1});
CRE_SEM(4, {TA_TFIFO, 1, 1});
CRE_SEM(5, {TA_TFIFO, 1, 1});
CRE_SEM(SEMID_RAND, {TA_TFIFO, 1, 1});
+CRE_SEM(SEMID_UART, {TA_TFIFO, 1, 1});
/* end of file */