diff --git a/docs/doc/kernel/task.md b/docs/doc/kernel/task.md index 69ec4aa..b1a8c27 100644 --- a/docs/doc/kernel/task.md +++ b/docs/doc/kernel/task.md @@ -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。 ### 任务函数接口 @@ -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 | 任务名称 | ## 任务通信 @@ -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 | 持有互斥量的任务 |