GadgetSeed  0.9.6
init.c
[詳解]
1 /** @file
2  @brief GadgetSeed カーネル初期化
3 
4  @date 2007.12.31
5  @author Takashi SHUDO
6 */
7 
8 #include "sysconfig.h"
9 #include "gadgetseed.h"
10 #include "system.h"
11 #include "device.h"
12 #include "interrupt.h"
13 #include "console.h"
14 #include "timer.h"
15 #include "tkprintf.h"
16 #include "memory.h"
17 #include "font.h"
18 #include "sysevent.h"
19 #include "device/timer_ioctl.h"
20 #include "task/task.h"
21 #include "task/syscall.h"
22 #include "task/task_opration.h"
23 
24 #if 0 // 以下はコメントです
25 // 以下のマクロは sysconfig.h で定義させるために、 configs/systems/*.conf に GSC_ を付けずに記載して下さい
26 #define GSC_ARCH "CPU_ARCITECTURE_NAME" ///< $gsc CPU アーキテクチャ名
27 #define GSC_CPUNAME "CPU_NAME" ///< $gsc CPU 名
28 #define GSC_SYSTEM "SYSTEM_NAME" ///< $gsc システム名
29 // CPU、システムによっては以下のマクロが有効です
30 #define GSC_CPU_CLOCK_HZ 200000000UL ///< $gsc CPUクロック周波数(Hz)
31 #endif
32 
33 #ifndef GSC_KERNEL_INITIALTASK_STACK_SIZE ///< $gsc カーネル初期化タスクのスタックサイズ
34 #ifdef GSC_TARGET_SYSTEM_EMU // $gsc ターゲットシステムはエミュレータ
35 #define GSC_KERNEL_INITIALTASK_STACK_SIZE (1024*4)
36 #else
37 #define GSC_KERNEL_INITIALTASK_STACK_SIZE (1024*2)
38 #endif
39 #endif
40 
41 #define xstr(s) str(s)
42 #define str(s) #s
43 
44 const char arch_name[] = xstr(GSC_ARCH);
45 const char cpu_name[] = xstr(GSC_CPUNAME);
46 const char system_name[] = xstr(GSC_SYSTEM);
47 
48 extern struct st_device GSC_KERNEL_ERROUT_DEVICE; ///< $gsc エラーメッセージ出力デバイス
49 extern struct st_device GSC_KERNEL_TIMER_DEVICE; ///< $gsc カーネルタイマデバイス
50 extern struct st_device GSC_KERNEL_MESSAGEOUT_DEVICE; ///< $gsc カーネルメッセージ出力デバイス
51 
52 // カーネルメッセージ出力デバイス初期化
53 static void register_kernel_message_out_device(void)
54 {
55  // sysconfig.h
56  (void)register_device(&GSC_KERNEL_ERROUT_DEVICE, 0);
58 }
59 
60 void display_bunner(void)
61 {
62  extern const char os_version[];
63  extern const char build_date[];
64  extern const char build_time[];
65 
66  tkprintf("GadgetSeed Ver. %s\n", os_version);
67  tkprintf("(c)2010-2018 Takashi SHUDO\n");
68  tkprintf("CPU ARCH : %s\n", arch_name);
69  tkprintf("CPU NAME : %s\n", cpu_name);
70  tkprintf("SYSTEM : %s\n", system_name);
71  tkprintf("Build date : %s %s\n", build_time, build_date);
72 }
73 
74 extern void init_sect(void);
75 extern int initial_task(char *arg);
76 
77 static struct st_tcb init_task_tcb;
78 
79 static unsigned int init_task_stack[GSC_KERNEL_INITIALTASK_STACK_SIZE/sizeof(unsigned int)];
80 
81 int flg_init_task_run = 0;
82 
83 extern void startup(void);
84 
85 /**
86  @brief イニシャルタスク
87 
88  @param[in] arg 引数
89 */
90 int initial_task(char *arg)
91 {
92  flg_init_task_run = 1;
93 
94  startup();
95 
96  //while(1) {
97  // ;
98  //}
99 
100  return 0;
101 }
102 
103 
104 /**
105  @brief カーネルを初期化する
106 
107  @param[in] argc 引数の数
108  @param[in] argv 引数の文字列
109 */
110 void init_gs(int *argc, char ***argv)
111 {
112  /*
113  ドライバ初期化前に必要なシステム固有初期化処理
114  */
115  init_system(argc, argv);
116 
117  /*
118  カーネルAPI(SYSCALL)ジャンプテーブル初期化
119  */
120 #ifndef LINT
121  disable_interrupt();
122  init_interrupt_vector(); // 割り込みベクタテーブル初期化
123  enable_interrupt();
124 #endif
125 
127 
128 #ifdef GSC_COMP_ENABLE_FONTS /// $gsc 文字フォント表示を有効にする
129  init_font();
130 #endif
131 
132  // カーネルタイマドライバ初期化
133  register_device(&GSC_KERNEL_TIMER_DEVICE, 0); // sysconfig.h
134 
135  // コンソール初期化
137  register_kernel_message_out_device();
138  display_bunner();
139 
140  init_timer(DEF_DEV_NAME_TIMER);
141 
142  /*
143  メモリリソース初期化、以後 memory_alloc() 使用可能
144  */
145 #ifdef GSC_MEMORY_ENABLE_HEAP_MEMORY /// $gsc ヒープメモリを有効にする
146  init_memory();
148 #endif
149 
150  /*
151  マルチタスク制御初期化
152  */
153  init_task();
154 
155  /*
156  システムコール割り込みハンドラ登録
157  */
158  register_interrupt(INTNUM_SYSCALL, syscall_inthdr);
159 
160  /*
161  カーネルタイマスケジューラ登録
162  */
163  register_kernel_timer_func(task_schedule);
164 
165  init_event();
166 
167  /*
168  ここまでが最小限の初期化
169  以後、各システム依存の初期化を行う
170  */
171 
172  /*
173  システム固有のドライバ登録
174  */
176 
177  /*
178  初期タスク起動
179  */
180  task_exec(initial_task, "init", GSC_KERNEL_MAX_TASK_PRIORITY-2, &init_task_tcb,
181  init_task_stack, GSC_KERNEL_INITIALTASK_STACK_SIZE, 0);
182 }
#define GSC_KERNEL_INITIALTASK_STACK_SIZE
< $gsc カーネル初期化タスクのスタックサイズ
Definition: init.c:37
int register_kmess_out_dev(struct st_device *dev)
カーネルメッセージ出力デバイスを登録する
Definition: tkprintf.c:63
メモリ管理
char * arg
タスク実行時引数文字列
Definition: tcb.h:46
void init_device_list(void)
デバイスドライバリストを初期化する
Definition: device.c:99
void init_event(void)
全てのシステムイベントバッファのイベントを初期化(削除)する
Definition: sysevent.c:107
カーネルタイマ
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
Definition: tkprintf.c:100
int initial_task(char *arg)
イニシャルタスク
Definition: init.c:90
void init_gs(int *argc, char ***argv)
カーネルを初期化する
Definition: init.c:110
void init_system(int *argc, char ***argv)
ドライバ初期化以前に行う初期化処理
カーネル用機能限定printf
システムイベント
void init_console_device(void)
全てのコンソール入出力デバイスを初期化する
Definition: console.c:118
GadgetSeed カーネル
システムコール
割り込みハンドラ
void init_system_drivers(void)
基本ドライバ初期化後に登録するユーザドライバ登録処理
struct st_device GSC_KERNEL_ERROUT_DEVICE
$gsc エラーメッセージ出力デバイス
void display_memory_info(void)
メモリ状態表示
Definition: memory.c:115
タスク制御
システム固有初期化関連
コンソールI/O
#define GSC_KERNEL_MAX_TASK_PRIORITY
$gsc カーネルタスクプライオリティ段階数
Definition: task.h:18
void register_kernel_timer_func(timer_func func)
カーネル周期処理を追加する
Definition: timer.c:261
デバイスドライバAPI
タスク操作
デバイスドライバ構造体
Definition: device.h:25
int task_exec(task_func func, char *name, int priority, struct st_tcb *tcb, unsigned int *stack, int stack_size, char *arg)
タスクを追加し起動する
Definition: syscall_api.c:231
struct st_device GSC_KERNEL_MESSAGEOUT_DEVICE
$gsc カーネルメッセージ出力デバイス
タスクコンテキスト
Definition: tcb.h:32
struct st_device GSC_KERNEL_TIMER_DEVICE
$gsc カーネルタイマデバイス
フォント
#define DEF_DEV_NAME_TIMER
標準タイマデバイス名
Definition: timer_ioctl.h:15
void startup(void)
タスクコンテキストで実行される初期化処理
Definition: main.c:144
タイマドライバ ioctl 用マクロ定義