Update task.md

This commit is contained in:
Yan_yan 2021-01-29 16:08:57 +08:00
parent 2d275b22bf
commit 7d94b1d3a0
1 changed files with 55 additions and 43 deletions

View File

@ -58,28 +58,36 @@ XiUOS 中的任务在任意时刻都处于就绪ready、运行running
```c
struct task_descriptor
{
void *stack_pointer;
struct dync_sched_member dync_sched_member_x;
struct task_baseinfo t_baseinfo_x;
void *stack_point;
TaskDyncSchedMember_x Task_DyncSchedMember;
TaskBaseInfo_x Task_BaseInfo;
#ifdef XS_USING_SMP
struct smp_info smp_info_x;
#ifdef XS_CONFIG_SMP
TaskSmpInfo_t Task_SmpInfo;
#endif
#if defined(XS_USING_EVENT)
xs_uint32 event_ctrl1:3;
xs_uint32 event_ctrl2:29;
xs_uint32 event_trigger:29;
xs_uint32 event_mode:3;
#if defined(XS_CONFIG_TASK_ISOLATION)
xs_uint32 *Recved_event;
#endif
#endif
#if defined(XS_CONFIG_MESSAGEQUEUE) && defined(XS_CONFIG_TASK_ISOLATION)
void *mq_buf;
#endif
xs_err_t error;
XS_DOUBLE_LINKLIST link;
xs_err_t exstatus;
XS_DOUBLE_LINKLIST link;
struct xs_IdNode id;
};
```
其中stack_pointer 指向任务堆栈的起始地址dync_sched_member_x 包含与任务调度相关的信息t_baseinfo_x 记录任务的基本信息smp_info_x 统计与多处理器相关的信息event_ctrl1 / event_ctrl2 用于实现事件集机制(详见[任务通信](#communication)error为任务调用内核接口时最近的错误码,即用户线程在使用内核接口时可能会执行失败,此时内核接口返回-1具体的错误码被保存在error成员中且在下一次调用内核接口失败时被覆盖link 用于组织内核中所有的任务。各复合成员的详细定义如下。
* struct dync_sched_member
其中stack_point 指向任务堆栈的起始地址Task_DyncSchedMember 包含与任务调度相关的信息Task_BaseInfo 记录任务的基本信息Task_SmpInfo 统计与多处理器相关的信息event_trigger / event_mode 用于实现事件集机制(详见[任务通信](#communication)exstatus为任务调用内核接口时最近的错误码,即用户线程在使用内核接口时可能会执行失败,此时内核接口返回-1具体的错误码被保存在exstatus成员中且在下一次调用内核接口失败时被覆盖link 用于组织内核中所有的任务。各复合成员的详细定义如下。
* struct TaskDyncSchedMember
```c
struct dync_sched_member {
struct TaskDyncSchedMember {
xs_uint8 stat;
xs_uint8 advance_cnt;
xs_uint8 cur_prio;
@ -89,14 +97,19 @@ struct dync_sched_member {
#ifdef XS_USING_TASK_ISOLATION
xs_uint8 isolation_flag;
void *isolation;
xs_uint8 isolation_status;
#endif
union {
XS_DOUBLE_LINKLIST sched_link;
XS_AVL sched_avl;
};
XS_DOUBLE_LINKLIST pend_link;
xs_Timer_t task_timer;
#if XS_KTASK_PRIORITY_MAX > 32
xs_uint8 bitmap_offset;
xs_uint8 bitmap_row;
#endif
xs_uint32 bitmap_column;
struct xs_Timer task_timer;
};
#define XS_SUSPEND ((1) << (0))
@ -105,27 +118,31 @@ struct dync_sched_member {
#define XS_QUIT ((1) << (3))
```
struct dync_sched_member结构用于记录与调度相关的信息。stat记录任务的当前状态可以为挂起XS_SUSPEND、就绪XS_READY、运行XS_RUNNING或退出XS_QUIT。advance_cnt表示在配置成短作业预先调度时优先处理的时间片周期个数。cur_prio表示任务当前的优先级用于优先级反转该优先级可以高于任务创建时配置的优先级。origin_timeslice表示在时间片轮转调度时任务每次运行的时间片。isolation_flag变量和指针isolation支持地址空间隔离。sched_link和sched_avl构成的联合体为就绪队列节点XiUOS中就绪队列可以组织为双链表sched_link或平衡二叉树sched_avl。pend_link为任务挂起时使用的等待队列节点。task_timer为任务睡眠的计数器。
* struct task_baseinfo
struct TaskDyncSchedMember结构用于记录与调度相关的信息。stat记录任务的当前状态可以为挂起XS_SUSPEND、就绪XS_READY、运行XS_RUNNING或退出XS_QUIT。advance_cnt表示在配置成短作业预先调度时优先处理的时间片周期个数。cur_prio表示任务当前的优先级用于优先级反转该优先级可以高于任务创建时配置的优先级。origin_timeslice表示在时间片轮转调度时任务每次运行的时间片。isolation_flag变量和指针isolation支持地址空间隔离。sched_link和sched_avl构成的联合体为就绪队列节点XiUOS中就绪队列可以组织为双链表sched_link或平衡二叉树sched_avl。task_timer为任务睡眠的计数器。
* struct TaskBaseInfo
```c
struct task_baseinfo {
struct TaskBaseInfo {
char name[XS_NAME_MAX];
void *func_entry;
void *func_param;
xs_uint32 stack_size;
xs_uint8 origin_prio;
xs_uint32 stack_size;
void *stack_addr;
};
```
struct task_baseinfo结构记录了任务的基本属性包括任务的名称name、入口函数func_entry和参数func_param、栈大小stack_size、初始优先级origin_prio
* struct smp_info
struct TaskBaseInfo结构记录了任务的基本属性包括任务的名称name、入口函数func_entry和参数func_param、栈大小stack_size、初始优先级origin_prio
* struct TaskSmpInfo
```c
struct smp_info {
struct TaskSmpInfo {
xs_uint8 combined_coreid;
xs_uint8 running_coreid;
xs_uint16 sched_lock_cnt;
xs_uint16 cpus_lock_cnt;
xs_uint16 critical_lock_cnt;
};
```
struct smp_info结构包含多处理器相关的信息其成员分别表示该任务绑定的CPU ID与正在运行的CPU ID。
struct TaskSmpInfo结构包含多处理器相关的信息其成员分别表示该任务绑定的CPU ID与正在运行的CPU ID。
<span id="api"></span>
### 任务函数接口
@ -151,55 +168,46 @@ struct task_descriptor* xs_UserTaskCreate(xs_utask_x task);
| task | 任务配置属性 |
```c
xs_int32 xs_UserTaskDelete(struct task_descriptor task);
xs_err_t xs_UserTaskDelete(xs_int32 id);
```
该函数用于删除一个任务强制其进入退出状态。若删除成功则返回XS_EOK否则返回-XS_ERROR。
| 参数 | 描述 |
| --- | --- |
| task| 待删除的任务描述符 |
| id | 待删除的任务ID |
```c
xs_int32 xs_UserTaskCoreCombine(struct task_descriptor task, xs_uint8 core_id);
xs_err_t xs_UserTaskCoreCombine(xs_int32 id,xs_uint8 core_id);
```
该函数用于将任务绑定至指定的处理器上。若绑定成功则返回XS_EOK否则返回-XS_ERROR。
| 参数 | 描述 |
| --- | --- |
| task | 待绑定的任务描述符 |
| id | 待绑定的任务ID |
| core_id | 待绑定的处理器ID |
```c
xs_int32 xs_UserTaskCoreUncombine(struct task_descriptor task);
xs_err_t xs_UserTaskCoreUncombine(xs_int32 id);
```
该函数用于解除任务与处理器的绑定。若解除成功则返回XS_EOK否则返回-XS_ERROR。
| 参数 | 描述 |
| --- | --- |
| task | 待解除绑定的任务描述符 |
| id | 待解除绑定的任务ID |
```c
xs_int32 xs_UserTaskDelay(xs_ticks_x ticks);
xs_err_t xs_UserTaskDelay(xs_int32 ms);
```
该函数用于将当前任务挂起一定时间单位为tick。挂起时间结束后任务会进入就绪状态等待系统调用。
| 参数 | 描述 |
| --- | --- |
| ticks | 任务挂起时间单位为tick |
| ms | 任务挂起时间单位为ms |
```c
struct task_descriptor* xs_UserTaskSearch(char *name)
```
该函数根据任务名称获取任务描述符。
| 参数 | 描述 |
| --- | --- |
| name | 任务名称 |
<span id="communication"></span>
## 任务通信
@ -227,6 +235,7 @@ struct xs_MsgQueue
XS_DOUBLE_LINKLIST send_pend_list;
XS_DOUBLE_LINKLIST recv_pend_list;
XS_DOUBLE_LINKLIST link;
struct xs_MsgQueue_Ops *ops;
};
```
@ -241,18 +250,19 @@ struct xs_MsgQueue
| send_pend_list | 被挂起的发送任务链表 |
| recv_pend_list | 被挂起的接收任务链表 |
| link | 系统中所有消息队列构成的链表 |
| ops | 消息队列的操作函数集 |
#### 消息队列函数接口
```c
xs_int32 xs_UserMsgQueueCreate(xs_uint16 msg_len, xs_uint16 max_msgs);
xs_int32 xs_UserMsgQueueCreate(xs_uint16 msg_size, xs_uint16 max_msgs);
```
该函数用于创建一个消息队列。创建成功后新的消息队列会被加入内核的消息队列管理链表并返回该消息队列的IDID默认范围0-255可配置。
| 参数 | 描述 |
| --- | --- |
| msg_len | 每条消息的长度,单位为字节 |
| msg_size | 每条消息的长度,单位为字节 |
| max_msgs | 缓冲区中最多存放的消息数量 |
```c
@ -311,7 +321,7 @@ xs_int32 xs_UserMsgQueueReinit(xs_uint16 id);
```c
struct xs_Semaphore
{
xs_uint16 id;
struct xs_IdNode id;
xs_uint16 value;
XS_DOUBLE_LINKLIST pend_list;
@ -390,8 +400,9 @@ xs_int32 xs_UserSemaphoreSetValue(xs_uint16 id, xs_uint16 val);
```c
struct xs_Mutex
{
xs_uint16 id;
struct xs_IdNode id;
xs_uint16 val;
xs_uint8 origin_prio;
xs_uint8 recursive_cnt;
@ -404,6 +415,7 @@ struct xs_Mutex
| 成员 | 描述 |
| --- | --- |
| id | 互斥量ID用于唯一标识一个互斥量 |
| value | 互斥量的当前值 |
| origin_prio | 持有互斥量的任务的原优先级,用于避免优先级反转 |
| recursive_cnt | 持有互斥量的任务获取互斥量的次数,用于实现递归锁 |
| holder | 持有互斥量的任务 |