/******************************************************************************/
/* src/kernel/include/hardware/I8254/I8254.h */
-/* 2016/12/16 */
-/* Copyright (C) 2016 Mochi. */
+/* 2018/10/22 */
+/* Copyright (C) 2016-2018 Mochi. */
/******************************************************************************/
#ifndef I8254_H
#define I8254_H
#define I8254_CTRLW_BCD_BIN ( 0x00 ) /**< カウント方法:バイナリ */
#define I8254_CTRLW_BCD_BCD ( 0x01 ) /**< カウント方法:BCD */
+/** クロック数(Hz) */
+#define I8254_CLOCK ( 1193182 )
+
/** カウンタ(最下位バイト)マクロ */
#define I8254_CNTR_LOW( _CNT ) \
- ( ( uint8_t ) ( ( uint16_t ) ( _CNT ) & 0x00FF ) )
+ ( ( uint8_t ) ( ( ( uint16_t ) ( _CNT ) ) & 0x00FF ) )
/** カウンタ(最上位バイト)マクロ */
#define I8254_CNTR_HIGH( _CNT ) \
- ( ( uint8_t ) ( ( uint16_t ) ( _CNT ) & 0xFF00 ) >> 8 )
+ ( ( uint8_t ) ( ( ( ( uint16_t ) ( _CNT ) ) & 0xFF00 ) >> 8 ) )
/******************************************************************************/
/******************************************************************************/
/* src/include/kernel/config.h */
-/* 2018/06/18 */
+/* 2018/10/20 */
/* Copyright (C) 2018 Mochi. */
/******************************************************************************/
#ifndef _MK_CONFIG_H_
#define MK_CONFIG_TASKID_NULL \
( MK_CONFIG_TASKID_MAX + 1 ) /** 無効タスクID */
+/*------*/
+/* tick */
+/*------*/
+/** tick間隔(hz) */
+#define MK_CONFIG_TICK_HZ ( 100 )
+
+/*----------------------*/
/* 仮想メモリマップ定義 */
-#define MK_CONFIG_ADDR_KERNEL_START ( 0x00100000 ) /** カーネル領域先頭アドレス */
-#define MK_CONFIG_ADDR_KERNEL_STACK ( 0x3EFFE000 ) /** カーネル用スタック領域先頭アドレス */
-#define MK_CONFIG_SIZE_KERNEL_STACK ( 0x00002000 ) /** カーネル用スタック領域サイズ */
-#define MK_CONFIG_ADDR_KERNEL_MAP1 ( 0x3F000000 ) /** メモリ制御用領域1先頭アドレス */
-#define MK_CONFIG_SIZE_KERNEL_MAP1 ( 0x00800000 ) /** メモリ制御用領域1サイズ */
-#define MK_CONFIG_ADDR_KERNEL_MAP2 ( 0x3F800000 ) /** メモリ制御用領域2先頭アドレス */
-#define MK_CONFIG_SIZE_KERNEL_MAP2 ( 0x00800000 ) /** メモリ制御用領域2サイズ */
-#define MK_CONFIG_SIZE_KERNEL_MAP ( 0x01000000 ) /** メモリ制御用領域全サイズ */
-#define MK_CONFIG_ADDR_APL_START ( 0x40000000 ) /** アプリ領域先頭アドレス */
-#define MK_CONFIG_ADDR_APL_STACK ( 0xFFFFE000 ) /** アプリ用スタック領域先頭アドレス */
-#define MK_CONFIG_SIZE_APL_STACK ( 0x00002000 ) /** アプリ用スタック領域サイズ */
+/*----------------------*/
+/** カーネル領域先頭アドレス */
+#define MK_CONFIG_ADDR_KERNEL_START ( MK_ADDR_ENTRY )
+/** カーネル用スタック領域先頭アドレス */
+#define MK_CONFIG_ADDR_KERNEL_STACK ( 0x3EFFE000 )
+/** カーネル用スタック領域サイズ */
+#define MK_CONFIG_SIZE_KERNEL_STACK ( 0x00002000 )
+/** メモリ制御用領域1先頭アドレス */
+#define MK_CONFIG_ADDR_KERNEL_MAP1 ( 0x3F000000 )
+/** メモリ制御用領域1サイズ */
+#define MK_CONFIG_SIZE_KERNEL_MAP1 ( 0x00800000 )
+/** メモリ制御用領域2先頭アドレス */
+#define MK_CONFIG_ADDR_KERNEL_MAP2 ( 0x3F800000 )
+/** メモリ制御用領域2サイズ */
+#define MK_CONFIG_SIZE_KERNEL_MAP2 ( 0x00800000 )
+/** メモリ制御用領域全サイズ */
+#define MK_CONFIG_SIZE_KERNEL_MAP ( 0x01000000 )
+/** アプリ領域先頭アドレス */
+#define MK_CONFIG_ADDR_APL_START ( 0x40000000 )
+/** アプリ用スタック領域先頭アドレス */
+#define MK_CONFIG_ADDR_APL_STACK ( 0xBFFFE000 )
+/** アプリ用スタック領域サイズ */
+#define MK_CONFIG_SIZE_APL_STACK ( 0x00008000 )
+/*------------*/
/* 割込み番号 */
-#define MK_CONFIG_INTNO_MESSAGE ( 0x30 ) /** メッセージパッシング割込み番号 */
-#define MK_CONFIG_INTNO_IOPORT ( 0x31 ) /** I/Oポート制御割込み番号 */
-#define MK_CONFIG_INTNO_INTERRUPT ( 0x32 ) /** ハードウェア割込み制御割込み番号 */
+/*------------*/
+/** メッセージパッシング割込み番号 */
+#define MK_CONFIG_INTNO_MESSAGE ( 0x30 )
+/** I/Oポート制御割込み番号 */
+#define MK_CONFIG_INTNO_IOPORT ( 0x31 )
+/** ハードウェア割込み制御割込み番号 */
+#define MK_CONFIG_INTNO_INTERRUPT ( 0x33 )
+/** タイマ割込み番号 */
+#define MK_CONFIG_INTNO_TIMER ( 0x34 )
/******************************************************************************/
/******************************************************************************/
/* src/include/kernel/library.h */
+<<<<<<< Updated upstream
/* 2018/06/19 */
+=======
+/* 2018/10/22 */
+>>>>>>> Stashed changes
/* Copyright (C) 2018 Mochi. */
/******************************************************************************/
#ifndef _MK_LIBRARY_H_
#include <kernel/interrupt.h>
#include <kernel/ioport.h>
#include <kernel/message.h>
+#include <kernel/timer.h>
#include <kernel/types.h>
size_t size,
uint32_t *pErrNo );
+/*-----------*/
+/* MkTimer.c */
+/*-----------*/
+/* スリープ */
+extern int32_t MkTimerSleep( uint32_t usec,
+ uint32_t *pErrNo );
+
/******************************************************************************/
#endif
/******************************************************************************/
/* src/include/kernel/message.h */
-/* 2018/05/06 */
+/* 2018/10/20 */
/* Copyright (C) 2018 Mochi. */
/******************************************************************************/
#ifndef _MK_MESSAGE_H_
/* 定義 */
/******************************************************************************/
/** メッセージサイズ最大 */
-#define MK_MSG_SIZE_MAX ( 4096 )
+#define MK_MSG_SIZE_MAX ( 24576 )
/* 機能ID */
#define MK_MSG_FUNCID_RECEIVE ( 0x00000001 ) /** メッセージ受信 */
--- /dev/null
+/******************************************************************************/
+/* src/include/kernel/timer.h */
+/* 2018/10/22 */
+/* Copyright (C) 2018 Mochi. */
+/******************************************************************************/
+#ifndef _MK_TIMER_H_
+#define _MK_TIMER_H_
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stddef.h>
+#include <stdint.h>
+#include <kernel/config.h>
+#include <kernel/types.h>
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* 機能ID */
+#define MK_TIMER_FUNCID_SLEEP ( 0x00000001 ) /** スリープ */
+
+/* エラー番号 */
+#define MK_TIMER_ERR_NONE ( 0x00000000 ) /** エラー無し */
+#define MK_TIMER_ERR_PARAM_FUNCID ( 0x00000001 ) /** 機能ID不正 */
+#define MK_TIMER_ERR_NO_RESOURCE ( 0x00000002 ) /** リソース不足 */
+
+/* 戻り値 */
+#define MK_TIMER_RET_FAILURE ( -1 ) /** 失敗 */
+#define MK_TIMER_RET_SUCCESS ( 0 ) /** 成功 */
+
+/** タイマパラメータ */
+typedef struct {
+ uint32_t funcId; /**< 機能ID */
+ uint32_t errNo; /**< エラー番号 */
+ int32_t ret; /**< 戻り値 */
+ uint32_t usec; /**< タイマ値(μ秒) */
+} MkTimerParam_t;
+
+
+/******************************************************************************/
+#endif
/******************************************************************************/
/* src/kernel/Debug/DebugLog.c */
-/* 2018/06/16 */
+/* 2018/10/20 */
/* Copyright (C) 2017-2018 Mochi. */
/******************************************************************************/
/******************************************************************************/
#ifdef DEBUG_LOG_ENABLE
/** 識別子変換テーブル */
const static logIdTrans_t gIdTransTbl[ CMN_MODULE_NUM + 1 ] = {
- { CMN_MODULE_INIT_INIT, "INI-INIT" }, /* 初期化制御(初期化) */
- { CMN_MODULE_DEBUG_INIT, "DBG-INIT" }, /* デバッグ制御(初期化) */
- { CMN_MODULE_DEBUG_LOG, "DBG-LOG " }, /* デバッグ制御(ログ管理) */
- { CMN_MODULE_MEMMNG_INIT, "MEM-INIT" }, /* メモリ管理(初期化) */
- { CMN_MODULE_MEMMNG_GDT, "MEM-GDT " }, /* メモリ管理(GDT管理) */
- { CMN_MODULE_MEMMNG_AREA, "MEM-AREA" }, /* メモリ管理(メモリ領域管理) */
- { CMN_MODULE_MEMMNG_PAGE, "MEM-PAGE" }, /* メモリ管理(ページ管理) */
- { CMN_MODULE_MEMMNG_CTRL, "MEM-CTRL" }, /* メモリ管理(メモリ制御) */
- { CMN_MODULE_TASKMNG_INIT, "TSK-INIT" }, /* タスク管理(初期化) */
- { CMN_MODULE_TASKMNG_TSS, "TSK-TSS " }, /* タスク管理(TSS管理) */
- { CMN_MODULE_TASKMNG_SCHED, "TSK-SCHD" }, /* タスク管理(スケジューラ) */
- { CMN_MODULE_TASKMNG_TASK, "TSK-TASK" }, /* タスク管理(タスク管理) */
- { CMN_MODULE_TASKMNG_ELF, "TSK-ELF " }, /* タスク管理(ELFローダ) */
- { CMN_MODULE_TASKMNG_PROC, "TSK-PROC" }, /* タスク管理(プロセス管理) */
- { CMN_MODULE_INTMNG_INIT, "INT-INIT" }, /* 割込管理(初期化) */
- { CMN_MODULE_INTMNG_PIC, "INT-PIC " }, /* 割込管理(PIC管理) */
- { CMN_MODULE_INTMNG_IDT, "INT-IDT " }, /* 割込管理(IDT管理) */
- { CMN_MODULE_INTMNG_HDL, "INT-HDL " }, /* 割込管理(ハンドラ管理) */
- { CMN_MODULE_INTMNG_CTRL, "INT-CTRL" }, /* 割込管理(ハードウェア割込み制御) */
- { CMN_MODULE_TIMERMNG_INIT, "TIM-INIT" }, /* タイマ管理(初期化) */
- { CMN_MODULE_TIMERMNG_PIT, "TIM-PIT " }, /* タイマ管理(PIT管理) */
- { CMN_MODULE_ITCCTRL_INIT, "ITC-INIT" }, /* タスク間通信制御(初期化) */
- { CMN_MODULE_ITCCTRL_MSG, "ITC-MSG " }, /* タスク間通信制御(メッセージ制御) */
- { CMN_MODULE_IOCTRL_INIT, "IOC-INIT" }, /* 入出力制御(初期化) */
- { CMN_MODULE_IOCTRL_PORT, "IOC-PORT" }, /* 入出力制御(I/Oポート制御) */
- { 0, "UNKNOWN " } };/* 終端 */
-#endif
+ { CMN_MODULE_INIT_INIT, "INI-INIT" }, /* 初期化制御(初期化) */
+ { CMN_MODULE_DEBUG_INIT, "DBG-INIT" }, /* デバッグ制御(初期化) */
+ { CMN_MODULE_DEBUG_LOG, "DBG-LOG " }, /* デバッグ制御(ログ) */
+ { CMN_MODULE_MEMMNG_INIT, "MEM-INIT" }, /* メモリ管理(初期化) */
+ { CMN_MODULE_MEMMNG_GDT, "MEM-GDT " }, /* メモリ管理(GDT) */
+ { CMN_MODULE_MEMMNG_AREA, "MEM-AREA" }, /* メモリ管理(領域) */
+ { CMN_MODULE_MEMMNG_PAGE, "MEM-PAGE" }, /* メモリ管理(ページ) */
+ { CMN_MODULE_MEMMNG_CTRL, "MEM-CTRL" }, /* メモリ管理(制御) */
+ { CMN_MODULE_TASKMNG_INIT, "TSK-INIT" }, /* タスク管理(初期化) */
+ { CMN_MODULE_TASKMNG_TSS, "TSK-TSS " }, /* タスク管理(TSS) */
+ { CMN_MODULE_TASKMNG_SCHED, "TSK-SCHD" }, /* タスク管理(スケジューラ) */
+ { CMN_MODULE_TASKMNG_TASK, "TSK-TASK" }, /* タスク管理(タスク) */
+ { CMN_MODULE_TASKMNG_ELF, "TSK-ELF " }, /* タスク管理(ELFローダ) */
+ { CMN_MODULE_TASKMNG_PROC, "TSK-PROC" }, /* タスク管理(プロセス) */
+ { CMN_MODULE_INTMNG_INIT, "INT-INIT" }, /* 割込管理(初期化) */
+ { CMN_MODULE_INTMNG_PIC, "INT-PIC " }, /* 割込管理(PIC) */
+ { CMN_MODULE_INTMNG_IDT, "INT-IDT " }, /* 割込管理(IDT) */
+ { CMN_MODULE_INTMNG_HDL, "INT-HDL " }, /* 割込管理(ハンドラ) */
+ { CMN_MODULE_INTMNG_CTRL, "INT-CTRL" }, /* 割込管理(ハードウェア) */
+ { CMN_MODULE_TIMERMNG_INIT, "TIM-INIT" }, /* タイマ管理(初期化) */
+ { CMN_MODULE_TIMERMNG_CTRL, "TIM-CTRL" }, /* タイマ管理(制御) */
+ { CMN_MODULE_TIMERMNG_PIT, "TIM-PIT " }, /* タイマ管理(PIT) */
+ { CMN_MODULE_ITCCTRL_INIT, "ITC-INIT" }, /* タスク間通信制御(初期化) */
+ { CMN_MODULE_ITCCTRL_MSG, "ITC-MSG " }, /* タスク間通信制御(メッセージ) */
+ { CMN_MODULE_IOCTRL_INIT, "IOC-INIT" }, /* 入出力制御(初期化) */
+ { CMN_MODULE_IOCTRL_PORT, "IOC-PORT" }, /* 入出力制御(I/Oポート) */
+ { 0, "UNKNOWN " } };/* 終端 */
/** 数字変換表 */
static char gNumTransTbl[ 2 ][ 17 ] = { "0123456789abcdef",
/** ログ管理テーブル */
static logTbl_t gLogTbl;
+#endif
+
/******************************************************************************/
/* ローカル関数プロトタイプ宣言 */
#******************************************************************************#
#* src/kernel/Makefile *#
-#* 2018/06/13 *#
+#* 2018/10/20 *#
#* Copyright (C) 2016-2018 Mochi. *#
#******************************************************************************#
#******************************************************************************#
IntMng/IntMngPic.c \
IntMng/IntMngCtrl.c \
TimerMng/TimerMngInit.c \
+ TimerMng/TimerMngCtrl.c \
TimerMng/TimerMngPit.c \
ItcCtrl/ItcCtrlInit.c \
ItcCtrl/ItcCtrlMsg.c \
-fno-pic \
-ffreestanding \
-Iinclude/ \
- -I../include \
- -DDEBUG_LOG_ENABLE
+ -I../include
# LDフラグ
LDFLAGS = -melf_i386 \
--- /dev/null
+/******************************************************************************/
+/* src/kernel/TimerMng/TimerMngCtrl.c */
+/* 2018/10/22 */
+/* Copyright (C) 2018 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <kernel/config.h>
+#include <kernel/timer.h>
+#include <MLib/Basic/MLibBasicList.h>
+
+/* 外部モジュールヘッダ */
+#include <Cmn.h>
+#include <Debug.h>
+#include <IntMng.h>
+#include <TaskMng.h>
+#include <TimerMng.h>
+
+/* 内部モジュールヘッダ */
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* デバッグトレースログ出力マクロ */
+#ifdef DEBUG_LOG_ENABLE
+#define DEBUG_LOG( ... ) \
+ DebugLogOutput( CMN_MODULE_TIMERMNG_CTRL, \
+ __LINE__, \
+ __VA_ARGS__ )
+#else
+#define DEBUG_LOG( ... )
+#endif
+
+/** タイマ情報型 */
+typedef struct {
+ MLibBasicListNode_t listInfo; /**< リンクリスト情報 */
+ uint32_t timerId; /**< タイマID */
+ uint32_t remain; /**< 残タイマ値 */
+ uint32_t tick; /**< 設定タイマ値 */
+ uint32_t type; /**< タイマ種別 */
+ TimerMngFunc_t pFunc; /**< コールバック関数 */
+ void *pArg; /**< コールバック関数引数 */
+ MkTaskId_t taskId; /**< タスクID */
+} TimerInfo_t;
+
+
+/******************************************************************************/
+/* ローカル関数宣言 */
+/******************************************************************************/
+/* 割込みハンドラ */
+static void HdlInt( uint32_t intNo,
+ IntMngContext_t context );
+
+/* 使用中タイマ情報リスト設定 */
+static void Set( TimerInfo_t *pTimerInfo );
+
+/* スリープ */
+static void Sleep( MkTimerParam_t *pParam );
+
+/* スリープタイムアウト */
+static void SleepTimeout( uint32_t timerId,
+ void *pArg );
+
+/* 未使用タイマ情報リスト設定 */
+static void Unset( TimerInfo_t *pTimerInfo );
+
+
+/******************************************************************************/
+/* グローバル変数宣言 */
+/******************************************************************************/
+/** 未使用タイマ情報リスト */
+static MLibBasicList_t gUnusedList;
+
+/** 使用中タイマ情報リスト */
+static MLibBasicList_t gUsedList;
+
+/** タイマ情報テーブル */
+static TimerInfo_t gTimerInfoTbl[ TIMERMNG_TIMERID_NUM ];
+
+
+/******************************************************************************/
+/* モジュール外向けグローバル関数定義 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief タイマ設定
+ * @detail
+ *
+ * @param[in] tick タイマ値
+ * @param[in] type タイマ種別
+ * - TIMERMNG_TYPE_ONESHOT ワンショットタイマ
+ * - TIMERMNG_TYPE_REPEAT 繰り返しタイマ
+ * @param[in] pFunc コールバック関数
+ * @param[in] *pArg コールバック関数引数
+ *
+ * @return タイマ登録結果を返す。
+ * @retval TIMERMNG_TIMERID_NULL タイマ設定失敗
+ * @retval TIMERMNG_TIMERID_NULL以外 タイマ設定成功(タイマID)
+ */
+/******************************************************************************/
+uint32_t TimerMngCtrlSet( uint32_t tick,
+ uint32_t type,
+ TimerMngFunc_t pFunc,
+ void *pArg )
+{
+ TimerInfo_t *pTimerInfo;
+
+ /* タイマ種別チェック */
+ if ( ( type != TIMERMNG_TYPE_ONESHOT ) &&
+ ( type != TIMERMNG_TYPE_REPEAT ) ) {
+ /* 不正 */
+
+ return TIMERMNG_TIMERID_NULL;
+ }
+
+ /* コールバック関数チェック */
+ if ( pFunc == NULL ) {
+ /* 不正 */
+
+ return TIMERMNG_TIMERID_NULL;
+ }
+
+ /* 未使用タイマ情報取得 */
+ pTimerInfo = ( TimerInfo_t * ) MLibBasicListRemoveTail( &gUnusedList );
+
+ /* 取得結果判定 */
+ if ( pTimerInfo == NULL ) {
+ /* 失敗 */
+
+ return TIMERMNG_TIMERID_NULL;
+ }
+
+ /* タイマ情報設定 */
+ pTimerInfo->remain = tick;
+ pTimerInfo->tick = tick;
+ pTimerInfo->type = type;
+ pTimerInfo->pFunc = pFunc;
+ pTimerInfo->pArg = pArg;
+ pTimerInfo->taskId = TaskMngSchedGetTaskId();
+
+ /* 使用中タイマ情報リスト設定 */
+ Set( pTimerInfo );
+
+ return pTimerInfo->timerId;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief タイマ解除
+ * @detail 指定したタイマIDのタイマ設定を解除する。
+ */
+/******************************************************************************/
+void TimerMngCtrlUnset( uint32_t timerId )
+{
+ TimerInfo_t *pNext;
+ TimerInfo_t *pTimerInfo;
+
+ /* タイマIDチェック */
+ if ( timerId > TIMERMNG_TIMERID_MAX ) {
+ /* 不正 */
+
+ return;
+ }
+
+ pTimerInfo = &gTimerInfoTbl[ timerId ];
+
+ /* タイマ情報使用中チェック */
+ if ( pTimerInfo->pFunc == NULL ) {
+ /* 未使用 */
+
+ return;
+ }
+
+ /* 次タイマ情報取得 */
+ pNext = ( TimerInfo_t * )
+ MLibBasicListGetNextNode( &gUsedList,
+ ( MLibBasicListNode_t * ) pTimerInfo );
+
+ /* 取得結果判定 */
+ if ( pNext != NULL ) {
+ /* 次タイマ情報有り */
+
+ /* 次タイマ情報設定 */
+ pNext->remain += pTimerInfo->remain;
+ }
+
+ /* 使用中タイマ情報リストから削除 */
+ ( void ) MLibBasicListRemove( &gUsedList,
+ ( MLibBasicListNode_t * ) pTimerInfo );
+
+ /* 未使用タイマ情報リスト設定 */
+ Unset( pTimerInfo );
+
+ return;
+}
+
+
+/******************************************************************************/
+/* モジュール内向けグローバル関数 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief タイマ制御初期化
+ * @detail 管理情報の初期化と割込みハンドラの設定を行う。
+ */
+/******************************************************************************/
+void CtrlInit( void )
+{
+ uint32_t index;
+
+ /* タイマ情報リスト初期化 */
+ ( void ) MLibBasicListInit( &gUnusedList );
+ ( void ) MLibBasicListInit( &gUsedList );
+
+ /* タイマ情報テーブルエントリ毎に繰り返し */
+ for ( index = TIMERMNG_TIMERID_MIN;
+ index <= TIMERMNG_TIMERID_MAX;
+ index++ ) {
+
+ /* 初期化 */
+ gTimerInfoTbl[ index ].timerId = index;
+
+ /* 未使用タイマ情報リスト設定 */
+ Unset( &gTimerInfoTbl[ index ] );
+ }
+
+ /* 割込みハンドラ設定 */
+ IntMngHdlSet( MK_CONFIG_INTNO_TIMER, /* 割込み番号 */
+ HdlInt, /* 割込みハンドラ */
+ IA32_DESCRIPTOR_DPL_3 ); /* 特権レベル */
+
+}
+
+
+/******************************************************************************/
+/**
+ * @brief タイマ制御実行
+ * @detail 使用中タイマ情報リストの先頭エントリを取り出し、残タイマ値をデ
+ * クリメントする。残タイマ値が0になった場合はタイムアウト処理を行
+ * う。
+ */
+/******************************************************************************/
+void CtrlRun( void )
+{
+ TimerInfo_t *pTimerInfo; /* タイマ情報 */
+
+ /* 先頭エントリ取得 */
+ pTimerInfo = ( TimerInfo_t * ) MLibBasicListGetNextNode( &gUsedList, NULL );
+
+ /* 取得結果判定 */
+ if ( pTimerInfo == NULL ) {
+ /* エントリ無し */
+
+ return;
+ }
+
+ /* タイムアウト判定 */
+ if ( pTimerInfo->remain != 0 ) {
+ /* タイムアウトでない */
+
+ /* 残タイマ値減算 */
+ pTimerInfo->remain--;
+
+ return;
+ }
+
+ /* 使用中タイマ情報リストから削除 */
+ ( void ) MLibBasicListRemoveHead( &gUsedList );
+
+ /* タイマ種別判定 */
+ if ( pTimerInfo->type == TIMERMNG_TYPE_ONESHOT ) {
+ /* ワンショットタイマ */
+
+ /* コールバック関数呼出し */
+ ( pTimerInfo->pFunc )( pTimerInfo->timerId, pTimerInfo->pArg );
+
+ /* 未使用タイマ情報リスト設定 */
+ Unset( pTimerInfo );
+
+ } else if ( pTimerInfo->type == TIMERMNG_TYPE_REPEAT ) {
+ /* 繰り返しタイマ */
+
+ /* 残タイマ値設定 */
+ pTimerInfo->remain = pTimerInfo->tick;
+
+ /* 使用中タイマ情報リスト設定 */
+ Set( pTimerInfo );
+
+ /* コールバック関数呼出し */
+ ( pTimerInfo->pFunc )( pTimerInfo->timerId, pTimerInfo->pArg );
+ }
+
+ return;
+}
+
+
+/******************************************************************************/
+/* ローカル関数定義 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief 割込みハンドラ
+ * @details 機能IDから該当する機能を呼び出す。
+ *
+ * @param[in] intNo 割込み番号
+ * @param[in] context 割込み発生時コンテキスト
+ */
+/******************************************************************************/
+static void HdlInt( uint32_t intNo,
+ IntMngContext_t context )
+{
+ MkTimerParam_t *pParam; /* パラメータ */
+
+ /* 初期化 */
+ pParam = ( MkTimerParam_t * ) context.genReg.esi;
+
+ /* パラメータチェック */
+ if ( pParam == NULL ) {
+ /* 不正 */
+
+ return;
+ }
+
+ /* 機能ID判定 */
+ switch ( pParam->funcId ) {
+ case MK_TIMER_FUNCID_SLEEP:
+ /* スリープ */
+ Sleep( pParam );
+ break;
+
+ default:
+ /* 不正 */
+
+ /* アウトプットパラメータ設定 */
+ pParam->ret = MK_TIMER_RET_FAILURE;
+ pParam->errNo = MK_TIMER_ERR_PARAM_FUNCID;
+ }
+
+ return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief 使用中タイマ情報リスト設定
+ * @details タイマ情報を使用中タイマ情報リストの適切な位置に挿入する。
+ *
+ * @param[in] *pTimerInfo タイマ情報
+ */
+/******************************************************************************/
+static void Set( TimerInfo_t *pTimerInfo )
+{
+ TimerInfo_t *pNext;
+ TimerInfo_t *pPrev;
+
+ /* 初期化 */
+ pNext = NULL;
+ pPrev = NULL;
+
+ /* 使用中タイマ情報エントリ毎に繰り返し */
+ while ( true ) {
+ /* タイマ情報エントリ取得 */
+ pNext = ( TimerInfo_t * )
+ MLibBasicListGetNextNode( &gUsedList,
+ ( MLibBasicListNode_t * ) pPrev );
+
+ /* 取得結果判定 */
+ if ( pNext == NULL ) {
+ /* 次エントリ無し */
+
+ break;
+ }
+
+ /* 次エントリと残タイマ値比較 */
+ if ( pTimerInfo->remain < pNext->remain ) {
+ /* 次エントリより短い */
+
+ /* 挿入 */
+ ( void ) MLibBasicListInsertNext(
+ &gUsedList,
+ ( MLibBasicListNode_t * ) pPrev,
+ ( MLibBasicListNode_t * ) pTimerInfo );
+
+ /* 次エントリ残タイマ値減算 */
+ pNext->remain -= pTimerInfo->remain;
+
+ return;
+
+ } else {
+ /* 次エントリより長い */
+
+ /* 残タイマ値減算 */
+ pTimerInfo->remain -= pNext->remain;
+ }
+
+ pPrev = pNext;
+ }
+
+ /* 前エントリ有無判定 */
+ if ( pPrev == NULL ) {
+ /* 前エントリ無し */
+
+ /* 先頭に挿入 */
+ ( void ) MLibBasicListInsertHead(
+ &gUsedList,
+ ( MLibBasicListNode_t * ) pTimerInfo );
+
+ } else {
+ /* 前エントリ有り */
+
+ /* 挿入 */
+ ( void ) MLibBasicListInsertNext(
+ &gUsedList,
+ ( MLibBasicListNode_t * ) pPrev,
+ ( MLibBasicListNode_t * ) pTimerInfo );
+ }
+
+ return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief スリープ
+ * @details 指定した時間の間タスクをスリープ状態にする。
+ *
+ * @param[in,out] *pParam パラメータ
+ */
+/******************************************************************************/
+static void Sleep( MkTimerParam_t *pParam )
+{
+ uint32_t tick;
+ uint32_t timerId;
+
+ /* tick変換 */
+ tick = pParam->usec / ( 1000000 / MK_CONFIG_TICK_HZ );
+
+ /* タイマ設定 */
+ timerId = TimerMngCtrlSet( tick, TIMERMNG_TYPE_ONESHOT, SleepTimeout, NULL );
+
+ /* タイマ設定結果判定 */
+ if ( timerId == TIMERMNG_TIMERID_NULL ) {
+ /* 失敗 */
+
+ /* アウトプットパラメータ設定 */
+ pParam->ret = MK_TIMER_RET_FAILURE;
+ pParam->errNo = MK_TIMER_ERR_NO_RESOURCE;
+
+ return;
+ }
+
+ /* スケジュール停止 */
+ TaskMngSchedStop( gTimerInfoTbl[ timerId ].taskId );
+
+ /* スケジューラ実行 */
+ TaskMngSchedExec();
+
+ /* アウトプットパラメータ設定 */
+ pParam->ret = MK_TIMER_RET_SUCCESS;
+ pParam->errNo = MK_TIMER_ERR_NONE;
+
+ return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief スリープタイムアウト
+ * @details タスクのスケジューリングを再開する。
+ *
+ * @param[in] timerId タイマID
+ * @param[in] *pArg スリープ引数
+ */
+/******************************************************************************/
+static void SleepTimeout( uint32_t timerId,
+ void *pArg )
+{
+ /* スケジュール開始 */
+ TaskMngSchedStart( gTimerInfoTbl[ timerId ].taskId );
+
+ /* スケジューラ実行 */
+ TaskMngSchedExec();
+
+ return;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief 未使用タイマ情報リスト設定
+ * @details タイマ情報を初期化し、未使用タイマ情報リストに挿入する。
+ *
+ * @param[in] *pTimerInfo タイマ情報
+ */
+/******************************************************************************/
+static void Unset( TimerInfo_t *pTimerInfo )
+{
+
+ /* タイマ情報初期化 */
+ pTimerInfo->remain = 0;
+ pTimerInfo->tick = 0;
+ pTimerInfo->type = TIMERMNG_TYPE_ONESHOT;
+ pTimerInfo->pFunc = NULL;
+ pTimerInfo->pArg = NULL;
+ pTimerInfo->taskId = MK_CONFIG_TASKID_NULL;
+
+ /* 未使用タイマ情報リスト追加 */
+ ( void ) MLibBasicListInsertTail( &gUnusedList,
+ ( MLibBasicListNode_t * ) pTimerInfo );
+
+ return;
+}
+
+
+/******************************************************************************/
--- /dev/null
+/******************************************************************************/
+/* src/kernel/TimerMng/TimerMngCtrl.h */
+/* 2018/10/16 */
+/* Copyright (C) 2018 Mochi. */
+/******************************************************************************/
+#ifndef TIMERMNG_CTRL_H
+#define TIMERMNG_CTRL_H
+/******************************************************************************/
+/* モジュール内向けグローバル関数宣言 */
+/******************************************************************************/
+/* タイマ制御初期化 */
+extern void CtrlInit( void );
+
+/* タイマ制御実行 */
+extern void CtrlRun( void );
+
+
+/******************************************************************************/
+#endif
/******************************************************************************/
/* src/kernel/TimerMng/TimerMngInit.c */
-/* 2017/03/11 */
-/* Copyright (C) 2016-2017 Mochi. */
+/* 2018/10/20 */
+/* Copyright (C) 2016-2018 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* インクルード */
#include <Debug.h>
/* 内部モジュールヘッダ */
+#include "TimerMngCtrl.h"
#include "TimerMngPit.h"
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() start.", __func__ );
+ /* タイマ制御サブモジュール初期化 */
+ CtrlInit();
+
/* PIT管理サブモジュール初期化 */
TimerMngPitInit();
/******************************************************************************/
/* src/kernel/TimerMng/TimerMngPit.c */
-/* 2018/05/19 */
+/* 2018/10/22 */
/* Copyright (C) 2016-2018 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* 共通ヘッダ */
#include <stdarg.h>
#include <stdint.h>
+#include <kernel/config.h>
#include <hardware/I8254/I8254.h>
#include <hardware/I8259A/I8259A.h>
#include <hardware/IA32/IA32Instruction.h>
#include <TimerMng.h>
/* 内部モジュールヘッダ */
+#include "TimerMngCtrl.h"
/******************************************************************************/
#endif
/** PIT(カウンタ0)カウンタ設定値 */
-#define PIT_CYCLE ( 11932 )
+#define PIT_CYCLE ( I8254_CLOCK / MK_CONFIG_TICK_HZ )
/******************************************************************************/
/* 割込み処理終了通知 */
IntMngPicEoi( I8259A_IRQ0 );
+ /* タイマ制御実行 */
+ CtrlRun();
+
/* スケジューラ実行 */
TaskMngSchedExec();
/******************************************************************************/
/* src/kernel/include/Cmn.h */
-/* 2018/06/16 */
+/* 2018/10/20 */
/* Copyright (C) 2017-2018 Mochi. */
/******************************************************************************/
#ifndef CMN_H
#define CMN_USED ( 1 ) /** 使用中 */
/* モジュール・サブモジュール識別子 */
-#define CMN_MODULE_INIT_INIT ( 0x0101 ) /** 初期化制御(初期化) */
-#define CMN_MODULE_DEBUG_INIT ( 0x0201 ) /** デバッグ制御(初期化) */
-#define CMN_MODULE_DEBUG_LOG ( 0x0202 ) /** デバッグ制御(ログ管理) */
-#define CMN_MODULE_MEMMNG_INIT ( 0x0301 ) /** メモリ管理(初期化) */
-#define CMN_MODULE_MEMMNG_GDT ( 0x0302 ) /** メモリ管理(GDT管理) */
-#define CMN_MODULE_MEMMNG_AREA ( 0x0303 ) /** メモリ管理(メモリ領域管理) */
-#define CMN_MODULE_MEMMNG_PAGE ( 0x0304 ) /** メモリ管理(ページ管理) */
-#define CMN_MODULE_MEMMNG_CTRL ( 0x0305 ) /** メモリ管理(メモリ制御) */
-#define CMN_MODULE_TASKMNG_INIT ( 0x0401 ) /** タスク管理(初期化) */
-#define CMN_MODULE_TASKMNG_TSS ( 0x0402 ) /** タスク管理(TSS管理) */
-#define CMN_MODULE_TASKMNG_SCHED ( 0x0403 ) /** タスク管理(スケジューラ) */
-#define CMN_MODULE_TASKMNG_TASK ( 0x0404 ) /** タスク管理(タスク管理) */
-#define CMN_MODULE_TASKMNG_ELF ( 0x0405 ) /** タスク管理(ELFローダ) */
-#define CMN_MODULE_TASKMNG_PROC ( 0x0406 ) /** タスク管理(プロセス管理) */
-#define CMN_MODULE_INTMNG_INIT ( 0x0501 ) /** 割込み管理(初期化) */
-#define CMN_MODULE_INTMNG_PIC ( 0x0502 ) /** 割込み管理(PIC管理) */
-#define CMN_MODULE_INTMNG_IDT ( 0x0503 ) /** 割込み管理(IDT管理) */
-#define CMN_MODULE_INTMNG_HDL ( 0x0504 ) /** 割込み管理(ハンドラ管理) */
-#define CMN_MODULE_INTMNG_CTRL ( 0x0505 ) /** 割込み管理(ハードウェア割込み制御) */
-#define CMN_MODULE_TIMERMNG_INIT ( 0x0601 ) /** タイマ管理(初期化) */
-#define CMN_MODULE_TIMERMNG_PIT ( 0x0602 ) /** タイマ管理(PIT管理) */
-#define CMN_MODULE_ITCCTRL_INIT ( 0x0701 ) /** タスク間通信制御(初期化) */
-#define CMN_MODULE_ITCCTRL_MSG ( 0x0702 ) /** タスク間通信制御(メッセージ制御) */
-#define CMN_MODULE_IOCTRL_INIT ( 0x0801 ) /** 入出力制御(初期化) */
-#define CMN_MODULE_IOCTRL_PORT ( 0x0802 ) /** 入出力制御(I/Oポート制御) */
+#define CMN_MODULE_INIT_INIT ( 0x0101 ) /** 初期化制御(初期化) */
+#define CMN_MODULE_DEBUG_INIT ( 0x0201 ) /** デバッグ制御(初期化) */
+#define CMN_MODULE_DEBUG_LOG ( 0x0202 ) /** デバッグ制御(ログ管理) */
+#define CMN_MODULE_MEMMNG_INIT ( 0x0301 ) /** メモリ管理(初期化) */
+#define CMN_MODULE_MEMMNG_GDT ( 0x0302 ) /** メモリ管理(GDT) */
+#define CMN_MODULE_MEMMNG_AREA ( 0x0303 ) /** メモリ管理(領域) */
+#define CMN_MODULE_MEMMNG_PAGE ( 0x0304 ) /** メモリ管理(ページ) */
+#define CMN_MODULE_MEMMNG_CTRL ( 0x0305 ) /** メモリ管理(制御) */
+#define CMN_MODULE_TASKMNG_INIT ( 0x0401 ) /** タスク管理(初期化) */
+#define CMN_MODULE_TASKMNG_TSS ( 0x0402 ) /** タスク管理(TSS) */
+#define CMN_MODULE_TASKMNG_SCHED ( 0x0403 ) /** タスク管理(スケジューラ) */
+#define CMN_MODULE_TASKMNG_TASK ( 0x0404 ) /** タスク管理(タスク) */
+#define CMN_MODULE_TASKMNG_ELF ( 0x0405 ) /** タスク管理(ELFローダ) */
+#define CMN_MODULE_TASKMNG_PROC ( 0x0406 ) /** タスク管理(プロセス) */
+#define CMN_MODULE_INTMNG_INIT ( 0x0501 ) /** 割込み管理(初期化) */
+#define CMN_MODULE_INTMNG_PIC ( 0x0502 ) /** 割込み管理(PIC) */
+#define CMN_MODULE_INTMNG_IDT ( 0x0503 ) /** 割込み管理(IDT) */
+#define CMN_MODULE_INTMNG_HDL ( 0x0504 ) /** 割込み管理(ハンドラ) */
+#define CMN_MODULE_INTMNG_CTRL ( 0x0505 ) /** 割込み管理(ハードウェア) */
+#define CMN_MODULE_TIMERMNG_INIT ( 0x0601 ) /** タイマ管理(初期化) */
+#define CMN_MODULE_TIMERMNG_CTRL ( 0x0602 ) /** タイマ管理(制御) */
+#define CMN_MODULE_TIMERMNG_PIT ( 0x0603 ) /** タイマ管理(PIT) */
+#define CMN_MODULE_ITCCTRL_INIT ( 0x0701 ) /** タスク間通信制御(初期化) */
+#define CMN_MODULE_ITCCTRL_MSG ( 0x0702 ) /** タスク間通信制御(メッセージ) */
+#define CMN_MODULE_IOCTRL_INIT ( 0x0801 ) /** 入出力制御(初期化) */
+#define CMN_MODULE_IOCTRL_PORT ( 0x0802 ) /** 入出力制御(ポート) */
/** モジュール・サブモジュール数 */
-#define CMN_MODULE_NUM ( 25 )
+#define CMN_MODULE_NUM ( 26 )
/* 処理結果構造体 */
typedef int32_t CmnRet_t;
/******************************************************************************/
/* src/kernel/include/TimerMng.h */
-/* 2018/05/19 */
+/* 2018/10/20 */
/* Copyright (C) 2018 Mochi. */
/******************************************************************************/
#ifndef TIMERMNG_H
#define TIMERMNG_H
/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <IntMng.h>
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* タイマID */
+#define TIMERMNG_TIMERID_MIN ( 0 ) /**< タイマID最小値 */
+#define TIMERMNG_TIMERID_MAX ( 1023 ) /**< タイマID最大値 */
+#define TIMERMNG_TIMERID_NUM ( TIMERMNG_TIMERID_MAX + 1 ) /**< タイマID数 */
+#define TIMERMNG_TIMERID_NULL ( TIMERMNG_TIMERID_NUM ) /**< 無効タイマID */
+
+/* タイマ種別 */
+#define TIMERMNG_TYPE_ONESHOT ( 0 ) /**< ワンショットタイマ種別 */
+#define TIMERMNG_TYPE_REPEAT ( 1 ) /**< 繰り返しタイマ種別 */
+
+/** タイマコールバック関数型 */
+typedef void ( *TimerMngFunc_t )( uint32_t timerId, void *pArg );
+
+
+/******************************************************************************/
/* グローバル関数プロトタイプ宣言 */
/******************************************************************************/
/*----------------*/
+/* TimerMngCtrl.c */
+/*----------------*/
+/* タイマ設定 */
+extern uint32_t TimerMngCtrlSet( uint32_t usec,
+ uint32_t type,
+ TimerMngFunc_t pFunc,
+ void *pArg );
+
+/* タイマ解除 */
+extern void TimerMngCtrlUnset( uint32_t timerId );
+
+
+/*----------------*/
/* TimerMngInit.c */
/*----------------*/
/* タイマ管理初期化 */
extern void TimerMngInit( void );
+
/*---------------*/
/* TimerMngPit.c */
/*---------------*/
#******************************************************************************#
#* src/libraries/libMk/Makefile *#
-#* 2018/06/17 *#
+#* 2018/10/22 *#
#* Copyright (C) 2018 Mochi. *#
#******************************************************************************#
#******************************************************************************#
# ソースコード
SRCS = MkMsg.c \
+ MkInt.c \
MkIoPort.c \
- MkInt.c
+ MkTimer.c
# Cフラグ
CFLAGS = -O \
--- /dev/null
+/******************************************************************************/
+/* src/libraries/libMk/MkTimer.c */
+/* 2018/10/22 */
+/* Copyright (C) 2018 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stdint.h>
+
+/* 外部モジュールヘッダ */
+#include <kernel/timer.h>
+
+/* 内部モジュールヘッダ */
+
+
+/******************************************************************************/
+/* グローバル関数宣言 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief スリープ
+ * @details 指定した時間スリープする。
+ *
+ * @param[in] usec スリープ時間(マイクロ秒)
+ * @param[out] *pErrNo エラー番号
+ * - MK_TIMER_ERR_NONE エラー無し
+ * - MK_TIMER_ERR_NO_RESOURCE リソース不足
+ *
+ * @return 処理結果を返す。
+ * @retval MK_TIMER_RET_SUCCESS 成功
+ * @retval MK_TIMER_RET_FAILURE 失敗(エラー番号を参照)
+ *
+ * @attention カーネルのtick時間よりも短いスリープ時間を設定した場合、tick時
+ * 間に丸められる。
+ */
+/******************************************************************************/
+int32_t MkTimerSleep( uint32_t usec,
+ uint32_t *pErrNo )
+{
+ volatile MkTimerParam_t param;
+
+ /* パラメータ設定 */
+ param.funcId = MK_TIMER_FUNCID_SLEEP;
+ param.errNo = MK_TIMER_ERR_NONE;
+ param.ret = MK_TIMER_RET_FAILURE;
+ param.usec = usec;
+
+ /* カーネルコール */
+ __asm__ __volatile__ ( "mov esi, %0\n"
+ "int %1"
+ :
+ : "a" ( ¶m ),
+ "i" ( MK_CONFIG_INTNO_TIMER ) );
+
+ /* エラー番号設定要否判定 */
+ if ( pErrNo != NULL ) {
+ /* 必要 */
+
+ /* エラー番号設定 */
+ *pErrNo = param.errNo;
+ }
+
+ return param.ret;
+}
+
+
+/******************************************************************************/