Merge pull request '修正文档中的一些词语、标点、空格的使用不当' (#41) from RobertYuan/xuos-web:master into master

This commit is contained in:
caodg 2021-11-01 07:57:52 +08:00
commit 32a2e231da
11 changed files with 39 additions and 40 deletions

View File

@ -251,7 +251,7 @@ int BusUnregister(struct Bus *bus)
}
```
* DRIVER注册到BUS函数
* DRIVER注册并挂接到BUS函数
```c
/**
* @Description: support to register driver pointer to bus pointer
@ -273,7 +273,7 @@ int DriverRegisterToBus(struct Bus *bus, struct Driver *driver)
}
```
* DRIVER从BUS中删除函数
* DRIVER从BUS中删除函数
```c
/**
* @Description: support to delete driver pointer from bus pointer
@ -296,7 +296,7 @@ int DriverDeleteFromBus(struct Bus *bus, struct Driver *driver)
}
```
* DEVICE注册到BUS函数
* DEVICE注册并挂接到BUS函数
```c
/**
* @Description: support to register dev pointer to bus pointer
@ -318,7 +318,7 @@ int DeviceRegisterToBus(struct Bus *bus, struct HardwareDev *device)
}
```
* DEVICE从BUS中删除函数
* DEVICE从BUS中删除函数
```c
/**
* @Description: support to delete dev pointer from bus pointer

View File

@ -17,17 +17,17 @@ shell的运行过程
* 执行相应的操作
建立一个命令与函数的一一对应的关系,定义结构体。
根据定义建立一个表,将所有的命令以及对应的函数进行声明
根据定义建立一个表,将所有的命令以及对应的函数进行声明
获得输入的命令,并将其和命令表中的命令进行匹配,然后执行相应的函数。
使用串口进行命令的输入和输出,在输入命令并回车之后,程序解析命令,根据空格将输入分开为命令和参数,对命令进行匹配,匹配到命令之后,执行函数。伪代码如下:
```c
#define TRUE 1
while(TRUE) {                  /* repeat forever */
  type_prompt();               /* display prompt on the screen */
  read_command(command, parameters);   /* read input from terminal */
  execve(command,parameters,0);     /* execute command */
while(TRUE) {                /* repeat forever */
  type_prompt();              /* display prompt on the screen */
  read_command(command, parameters);    /* read input from terminal */
  execve(command, parameters, 0);     /* execute command */
}
```
### 总结

View File

@ -2,7 +2,7 @@
## Newlib
[Newlib](https://sourceware.org/newlib/)是一个由Red Hat公司维护的面向嵌入式设备的开源C标准库实现并且是许多ARM、RISC-V架构交叉编译工具链的默认C标准库版本。
[Newlib](https://sourceware.org/newlib/)是一个由Red Hat公司维护的面向嵌入式设备的开源C标准库实现是许多ARM、RISC-V架构交叉编译工具链的默认C标准库版本。
当XS_USING_LIBC选项打开时XiUOS将使用Newlib提供C标准库函数。Newlib的正常工作依赖于XiUOS内核提供的一系列服务接口这些接口定义在framework/lib/newlib/syscalls.c文件中。关于Newlib标准库函数与服务接口间的依赖关系可以参考[Newlib文档的Syscalls部分](https://sourceware.org/newlib/libc.html#Syscalls)。
@ -14,4 +14,4 @@ XiUOS使用bzip2工具提供对bz2文件格式的支持当文件系统功能
## MicroPhython
敬请期待
敬请期待

View File

@ -46,7 +46,7 @@ enum SensorQuantityType {
};
```
value成员记录与该SensorQuantity相关的值包括结果的小数位数、采集历史的最大值和最小值、国家标准的最大值和最小值、最近一次采集的值。取值时需要注意处理小数点用变量的值除以小数位数乘以10。如果某一个值不存在则为SENSOR_QUANTITY_VALUE_ERROR。
value成员记录与该SensorQuantity相关的值包括结果的小数位数、采集历史的最大值和最小值、国家标准的最大值和最小值、最近一次采集的值。取值时需要注意处理小数点用变量的值除以十的小数位数次幂。如果某一个值不存在则为SENSOR_QUANTITY_VALUE_ERROR。
```c
#define SENSOR_QUANTITY_VALUE_ERROR ((uint32)0xffffffff)
@ -83,7 +83,7 @@ struct SensorDevice {
};
```
name成员记录传感器设备在系统中的名字用于唯一标识一个SensorDevice结构
name成员记录传感器设备在系统中的名字用于唯一标识一个SensorDevice结构
info成员记录传感器设备的一些属性信息包括传感器的采集能力ability、厂家名vendor name与产品型号model name其中ability用一个位图表示该传感器设备可以测量的物理量
@ -202,7 +202,7 @@ int SensorQuantityClose(struct SensorQuantity *quant);
int32 SensorQuantityRead(struct SensorQuantity *quant);
```
在获取数据前需要先获取并打开要使用的物理量,打开后可以随时对传感器数据进行读取,使用完毕必须关闭传感器。完整的使用过程示例如下:
在获取数据前需要先获取并打开要使用的物理量,打开后可以随时对传感器数据进行读取,使用完毕必须关闭传感器。完整的使用过程示例如下:
```c
void Co2Zg09(void)

