陳鍾誠

Version 1.0

作業系統

理解了《中斷與切換》之後,只要再加上《時間中斷》,然後在設定時間到的時候強制進行切換,這樣就差不多是一個《作業系統》了。

03-ContextSwitch-2 裏展示了如何從 Kernel-to-UserTask 與 UserTask-to-Kernel 的切換方法,但這個範例只有單一個 UserTask,而不是多個 Task。

MultiTask 切換

因此在 mini-arm-os 的《第 4 單元》04-Multitasking 中就啟動了兩個 task 並進行切換,只是這個切換是在 task 中主動進行的,而不是由時間中斷強制切換的。

您可以看 [os.c] 這個《主程式》裏

...
int main(void)
{
	unsigned int user_stacks[TASK_LIMIT][STACK_SIZE];
	unsigned int *usertasks[TASK_LIMIT];
	size_t task_count = 0;
	size_t current_task;

	usart_init();

	print_str("OS: Starting...\n");
	print_str("OS: First create task 1\n");
	usertasks[0] = create_task(user_stacks[0], &task1_func);
	task_count += 1;
	print_str("OS: Back to OS, create task 2\n");
	usertasks[1] = create_task(user_stacks[1], &task2_func);
	task_count += 1;

	print_str("\nOS: Start multitasking, back to OS till task yield!\n");
	current_task = 0;

	while (1) {
		print_str("OS: Activate next task\n");
		usertasks[current_task] = activate(usertasks[current_task]);
		print_str("OS: Back to OS\n");

		current_task = current_task == (task_count - 1) ? 0 : current_task + 1;
	}

	return 0;
}
...

因此、mini-arm-os 的《第 5 單元》就是 05-TimerInterrupt ,先介紹一個簡易的時間中斷範例,然後再放入原本的作業系統裡面,