|
|
@ -5,29 +5,17 @@ |
|
|
|
#include "thread.h" |
|
|
|
|
|
|
|
/***
|
|
|
|
上下文切换的指针,如果触发了上下文切换,则next_task为下一个执行目标。 |
|
|
|
上下文切换的指针,如果触发了上下文切换,则next_task为下一个执行目标。 |
|
|
|
***/ |
|
|
|
tcb_t *current_task; |
|
|
|
tcb_t *next_task; |
|
|
|
tcb_t *task_list = { 0 }; |
|
|
|
|
|
|
|
/***
|
|
|
|
切换任务的函数,进行上下文切换的时候,会获取一下最新的任务指针。 |
|
|
|
***/ |
|
|
|
void switch_to_next_task(void) |
|
|
|
{ |
|
|
|
tcb_t *temp = current_task; |
|
|
|
current_task = next_task; |
|
|
|
next_task = temp; |
|
|
|
} |
|
|
|
|
|
|
|
/***
|
|
|
|
启动切换,芯片上电默认执行的是main函数,需要切换到第一个任务上。 |
|
|
|
***/ |
|
|
|
void start_first_task(void) |
|
|
|
{ |
|
|
|
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; |
|
|
|
__DSB(); |
|
|
|
__ISB(); |
|
|
|
current_task = (current_task ? current_task : task_list)->next; |
|
|
|
} |
|
|
|
|
|
|
|
/***
|
|
|
@ -36,14 +24,8 @@ void start_first_task(void) |
|
|
|
2.采用时间片调度。 |
|
|
|
3.采用信号量调度。 |
|
|
|
***/ |
|
|
|
tcb_t *task[2]; |
|
|
|
uint8_t tcb_cunt = 0; |
|
|
|
static uint8_t max_tcb = 0; |
|
|
|
void tcb_scheduler(void) |
|
|
|
{ |
|
|
|
tcb_cunt = tcb_cunt % 2; |
|
|
|
next_task = task[tcb_cunt]; |
|
|
|
tcb_cunt++; |
|
|
|
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk; |
|
|
|
__DSB(); |
|
|
|
__ISB(); |
|
|
@ -54,11 +36,9 @@ void tcb_scheduler(void) |
|
|
|
***/ |
|
|
|
void init_task(tcb_t *tcb, void (*task_entry)(void *), uint8_t *start_stack, void *arg) |
|
|
|
{ |
|
|
|
static tcb_t *task_first_list; |
|
|
|
// 栈顶对齐到 8 字节(硬件要求)
|
|
|
|
static uint8_t tcb_id = 0; |
|
|
|
task[tcb_id] = tcb; |
|
|
|
tcb_id++; |
|
|
|
tcb->task_id = tcb_id; |
|
|
|
tcb->task_id = task_list ? task_list->task_id + 1 : 1; |
|
|
|
tcb->stack_ptr = (uint32_t *)start_stack; |
|
|
|
uint32_t *stack_top = (uint32_t *)((uint8_t *)tcb->stack_ptr + STACK_SIZE); |
|
|
|
stack_top = (uint32_t *)((uint32_t)stack_top & ~0x07); |
|
|
@ -78,10 +58,17 @@ void init_task(tcb_t *tcb, void (*task_entry)(void *), uint8_t *start_stack, voi |
|
|
|
} |
|
|
|
tcb->stack_ptr = stack_top; |
|
|
|
|
|
|
|
printf("init_tch:%d\r\n", tcb_id); |
|
|
|
if(tcb_id == 1) |
|
|
|
printf("init_tch:%d\r\n", tcb->task_id); |
|
|
|
if(tcb->task_id == 1) |
|
|
|
{ |
|
|
|
printf("start_tch:%d\r\n", tcb->task_id); |
|
|
|
task_first_list = tcb; |
|
|
|
task_list = tcb; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
printf("start_tch:%d\r\n", tcb_id); |
|
|
|
next_task = tcb; |
|
|
|
task_list->next = tcb; |
|
|
|
tcb->next = task_first_list; |
|
|
|
task_list = tcb; |
|
|
|
} |
|
|
|
} |
|
|
|