[270] | 1 | /*
|
---|
| 2 | * TOPPERS/ASP Kernel
|
---|
| 3 | * Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
| 4 | * Advanced Standard Profile Kernel
|
---|
| 5 | *
|
---|
| 6 | * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
|
---|
| 7 | * Toyohashi Univ. of Technology, JAPAN
|
---|
[429] | 8 | * Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory
|
---|
[270] | 9 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
| 10 | *
|
---|
| 11 | * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
| 12 | * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
| 13 | * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
| 14 | * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
| 15 | * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
| 16 | * スコード中に含まれていること.
|
---|
| 17 | * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
| 18 | * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
| 19 | * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
| 20 | * の無保証規定を掲載すること.
|
---|
| 21 | * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
| 22 | * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
| 23 | * と.
|
---|
| 24 | * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
| 25 | * 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
| 26 | * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
| 27 | * 報告すること.
|
---|
| 28 | * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
| 29 | * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
| 30 | * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
| 31 | * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
| 32 | * 免責すること.
|
---|
| 33 | *
|
---|
| 34 | * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
| 35 | * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
| 36 | * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
| 37 | * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
| 38 | * の責任を負わない.
|
---|
| 39 | *
|
---|
| 40 | * $Id$
|
---|
| 41 | */
|
---|
| 42 |
|
---|
| 43 | /*
|
---|
| 44 | * TOPPERS/ASPカーネル内部向け標準ヘッダファイル
|
---|
| 45 | *
|
---|
| 46 | * このヘッダファイルは,カーネルを構成するプログラムのソースファイル
|
---|
| 47 | * で必ずインクルードするべき標準ヘッダファイルである.
|
---|
| 48 | *
|
---|
| 49 | * アセンブリ言語のソースファイルからこのファイルをインクルードする時
|
---|
| 50 | * は,TOPPERS_MACRO_ONLYを定義しておく.これにより,マクロ定義以外を
|
---|
| 51 | * 除くようになっている.
|
---|
| 52 | */
|
---|
| 53 |
|
---|
| 54 | #ifndef TOPPERS_KERNEL_IMPL_H
|
---|
| 55 | #define TOPPERS_KERNEL_IMPL_H
|
---|
| 56 |
|
---|
| 57 | /*
|
---|
| 58 | * カーネルの内部識別名のリネーム
|
---|
| 59 | */
|
---|
| 60 | #include "kernel_rename.h"
|
---|
| 61 |
|
---|
| 62 | /*
|
---|
| 63 | * アプリケーションと共通のヘッダファイル
|
---|
| 64 | */
|
---|
| 65 | #include <kernel.h>
|
---|
| 66 |
|
---|
| 67 | /*
|
---|
| 68 | * システムログ機能のための定義
|
---|
| 69 | */
|
---|
| 70 | #include <t_syslog.h>
|
---|
| 71 |
|
---|
| 72 | /*
|
---|
[429] | 73 | * トレースログに関する設定
|
---|
[270] | 74 | */
|
---|
[429] | 75 | #ifdef TOPPERS_ENABLE_TRACE
|
---|
| 76 | #include "arch/tracelog/trace_log.h"
|
---|
| 77 | #endif /* TOPPERS_ENABLE_TRACE */
|
---|
[270] | 78 |
|
---|
| 79 | /*
|
---|
| 80 | * ターゲット依存情報の定義
|
---|
| 81 | */
|
---|
| 82 | #include "target_kernel_impl.h"
|
---|
| 83 |
|
---|
| 84 | /*
|
---|
| 85 | * すべての関数をコンパイルするための定義
|
---|
| 86 | */
|
---|
| 87 | #ifdef ALLFUNC
|
---|
| 88 | #include "allfunc.h"
|
---|
| 89 | #endif /* ALLFUNC */
|
---|
| 90 |
|
---|
| 91 | /*
|
---|
| 92 | * ビットフィールドでの符号無し整数型
|
---|
| 93 | *
|
---|
| 94 | * 8ビット以下の幅のビットフィールドで,符号無し整数値を保持したい場合
|
---|
| 95 | * に用いるべきデータ型.ANSI Cでは,ビットフィールドのデータ型には
|
---|
| 96 | * intとunsigned intしか許されないため,デフォルトの定義はunsigned
|
---|
| 97 | * intとしているが,ターゲットおよびツール依存で,unsigned charまたは
|
---|
| 98 | * unsigned shortに定義した方が効率が良い場合がある.
|
---|
| 99 | */
|
---|
| 100 | #ifndef BIT_FIELD_UINT
|
---|
| 101 | #define BIT_FIELD_UINT unsigned int
|
---|
| 102 | #endif /* BIT_FIELD_UINT */
|
---|
| 103 |
|
---|
| 104 | /*
|
---|
| 105 | * ビットフィールドでのブール型
|
---|
| 106 | *
|
---|
| 107 | * 1ビット幅のビットフィールドで,ブール値を保持したい場合に用いるべき
|
---|
| 108 | * データ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブー
|
---|
| 109 | * ル値を保持することを明示するために別の名称としている.
|
---|
| 110 | */
|
---|
| 111 | #ifndef BIT_FIELD_BOOL
|
---|
| 112 | #define BIT_FIELD_BOOL BIT_FIELD_UINT
|
---|
| 113 | #endif /* BIT_FIELD_BOOL */
|
---|
| 114 |
|
---|
| 115 | /*
|
---|
| 116 | * オブジェクトIDの最小値の定義
|
---|
| 117 | */
|
---|
| 118 | #define TMIN_TSKID 1 /* タスクIDの最小値 */
|
---|
| 119 | #define TMIN_SEMID 1 /* セマフォIDの最小値 */
|
---|
| 120 | #define TMIN_FLGID 1 /* フラグIDの最小値 */
|
---|
| 121 | #define TMIN_DTQID 1 /* データキューIDの最小値 */
|
---|
| 122 | #define TMIN_PDQID 1 /* 優先度データキューIDの最小値 */
|
---|
| 123 | #define TMIN_MTXID 1 /* ミューテックスIDの最小値 */
|
---|
| 124 | #define TMIN_MPFID 1 /* 固定長メモリプールIDの最小値 */
|
---|
| 125 | #define TMIN_CYCID 1 /* 周期通知IDの最小値 */
|
---|
| 126 | #define TMIN_ALMID 1 /* アラーム通知IDの最小値 */
|
---|
| 127 | #define TMIN_ISRID 1 /* 割込みサービスルーチンIDの最小値 */
|
---|
| 128 |
|
---|
| 129 | /*
|
---|
| 130 | * 優先度の段階数の定義
|
---|
| 131 | */
|
---|
| 132 | #define TNUM_TPRI (TMAX_TPRI - TMIN_TPRI + 1)
|
---|
| 133 | #define TNUM_DPRI (TMAX_DPRI - TMIN_DPRI + 1)
|
---|
| 134 | #define TNUM_INTPRI (TMAX_INTPRI - TMIN_INTPRI + 1)
|
---|
| 135 |
|
---|
| 136 | /*
|
---|
| 137 | * カーネル内部で使用する属性の定義
|
---|
| 138 | */
|
---|
| 139 | #define TA_NOEXS ((ATR)(-1)) /* 未登録状態 */
|
---|
| 140 |
|
---|
| 141 | #ifndef TA_MEMALLOC
|
---|
| 142 | #define TA_MEMALLOC UINT_C(0x8000) /* メモリ領域をカーネルで確保 */
|
---|
| 143 | #endif /* TA_MEMALLOC */
|
---|
| 144 | #ifndef TA_MBALLOC
|
---|
| 145 | #define TA_MBALLOC UINT_C(0x4000) /* 管理領域をカーネルで確保 */
|
---|
| 146 | #endif /* TA_MBALLOC */
|
---|
| 147 |
|
---|
| 148 | /*
|
---|
| 149 | * ターゲット定義のエラーチェックマクロのデフォルト値の定義
|
---|
| 150 | */
|
---|
| 151 | #ifndef TARGET_TSKATR
|
---|
| 152 | #define TARGET_TSKATR 0U /* ターゲット定義のタスク属性 */
|
---|
| 153 | #endif /* TARGET_TSKATR */
|
---|
| 154 |
|
---|
| 155 | #ifndef TARGET_ISRATR
|
---|
| 156 | #define TARGET_ISRATR 0U /* ターゲット定義のISR属性 */
|
---|
| 157 | #endif /* TARGET_ISRATR */
|
---|
| 158 |
|
---|
[429] | 159 | #ifndef TARGET_MIN_STKSZ /* タスクのスタックサイズの最小値 */
|
---|
| 160 | #define TARGET_MIN_STKSZ 1U /* 未定義の場合は0でないことをチェック */
|
---|
| 161 | #endif /* TARGET_MIN_STKSZ */
|
---|
| 162 |
|
---|
[270] | 163 | /*
|
---|
| 164 | * ヘッダファイルを持たないモジュールの関数・変数の宣言
|
---|
| 165 | */
|
---|
| 166 | #ifndef TOPPERS_MACRO_ONLY
|
---|
| 167 |
|
---|
| 168 | /*
|
---|
| 169 | * TECSの初期化(init_tecs.c)
|
---|
| 170 | */
|
---|
| 171 | extern void initialize_tecs(void);
|
---|
| 172 |
|
---|
| 173 | /*
|
---|
| 174 | * 各モジュールの初期化(kernel_cfg.c)
|
---|
| 175 | */
|
---|
| 176 | extern void initialize_object(void);
|
---|
| 177 |
|
---|
| 178 | /*
|
---|
[429] | 179 | * 初期化ルーチン関係の定義(kernel_cfg.c)
|
---|
[270] | 180 | */
|
---|
[429] | 181 | typedef struct initialization_routine_block {
|
---|
| 182 | INIRTN inirtn; /* 初期化ルーチンの先頭番地 */
|
---|
| 183 | intptr_t exinf; /* 初期化ルーチンの拡張情報 */
|
---|
| 184 | } INIRTNB;
|
---|
[270] | 185 |
|
---|
[429] | 186 | extern const uint_t tnum_inirtn; /* 初期化ルーチンの数 */
|
---|
| 187 |
|
---|
| 188 | extern const INIRTNB inirtnb_table[]; /* 初期化ルーチンブロックテーブル */
|
---|
| 189 |
|
---|
[270] | 190 | /*
|
---|
[429] | 191 | * 終了処理ルーチン関係の定義(kernel_cfg.c)
|
---|
[270] | 192 | */
|
---|
[429] | 193 | typedef struct termination_routine_block {
|
---|
| 194 | TERRTN terrtn; /* 終了処理ルーチンの先頭番地 */
|
---|
| 195 | intptr_t exinf; /* 終了処理ルーチンの拡張情報 */
|
---|
| 196 | } TERRTNB;
|
---|
[270] | 197 |
|
---|
[429] | 198 | extern const uint_t tnum_terrtn; /* 終了処理ルーチンの数 */
|
---|
| 199 |
|
---|
| 200 | extern const TERRTNB terrtnb_table[]; /* 終了処理ルーチンブロックテーブル */
|
---|
| 201 |
|
---|
[270] | 202 | /*
|
---|
| 203 | * 非タスクコンテキスト用のスタック領域(kernel_cfg.c)
|
---|
| 204 | */
|
---|
| 205 | extern const size_t istksz; /* スタック領域のサイズ(丸めた値) */
|
---|
| 206 | extern STK_T *const istk; /* スタック領域の先頭番地 */
|
---|
| 207 | #ifdef TOPPERS_ISTKPT
|
---|
| 208 | extern STK_T *const istkpt; /* スタックポインタの初期値 */
|
---|
| 209 | #endif /* TOPPERS_ISTKPT */
|
---|
| 210 |
|
---|
| 211 | /*
|
---|
[429] | 212 | * カーネルメモリプール領域(kernel_cfg.c)
|
---|
[270] | 213 | */
|
---|
[429] | 214 | extern const size_t mpksz; /* カーネルメモリプール領域のサイズ */
|
---|
| 215 | extern MB_T *const mpk; /* カーネルメモリプール領域の先頭番地 */
|
---|
[270] | 216 |
|
---|
| 217 | /*
|
---|
| 218 | * カーネル動作状態フラグ(startup.c)
|
---|
| 219 | */
|
---|
| 220 | extern bool_t kerflg;
|
---|
| 221 |
|
---|
| 222 | /*
|
---|
[429] | 223 | * カーネルメモリプール領域有効フラグ(startup.c)
|
---|
| 224 | */
|
---|
| 225 | extern bool_t mpk_valid;
|
---|
| 226 |
|
---|
| 227 | /*
|
---|
[270] | 228 | * カーネルの起動(startup.c)
|
---|
| 229 | */
|
---|
| 230 | extern void sta_ker(void);
|
---|
| 231 |
|
---|
| 232 | /*
|
---|
| 233 | * カーネルの終了処理(startup.c)
|
---|
| 234 | */
|
---|
| 235 | extern void exit_kernel(void);
|
---|
| 236 |
|
---|
| 237 | /*
|
---|
[429] | 238 | * メモリプール領域の管理(startup.c)
|
---|
[270] | 239 | */
|
---|
[429] | 240 | extern bool_t initialize_mempool(MB_T *mempool, size_t size);
|
---|
| 241 | extern void *malloc_mempool(MB_T *mempool, size_t size);
|
---|
| 242 | extern void free_mempool(MB_T *mempool, void *ptr);
|
---|
[270] | 243 |
|
---|
| 244 | /*
|
---|
[429] | 245 | * カーネルメモリプール領域からのメモリ獲得/解放
|
---|
| 246 | */
|
---|
| 247 | Inline void *
|
---|
| 248 | malloc_mpk(size_t size)
|
---|
| 249 | {
|
---|
| 250 | if (mpk_valid) {
|
---|
| 251 | return(malloc_mempool(mpk, size));
|
---|
| 252 | }
|
---|
| 253 | else {
|
---|
| 254 | return(NULL);
|
---|
| 255 | }
|
---|
| 256 | }
|
---|
| 257 |
|
---|
| 258 | Inline void
|
---|
| 259 | free_mpk(void *ptr)
|
---|
| 260 | {
|
---|
| 261 | if (mpk_valid) {
|
---|
| 262 | free_mempool(mpk, ptr);
|
---|
| 263 | }
|
---|
| 264 | }
|
---|
| 265 |
|
---|
| 266 | /*
|
---|
[270] | 267 | * 通知ハンドラの型定義
|
---|
| 268 | */
|
---|
| 269 | typedef void (*NFYHDR)(intptr_t exinf);
|
---|
| 270 |
|
---|
| 271 | /*
|
---|
[429] | 272 | * 通知方法のエラーチェック(time_manage.c)
|
---|
[270] | 273 | */
|
---|
| 274 | extern ER check_nfyinfo(const T_NFYINFO *p_nfyinfo);
|
---|
| 275 |
|
---|
| 276 | /*
|
---|
[429] | 277 | * 通知ハンドラ(time_manage.c)
|
---|
[270] | 278 | */
|
---|
| 279 | extern void notify_handler(intptr_t exinf);
|
---|
| 280 |
|
---|
| 281 | #endif /* TOPPERS_MACRO_ONLY */
|
---|
| 282 | #endif /* TOPPERS_KERNEL_IMPL_H */
|
---|