Skip to content

Commit

Permalink
✨ 050 任务阻塞和就绪
Browse files Browse the repository at this point in the history
  • Loading branch information
StevenBaby committed Apr 26, 2022
1 parent 66db97e commit 6072b8f
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 68 deletions.
8 changes: 8 additions & 0 deletions docs/07 任务管理/050 任务阻塞和就绪.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# 任务阻塞和就绪

```c++
void task_block(task_t *task, list_t *blist, task_state_t state);
void task_unblock(task_t *task);
```
如果所有任务都阻塞,怎么办?
4 changes: 4 additions & 0 deletions src/include/onix/task.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define ONIX_TASK_H

#include <onix/types.h>
#include <onix/list.h>

#define KERNEL_USER 0
#define NORMAL_USER 1
Expand All @@ -24,6 +25,7 @@ typedef enum task_state_t
typedef struct task_t
{
u32 *stack; // 内核栈
list_node_t node; // 任务阻塞节点
task_state_t state; // 任务状态
u32 priority; // 任务优先级
u32 ticks; // 剩余时间片
Expand All @@ -48,5 +50,7 @@ task_t *running_task();
void schedule();

void task_yield();
void task_block(task_t *task, list_t *blist, task_state_t state);
void task_unblock(task_t *task);

#endif
19 changes: 18 additions & 1 deletion src/kernel/gate.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <onix/assert.h>
#include <onix/debug.h>
#include <onix/syscall.h>
#include <onix/task.h>

#define LOGK(fmt, args...) DEBUGK(fmt, ##args)

Expand All @@ -22,9 +23,25 @@ static void sys_default()
panic("syscall not implemented!!!");
}

task_t *task = NULL;

static u32 sys_test()
{
LOGK("syscall test...\n");
// LOGK("syscall test...\n");

if (!task)
{
task = running_task();
// LOGK("block task 0x%p \n", task);
task_block(task, NULL, TASK_BLOCKED);
}
else
{
task_unblock(task);
// LOGK("unblock task 0x%p \n", task);
task = NULL;
}

return 255;
}

Expand Down
13 changes: 1 addition & 12 deletions src/kernel/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,6 @@ extern void task_init();
extern void syscall_init();
extern void hang();

void intr_test()
{
bool intr = interrupt_disable();

// do something

set_interrupt_state(intr);
}

void kernel_init()
{
memory_map_init();
Expand All @@ -36,7 +27,5 @@ void kernel_init()
task_init();
syscall_init();

list_test();

// set_interrupt_state(true);
set_interrupt_state(true);
}
52 changes: 47 additions & 5 deletions src/kernel/task.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
#include <onix/string.h>
#include <onix/bitmap.h>
#include <onix/syscall.h>
#include <onix/list.h>

extern bitmap_t kernel_map;
extern void task_switch(task_t *next);

#define NR_TASKS 64
static task_t *task_table[NR_TASKS];
static task_t *task_table[NR_TASKS]; // 任务表
static list_t block_list; // 任务默认阻塞链表

// 从 task_table 里获得一个空闲的任务
static task_t *get_free_task()
Expand Down Expand Up @@ -57,6 +59,44 @@ void task_yield()
schedule();
}

// 任务阻塞
void task_block(task_t *task, list_t *blist, task_state_t state)
{
assert(!get_interrupt_state());
assert(task->node.next == NULL);
assert(task->node.prev == NULL);

if (blist == NULL)
{
blist = &block_list;
}

list_push(blist, &task->node);

assert(state != TASK_READY && state != TASK_RUNNING);

task->state = state;

task_t *current = running_task();
if (current == task)
{
schedule();
}
}

// 解除任务阻塞
void task_unblock(task_t *task)
{
assert(!get_interrupt_state());

list_remove(&task->node);

assert(task->node.next == NULL);
assert(task->node.prev == NULL);

task->state = TASK_READY;
}

task_t *running_task()
{
asm volatile(
Expand Down Expand Up @@ -137,7 +177,7 @@ u32 thread_a()
while (true)
{
printk("A");
yield();
test();
}
}

Expand All @@ -148,7 +188,7 @@ u32 thread_b()
while (true)
{
printk("B");
yield();
test();
}
}

Expand All @@ -159,15 +199,17 @@ u32 thread_c()
while (true)
{
printk("C");
yield();
test();
}
}

void task_init()
{
list_init(&block_list);

task_setup();

task_create(thread_a, "a", 5, KERNEL_USER);
task_create(thread_b, "b", 5, KERNEL_USER);
task_create(thread_c, "c", 5, KERNEL_USER);
// task_create(thread_c, "c", 5, KERNEL_USER);
}
50 changes: 0 additions & 50 deletions src/lib/list.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,53 +110,3 @@ u32 list_size(list_t *list)
}
return size;
}

#include <onix/memory.h>
#include <onix/debug.h>

#define LOGK(fmt, args...) DEBUGK(fmt, ##args)

void list_test()
{
u32 count = 3;
list_t holder;
list_t *list = &holder;
list_init(list);
list_node_t *node;

while (count--)
{
node = (list_node_t *)alloc_kpage(1);
list_push(list, node);
}

while (!list_empty(list))
{
node = list_pop(list);
free_kpage((u32)node, 1);
}

count = 3;
while (count--)
{
node = (list_node_t *)alloc_kpage(1);
list_pushback(list, node);
}

LOGK("list size %d\n", list_size(list));

while (!list_empty(list))
{
node = list_popback(list);
free_kpage((u32)node, 1);
}

node = (list_node_t *)alloc_kpage(1);
list_pushback(list, node);

LOGK("search node 0x%p --> %d\n", node, list_search(list, node));
LOGK("search node 0x%p --> %d\n", 0, list_search(list, 0));

list_remove(node);
free_kpage((u32)node, 1);
}

0 comments on commit 6072b8f

Please sign in to comment.