OSDN Git Service

タイマ制御(スリープ)機能追加
authorMochi <master.c.mochi@gmail.com>
Wed, 24 Oct 2018 13:29:39 +0000 (13:29 +0000)
committerMochi <master.c.mochi@gmail.com>
Wed, 24 Oct 2018 13:29:39 +0000 (13:29 +0000)
15 files changed:
src/include/hardware/I8254/I8254.h
src/include/kernel/config.h
src/include/kernel/library.h
src/include/kernel/message.h
src/include/kernel/timer.h [new file with mode: 0644]
src/kernel/Debug/DebugLog.c
src/kernel/Makefile
src/kernel/TimerMng/TimerMngCtrl.c [new file with mode: 0644]
src/kernel/TimerMng/TimerMngCtrl.h [new file with mode: 0644]
src/kernel/TimerMng/TimerMngInit.c
src/kernel/TimerMng/TimerMngPit.c
src/kernel/include/Cmn.h
src/kernel/include/TimerMng.h
src/libraries/libMk/Makefile
src/libraries/libMk/MkTimer.c [new file with mode: 0644]

index 6723ba7..95513a9 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************/
 /* 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 ) )
 
 
 /******************************************************************************/
index e441671..9258172 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* 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 )
 
 
 /******************************************************************************/
index 87e76ef..75ad7a6 100644 (file)
@@ -1,6 +1,10 @@
 /******************************************************************************/
 /* src/include/kernel/library.h                                               */
+<<<<<<< Updated upstream
 /*                                                                 2018/06/19 */
+=======
+/*                                                                 2018/10/22 */
+>>>>>>> Stashed changes
 /* Copyright (C) 2018 Mochi.                                                  */
 /******************************************************************************/
 #ifndef _MK_LIBRARY_H_
@@ -14,6 +18,7 @@
 #include <kernel/interrupt.h>
 #include <kernel/ioport.h>
 #include <kernel/message.h>
+#include <kernel/timer.h>
 #include <kernel/types.h>
 
 
@@ -105,6 +110,13 @@ extern int32_t MkMsgSend( MkTaskId_t dst,
                           size_t     size,
                           uint32_t   *pErrNo );
 
+/*-----------*/
+/* MkTimer.c */
+/*-----------*/
+/* スリープ */
+extern int32_t MkTimerSleep( uint32_t usec,
+                             uint32_t *pErrNo );
+
 
 /******************************************************************************/
 #endif
index da88ae2..65dde72 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/include/kernel/message.h                                               */
-/*                                                                 2018/05/06 */
+/*                                                                 2018/10/20 */
 /* Copyright (C) 2018 Mochi.                                                  */
 /******************************************************************************/
 #ifndef _MK_MESSAGE_H_
@@ -19,7 +19,7 @@
 /* 定義                                                                       */
 /******************************************************************************/
 /** メッセージサイズ最大 */
-#define MK_MSG_SIZE_MAX         ( 4096 )
+#define MK_MSG_SIZE_MAX         ( 24576 )
 
 /* 機能ID */
 #define MK_MSG_FUNCID_RECEIVE   ( 0x00000001 )  /** メッセージ受信 */
diff --git a/src/include/kernel/timer.h b/src/include/kernel/timer.h
new file mode 100644 (file)
index 0000000..4e922ad
--- /dev/null
@@ -0,0 +1,43 @@
+/******************************************************************************/
+/* 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
index 3326b1e..27c1251 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/Debug/DebugLog.c                                                */
-/*                                                                 2018/06/16 */
+/*                                                                 2018/10/20 */
 /* Copyright (C) 2017-2018 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
@@ -83,33 +83,33 @@ typedef struct {
 #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",
@@ -118,6 +118,8 @@ static char gNumTransTbl[ 2 ][ 17 ] = { "0123456789abcdef",
 /** ログ管理テーブル */
 static logTbl_t gLogTbl;
 
+#endif
+
 
 /******************************************************************************/
 /* ローカル関数プロトタイプ宣言                                               */
index c040f97..0f236c6 100644 (file)
@@ -1,6 +1,6 @@
 #******************************************************************************#
 #* src/kernel/Makefile                                                        *#
-#*                                                                 2018/06/13 *#
+#*                                                                 2018/10/20 *#
 #* Copyright (C) 2016-2018 Mochi.                                             *#
 #******************************************************************************#
 #******************************************************************************#
@@ -33,6 +33,7 @@ SRCS = InitCtrl/InitCtrlInit.c \
        IntMng/IntMngPic.c      \
        IntMng/IntMngCtrl.c     \
        TimerMng/TimerMngInit.c \
+       TimerMng/TimerMngCtrl.c \
        TimerMng/TimerMngPit.c  \
        ItcCtrl/ItcCtrlInit.c   \
        ItcCtrl/ItcCtrlMsg.c    \
