Update task.md
This commit is contained in:
parent
2d275b22bf
commit
7d94b1d3a0
|
@ -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);
|
||||
```
|
||||
|
||||
该函数用于创建一个消息队列。创建成功后,新的消息队列会被加入内核的消息队列管理链表,并返回该消息队列的ID,ID默认范围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 | 持有互斥量的任务 |
|
||||
|
|
Loading…
Reference in New Issue