View File

@ -109,7 +109,7 @@ enum xs_plc_transport{
```
:::tip
注意两者间有对应关系而不是随意组合如S7(STEP 7)只能采用TCP协议而Modbus支持tcp/serial/raw socket/pcap replay,可以定义一个函数检查类型:
注意两者间有对应关系而不是随意组合如S7(STEP 7)只能采用TCP协议而Modbus支持tcp/serial/raw socket/pcap replay可以定义一个函数检查类型:
xs_PlcProtocolCheck(struct xs_PlcDevice*);
:::

View File

@ -47,7 +47,7 @@ struct xs_AdapterInfo{
};
```
ops成员包含统一的、类似文件系统的API用于对网络适配器进行实际的数据读写。在使用一个网络适配器前后需要打开open/关闭close该网络适配器send、receive分别用从网络适配器接收数据与向网络适配器发送数据ioctl用于配置Adapter属性
ops成员包含统一的、类似文件系统的API用于对网络适配器进行实际的数据读写。在使用一个网络适配器前后需要打开open/关闭close该网络适配器send、receive分别用从网络适配器接收数据与向网络适配器发送数据ioctl用于配置Adapter属性
```c
struct xs_AdapterOps {
@ -101,7 +101,7 @@ struct xs_AdapterOps lora_example_ops = {
};
```
填充xs_AdapterLora,并将其注册。
填充xs_AdapterLora并将其注册。
```c
int xs_AdapterRegister(struct xs_Adapter *sadapter);
@ -178,4 +178,4 @@ int ret;
2、去中心化
自组网内无中心节点,节点之间可进行自主路由协商,以此来实现跳转通信,相比传统中心化网络,有效分摊网络流量,进而分散节点运算压力。自组网具有良好的健壮性,任何一个节点发生崩溃,其所承载的传感器会自动寻找其他上传节点,不会造成大面积的掉线事故。
3、不依赖现有网络
节点之间通信,不依赖现有的网络基础设施,自组网内部实现网络自治,以此应对通信地点和时间的不确定性。
节点之间通信,不依赖现有的网络基础设施,自组网内部实现网络自治,以此应对通信地点和时间的不确定性。

View File

@ -2,9 +2,9 @@
## 基本框架
传统嵌入式场景下节点端主要负责数据采集和简单处理复杂的任务放在边缘或者云端完成。而随着嵌入式芯片性能越来越强在端侧承担更多的计算也成了目前的一个趋势比如ST 推出的针对 STM 平台的神经网络加速库 STM32 Cube.AI。最近部分厂商开始在嵌入式平台上引入神经网络加速模块比如 ARM 即将发布的针对嵌入式场景的 Ethos-U55 神经网络处理器,以及 勘智 K210 平台嵌入了一颗卷积网络加速器 KPU使得端侧算力进一步增强从而使我们可以在端侧做更多的计算和任务从而相比传统解决方案有更好的延时、更低的成本。
传统嵌入式场景下,节点端主要负责数据采集和简单处理,复杂的任务放在边缘或者云端完成。而随着嵌入式芯片性能越来越强,在端侧承担更多的计算也成了目前的一个趋势,比如 ST 推出的针对 STM 平台的神经网络加速库 STM32 Cube.AI。最近部分厂商开始在嵌入式平台上引入神经网络加速模块比如 ARM 即将发布的针对嵌入式场景的 Ethos-U55 神经网络处理器,以及 勘智 K210 平台嵌入了一颗卷积网络加速器 KPU使得端侧算力进一步增强从而使我们可以在端侧做更多的计算和任务从而相比传统解决方案有更好的延时、更低的成本。
我们提供了端侧的智能框架,将部分 AI 计算下沉到端侧,可以在端侧完成部分 AI 计算,从而为工业场景下的图像、声音等数据采集和感知提供更丰富的解决方案。比如 对于工业环境下的机械仪表读数识别,我们在初始化时通过边缘或者云端完成仪表数字分析,后续运行中我们在节点端完成仪表指针识别并计算仪表读数,从而在运行中不需要和边缘或者云端通信就可以完成读数识别,提供了更低的延时。
我们提供了端侧的智能框架,将部分 AI 计算下沉到端侧,可以在端侧完成部分 AI 计算,从而为工业场景下的图像、声音等数据采集和感知提供更丰富的解决方案。比如对于工业环境下的机械仪表读数识别,我们在初始化时通过边缘或者云端完成仪表数字分析,后续运行中我们在节点端完成仪表指针识别并计算仪表读数,从而在运行中不需要和边缘或者云端通信就可以完成读数识别,提供了更低的延时。
端侧智能框架基本结构如下:

View File

@ -6,7 +6,7 @@ XiUOS (X Industry Ubiquitous Operating System) 矽璓工业物联操作系统是
XiUOS诞生于浙江省北京大学信息技术高等研究院其研发获得了杭州市萧山区政府的大力支持。萧山是浙江乃至中国的制造业重镇工业基础雄厚正在谋求传统制造业数字化转型升级、实现新旧动能转换寻求工业互联网和物联网等信息技术的助力。XiUOS矽璓工业物联操作系统正是在这样的背景下应运而生希望通过研发的工业物联网软硬件系统为助力促进先进计算技术和工业场景的深度融合助推工业企业的数字化转型是产业应用需求和学术研究计划结合的产物。
关于"矽璓""矽"即硅,"璓"类玉,寓意从沙子到美石的演进升华之路。在开源社区的帮助下,未来矽璓去瑕,玉汝于成。
关于"矽璓""矽"即硅,"璓"类玉,寓意从沙子到美石的演进升华之路。在开源社区的帮助下,未来矽璓去瑕,玉成其事
## 定位
@ -19,7 +19,7 @@ XiUOS是一种工业物联网操作系统目标是通过工业物联网的部
其中,**感** 和 **联** 主要在物联网节点级设备、传感器等设备上实现,**知**
**控** 的核心主要在边缘计算设备和数据中心设备上实现。面向物联网节点级设备的
矽璓工业物联操作系统,主要定位于**感**、**联**和**控**的层次,具备相当的节点级智能将感知获得的数据传递给边缘设备和数据中心设备具有对PLC等的控制能力能对**知**提供支持,如下图所示。
矽璓工业物联操作系统,主要定位于**感**、**联**和**控**的层次,支持接入市面上各种传感器将感知获得的数据传递给边缘设备和数据中心设备具有对PLC等的控制能力能对**知**提供支持,如下图所示。
![IIoT-OS](/images/iiot-os.png)
@ -44,8 +44,7 @@ XiUOS是一种工业物联网操作系统目标是通过工业物联网的部
### 部署
XiUOS是面向工业领域多节点设备的网络化OS其部署主要包括节点端的多节点集
群和边缘端/云端的计算设施,如下图所示。
XiUOS是面向工业领域多节点设备的网络化OS其部署主要包括节点端的多节点集群和边缘端/云端的计算设施,如下图所示。
![XiUOS Deployment](/images/xiuos-deploy.png)

View File

@ -554,7 +554,7 @@ int TestRealtime(int argc, char * argv[])
* XiUOS在RISC-V K210 400MHz CPU主频上中断响应时间为 2.6 us低于sylixos的 3.612 us
* 若进行同等1GHz主频换算K210上的中断响应时间应为 1.016 usXiUOS中断响应的效率比sylixos提高 2.5倍
* 在ARM stm32f407 168MHz CPU主频中断响应时间 11.9 us高于1GHz主频测试的sylixos
* 若进行同等1GHz主频换算,STM32F407上的中断响应时间应为 1.952 usXiUOS的中断响应的效率比sylixos提高 0.8倍
* 若进行同等1GHz主频换算STM32F407上的中断响应时间应为 1.952 usXiUOS的中断响应的效率比sylixos提高 0.8倍
由于XiUOS优化了中断响应的流程减少了执行指令数量因此同等主频条件下中断响应时间更短。

View File

@ -31,11 +31,11 @@ XiUOS 操作系统提供了独特的内存管理分配算法进行内存管理
<span id="mm_heap_static_split"></span>
#### 静态内存划分
静态内存包含2个链表其中每个链表都具有 block_size、total_count、free_count和free_list 这四个属性。
静态内存包含2个链表其中每个链表都具有 block_size、total_count、free_count free_list 这四个属性。
* block_size 记录了当前链表中每个静态内存块的大小
* total_count 记录了系统初始化之后分配给该链表中静态内存块的总个数
* free_count 记录了该链表中还可以分配给用户静态内存块的个数
* free_list 则真正指向各个空闲静态内存块
* free_list 指向各个空闲静态内存块
下图为静态内存链表的具体情况图中包括两个静态链表1和2。静态链表头1指向的内存池中存放的静态内存块的大小都是32字节静态链表头2所指向的内存池中存放的静态内存块的大小都是64字节。此外系统分别配置了静态链表头1和静态链表头2中静态内存块的total_count个数为256和128。因此静态链表头1最多可以响应用户256次的小于32字节的内存请求静态链表头2最多可以响应用户128次的介于33-64字节之间的内存请求一旦对应的静态内存块分配完了系统会向动态内存区域寻求内存空间分配。

View File

@ -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为输出模式并初始化为低电平在while1当中调用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()
## 使用场景
* 在多处理器设备上,多个任务可以并行运行,从而提高处理器的利用率。
* 在一些中断驱动的应用中,如果中断需要处理的工作过于复杂,则可以创建一个任务专门用于处理相关工作,从而改善中断延迟。
* 在一些中断驱动的应用中,如果中断需要处理的工作过于复杂,则可以创建一个任务专门用于处理相关工作,从而改善中断延迟。