docs(kernel/task.md): replace some inappropriate/duplicate words, delete some mistake letter and adjust some mistake blankets
This commit is contained in:
parent
ae2027a2be
commit
d400f41593
|
@ -32,7 +32,7 @@
|
|||
|
||||
### 任务状态
|
||||
|
||||
XiUOS 中的任务在任意时刻都处于就绪(ready)、运行(running)、阻塞/挂起(suspend)、退出(quit)四种状态之一。状态之间的变化关系如下图所示。
|
||||
XiUOS 中的任务在任意时刻都处于就绪(ready)、运行(running)、阻塞/挂起(suspend)、退出(close)四种状态之一。状态之间的变化关系如下图所示。
|
||||
|
||||
<img src="./imagesrc/task_status.png" width =100%/>
|
||||
|
||||
|
@ -78,7 +78,7 @@ struct TaskDescriptor
|
|||
};
|
||||
```
|
||||
|
||||
其中,stack_point 指向任务堆栈的起始地址,task_dync_sched_member 包含与任务调度相关的信息,task_base_info 记录任务的基本信息,task_smp_info 统计与多处理器相关的信息,event_id_trigger / event_mode 用于实现事件集机制(详见[任务通信](#communication)),exstatus为任务调用内核接口时最近的错误码,即用户线程在使用内核接口时可能会执行失败,此时内核接口返回-1,具体的错误码被保存在exstatus成员中,且在下一次调用内核接口失败时被覆盖,link 用于组织内核中所有的任务。id 用于表示一个线程,Done提供所有的线程的操作函数,各复合成员的详细定义如下。
|
||||
其中,stack_point 指向任务堆栈的起始地址,task_dync_sched_member 包含与任务调度相关的信息,task_base_info 记录任务的基本信息,task_smp_info 统计与多处理器相关的信息,event_id_trigger / event_mode 用于实现事件集机制(详见[任务通信](#communication)),exstatus为任务调用内核接口时最近的错误码,即用户线程在使用内核接口时可能会执行失败,此时内核接口返回-1,具体的错误码被保存在成员变量exstatus中,且在下一次调用内核接口失败时被覆盖,link 用于组织内核中所有的任务。id 用于表示一个线程,Done提供所有的线程的操作函数,各复合成员的详细定义如下。
|
||||
* struct TaskDyncSchedMember
|
||||
```c
|
||||
struct TaskDyncSchedMember {
|
||||
|
@ -113,7 +113,7 @@ struct TaskDyncSchedMember {
|
|||
#define KTASK_CLOSE 0x04
|
||||
```
|
||||
|
||||
struct TaskDyncSchedMember结构用于记录与调度相关的信息。stat记录任务的当前状态,可以为初始化(KTASK_INIT)挂起(KTASK_SUSPEND)、就绪(KTASK_READY)、运行(KTASK_RUNNING)或退出(KTASK_CLOSE)。advance_cnt表示在配置成短作业预先调度时优先处理的时间片周期个数。cur_prio表示任务当前的优先级,用于优先级反转,该优先级可以高于任务创建时配置的优先级。origin_timeslice表示在时间片轮转调度时,任务每次运行的时间片。isolation_flag变量和指针isolation支持地址空间隔离,isolation_status用于标志内核服务的过程(1表示进入内核服务上下文)。sched_link和sched_avl构成的联合体为就绪队列节点,XiUOS中就绪队列可以组织为双链表(sched_link)或平衡二叉树(sched_avl)。task_timer为任务睡眠的计数器。
|
||||
TaskDyncSchedMember结构用于记录与调度相关的信息。stat记录任务的当前状态,可以为初始化(KTASK_INIT)挂起(KTASK_SUSPEND)、就绪(KTASK_READY)、运行(KTASK_RUNNING)或退出(KTASK_CLOSE)。advance_cnt表示在配置成短作业预先调度时优先处理的时间片周期个数。cur_prio表示任务当前的优先级,用于优先级反转,该优先级可以高于任务创建时配置的优先级。origin_timeslice表示在时间片轮转调度时,任务每次运行的时间片。isolation_flag变量和指针isolation支持地址空间隔离,isolation_status用于标志内核服务的过程(1表示进入内核服务上下文)。sched_link和sched_avl构成的联合体为就绪队列节点,XiUOS中就绪队列可以组织为双链表(sched_link)或平衡二叉树(sched_avl)。task_timer为任务睡眠的计数器。
|
||||
* struct TaskBaseInfo
|
||||
```c
|
||||
struct TaskBaseInfo {
|
||||
|
@ -126,7 +126,7 @@ struct TaskBaseInfo {
|
|||
};
|
||||
```
|
||||
|
||||
struct TaskBaseInfo结构记录了任务的基本属性,包括任务的名称(name)、入口函数(func_entry)和参数(func_param)、栈大小(stack_depth)、初始优先级(origin_prio)。
|
||||
TaskBaseInfo结构记录了任务的基本属性,包括任务的名称(name)、入口函数(func_entry)和参数(func_param)、栈大小(stack_depth)、初始优先级(origin_prio)。
|
||||
* struct TaskSmpInfo
|
||||
```c
|
||||
struct TaskSmpInfo {
|
||||
|
@ -135,7 +135,7 @@ struct TaskSmpInfo {
|
|||
uint16 critical_lock_cnt;
|
||||
};
|
||||
```
|
||||
struct TaskSmpInfo结构包含多处理器相关的信息,其成员分别表示该任务绑定的CPU ID与正在运行的CPU ID。
|
||||
TaskSmpInfo结构包含多处理器相关的信息,其成员分别表示该任务绑定的CPU ID与正在运行的CPU ID。
|
||||
<span id="api"></span>
|
||||
|
||||
### 任务函数接口
|
||||
|
@ -154,7 +154,7 @@ typedef struct utask UtaskType;
|
|||
int32_t UserTaskCreate(UtaskType task);
|
||||
```
|
||||
|
||||
该函数用于用户态的任务创建。任务的各个属性由struct utask结构表示,包括任务的名称、入口函数及参数、栈大小和优先级,在调用该函数时需要传入该结构的实例用于配置任务属性。任务创建成功后,内核会为其分配指定大小的栈及其他结构(如struct TaskDescriptor),并返回任务id。
|
||||
该函数用于用户态的任务创建。任务的各个属性由utask结构表示,包括任务的名称、入口函数及参数、栈大小和优先级,在调用该函数时需要传入该结构的实例用于配置任务属性。任务创建成功后,内核会为其分配指定大小的栈及其他结构(如struct TaskDescriptor),并返回任务id。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
|
@ -205,7 +205,7 @@ x_err_t UserTaskCoreUnCombine(int32_t id);
|
|||
x_err_t UserTaskDelay(int32_t ms);
|
||||
```
|
||||
|
||||
该函数用于将当前任务挂起一定时间,单位为tick。挂起时间结束后,任务会进入就绪状态,等待系统调用。
|
||||
该函数用于将当前任务挂起一定时间,单位为ms。挂起时间结束后,任务会进入就绪状态,等待系统调用。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
|
@ -294,7 +294,7 @@ x_err_t UserMsgQueueSendwait(int32_t mq, const void *buffer, size_t size, int32_
|
|||
x_err_t UserMsgQueueSend(int32_t mq, const void *buffer, size_t size);
|
||||
```
|
||||
|
||||
该函数用于向消息队列发送一个消息。若消息发送成功则返回EOK,若不成功(等待超时)则返回-ETIMEOUT。
|
||||
该函数用于向消息队列发送一个消息。若消息发送成功则返回EOK,若不成功则返回-ETIMEOUT。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
|
@ -306,7 +306,7 @@ x_err_t UserMsgQueueSend(int32_t mq, const void *buffer, size_t size);
|
|||
x_err_t UserMsgQueueUrgentSend(int32_t mq, const void *buffer, size_t size);
|
||||
```
|
||||
|
||||
该函数用于向消息队列y优先发送一个消息。若消息发送成功则返回EOK,若不成功(等待超时)则返回-ETIMEOUT。
|
||||
该函数用于向消息队列优先发送一个消息。若消息发送成功则返回EOK,若不成功(等待超时)则返回-ETIMEOUT。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
|
@ -359,7 +359,7 @@ struct Semaphore
|
|||
| --- | --- |
|
||||
| id | 信号量ID,用于唯一标识一个信号量 |
|
||||
| value | 信号量的当前值 |
|
||||
| pend_link | 挂起任务链表 |
|
||||
| pend_list | 挂起任务链表 |
|
||||
| link | 系统中所有信号量构成的链表 |
|
||||
|
||||
#### 信号量函数接口
|
||||
|
@ -581,7 +581,7 @@ x_err_t UserEventReinit(EventIdType event);
|
|||
|
||||
XiUOS 是一个支持多任务的操作系统,对任务的数量没有限制。在 XiUOS 中,每个任务都需要自己的堆栈,同时也可能会动态申请内存资源。任务在运行过程中发生内存溢出是 RTOS 系统中最常见的问题,所以限制任务的内存空间访问是保证 RTOS 稳定运行的关键。
|
||||
|
||||
ARM 和 RISC-V 在体系架构上都提供了内存访问的保护功能,可以通过对特定寄存器的硬编程实现对指定内存区域访问权限的设置。然而,现有的大多数物联网操作系统并没有使用体系结构提供的内存保护功能来对任务运行的地址空间进行隔离保护。XiUOS 充分考虑任务运行的安全问题,在不影响任务正常执行的情况下,对每个任务所允许访问的内存地址空间进行限制。除此之外,任务在动态申请内存、释放内存、内存共享时也提供隔离服务。
|
||||
ARM 和 RISC-V 在体系架构上都提供了内存访问的保护功能,可以通过对特定寄存器的硬编程实现对指定内存区域访问权限的设置。然而,现有的大多数物联网操作系统并没有使用体系结构提供的内存保护功能来对任务运行的地址空间进行隔离保护。XiUOS 充分考虑任务运行的安全问题,在不影响任务正常执行的情况下,对每个任务所允许访问的内存地址空间进行限制。除此之外,任务在动态申请内存、释放内存、内存共享时,XiUOS也将提供隔离服务。
|
||||
|
||||
XiUOS 任务隔离的总体设计思想是将物理内存地址空间划分为信任地址空间和非信任地址空间。XiUOS 的内核任务运行在信任地址空间,可以访问所有信任地址空间和非信任地址空间;XiUOS 的用户程序运行在非信任地址空间,通过”内核服务表“的方式访问内核任务提供的功能。
|
||||
|
||||
|
@ -987,7 +987,7 @@ int TestRealtime(int argc, char * argv[])
|
|||
```
|
||||
|
||||
|
||||
初始化GPIO18为输出模式,并初始化为低电平;在while(1)当中调用delay函数,每隔1个时间片发生一次调度。在下面的switch函数入口和出口位置操作GPIO。
|
||||
初始化GPIO18为输出模式,并初始化为低电平;在while(1)当中调用delay函数,每隔1个时间片发生一次调度。在下面的switch函数入口和出口位置操作GPIO。
|
||||
|
||||
```c
|
||||
void __attribute__((naked)) SwitchKtaskContext(x_ubase from, x_ubase to, struct TaskDescriptor *to_task)
|
||||
|
@ -1121,4 +1121,4 @@ void __attribute__((naked)) SaveMpie()
|
|||
## 使用场景
|
||||
|
||||
* 在多处理器设备上,多个任务可以并行运行,从而提高处理器的利用率。
|
||||
* 在一些中断驱动的应用中,如果中断需要处理的工作过于复杂,则可以创建一个任务专门用于处理相关工作,从而改善中断延迟。
|
||||
* 在一些中断驱动的应用中,如果中断需要处理的工作过于复杂,则可以创建一个任务专门用于处理相关工作,从而改善中断延迟。
|
||||
|
|
Loading…
Reference in New Issue