@@ -47,8 +48,7 @@ CFLAGS = -O                 \
          -fno-pic           \
          -ffreestanding     \
          -Iinclude/         \
-         -I../include       \
-         -DDEBUG_LOG_ENABLE
+         -I../include       
 
 # LDフラグ
 LDFLAGS = -melf_i386    \
diff --git a/src/kernel/TimerMng/TimerMngCtrl.c b/src/kernel/TimerMng/TimerMngCtrl.c
new file mode 100644 (file)
index 0000000..5cb28df
--- /dev/null
@@ -0,0 +1,522 @@
+/******************************************************************************/
+/* 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;
+}
+
+
+/******************************************************************************/
diff --git a/src/kernel/TimerMng/TimerMngCtrl.h b/src/kernel/TimerMng/TimerMngCtrl.h
new file mode 100644 (file)
index 0000000..679575f
--- /dev/null
@@ -0,0 +1,19 @@
+/******************************************************************************/
+/* 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
index 5ecaa20..1c1c85e 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************/
 /* src/kernel/TimerMng/TimerMngInit.c                                         */
-/*                                                                 2017/03/11 */
-/* Copyright (C) 2016-2017 Mochi.                                             */
+/*                                                                 2018/10/20 */
+/* Copyright (C) 2016-2018 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
 /* インクルード                                                               */
@@ -14,6 +14,7 @@
 #include <Debug.h>
 
 /* 内部モジュールヘッダ */
+#include "TimerMngCtrl.h"
 #include "TimerMngPit.h"
 
 
@@ -45,6 +46,9 @@ void TimerMngInit( void )
     /* デバッグトレースログ出力 */
     DEBUG_LOG( "%s() start.", __func__ );
     
+    /* タイマ制御サブモジュール初期化 */
+    CtrlInit();
+    
     /* PIT管理サブモジュール初期化 */
     TimerMngPitInit();
     
index 0b8eea3..24041df 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/TimerMng/TimerMngPit.c                                          */
-/*                                                                 2018/05/19 */
+/*                                                                 2018/10/22 */
 /* Copyright (C) 2016-2018 Mochi.                                             */
 /******************************************************************************/
 /******************************************************************************/
@@ -9,6 +9,7 @@
 /* 共通ヘッダ */
 #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>
@@ -21,6 +22,7 @@
 #include <TimerMng.h>
 
 /* 内部モジュールヘッダ */
+#include "TimerMngCtrl.h"
 
 
 /******************************************************************************/
@@ -37,7 +39,7 @@
 #endif
 
 /** PIT(カウンタ0)カウンタ設定値 */
-#define PIT_CYCLE ( 11932 )
+#define PIT_CYCLE ( I8254_CLOCK / MK_CONFIG_TICK_HZ )
 
 
 /******************************************************************************/
@@ -61,6 +63,9 @@ void TimerMngPitHdlInt( uint32_t        intNo,
     /* 割込み処理終了通知 */
     IntMngPicEoi( I8259A_IRQ0 );
     
+    /* タイマ制御実行 */
+    CtrlRun();
+    
     /* スケジューラ実行 */
     TaskMngSchedExec();
     
index 22cc123..47fbf08 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* 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;
index 4143a40..02918f2 100644 (file)
@@ -1,19 +1,56 @@
 /******************************************************************************/
 /* 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 */
 /*---------------*/
index b42f8f8..eaf93f6 100644 (file)
@@ -1,6 +1,6 @@
 #******************************************************************************#
 #* src/libraries/libMk/Makefile                                               *#
-#*                                                                 2018/06/17 *#
+#*                                                                 2018/10/22 *#
 #* Copyright (C) 2018 Mochi.                                                  *#
 #******************************************************************************#
 #******************************************************************************#
@@ -14,8 +14,9 @@ LIB_NAME  = libMk.a
 
 # ソースコード
 SRCS = MkMsg.c    \
+       MkInt.c    \
        MkIoPort.c \
-       MkInt.c
+       MkTimer.c
 
 # Cフラグ
 CFLAGS = -O               \
diff --git a/src/libraries/libMk/MkTimer.c b/src/libraries/libMk/MkTimer.c
new file mode 100644 (file)
index 0000000..ca09171
--- /dev/null
@@ -0,0 +1,69 @@
+/******************************************************************************/
+/* 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" ( &param                ),
+                             "i" ( MK_CONFIG_INTNO_TIMER )  );
+    
+    /* エラー番号設定要否判定 */
+    if ( pErrNo != NULL ) {
+        /* 必要 */
+        
+        /* エラー番号設定 */
+        *pErrNo = param.errNo;
+    }
+    
+    return param.ret;
+}
+
+
+/******************************************************************************/