modify fs.md humancompter.md tmr.md

This commit is contained in:
Yan_yan 2020-11-27 17:54:04 +08:00
parent 10fd854116
commit 27a4e38b1e
3 changed files with 37 additions and 37 deletions

View File

@ -5,10 +5,10 @@
在物联网领域主要使用的存储设备为FLASH所以可以选择Jffs2等适合FLASH特性的日志型文件系统FATFS由于其同时兼容Linux和Windows选择其作为文件系统便于在“端”、“边”、“云”之间以统一的格式交互和保存数据。Ext4作为业内用户使用较多的文件系统也可以将其轻量级的版本应用于物联网领域。
XiUOS研发计划支持FATFSJffs2LWext4三种文件系统.XiUOS 1.0版本只支持FATFS。为了增强兼容性和支持VFS的特性XiUOS通过设计IoT-VFS的构件为用户提供了树形的文件组织结构。当前版本的IoT-VFS在功能上保证了FATFS的VFS特性同时允许用户使用统一的VFS的接口来操作设备。IoT-VFS具有以下特性
* 统一采用UNIX风格路径格式目录与文件层级清晰分明
* 面向用户提供POSIX文件接口降低应用程序移植难度
* 可以在任意路径挂载不同文件系统,并且可以便捷地添加对新的文件系统的支持
XiUOS研发计划支持FATFSJffs2LWext4三种文件系统,目前XiUOS 1.0版本只支持FATFS。为了增强兼容性和支持VFS的特性XiUOS通过设计IoT-VFS的构件为用户提供了树形的文件组织结构。当前版本的IoT-VFS在功能上保证了FATFS的VFS特性同时允许用户使用统一的VFS的接口来操作设备。IoT-VFS具有以下特性
* 统一采用UNIX风格路径格式目录与文件层级清晰分明
* 面向用户提供POSIX文件接口降低应用程序移植难度
* 可以在任意路径挂载不同文件系统,并且可以便捷地添加对新的文件系统的支持
在IoT-VFS的支持下应用程序开发者无须了解底层文件系统的接口细节只需使用标准POSIX文件接口进行应用开发。对于已有的POSIX应用程序也可以直接进行源代码级别的移植。使用IoT-VFS的应用程序架构如下图所示。
@ -25,7 +25,7 @@ int xs_MountFilesystem(const char *device_name,
enum xs_FilesystemType fs_type, const char *path);
```
该函数用于将指定设备上的物理文件系统挂载到指定路径。若挂载成功则返回0若失败则返回对应错误码。
该函数用于将指定设备上的物理文件系统挂载到指定路径若挂载成功返回0失败返回对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -37,7 +37,7 @@ int xs_MountFilesystem(const char *device_name,
int xs_UnmountFileSystem(const char *path);
```
该函数用于卸载指定路径上挂载的文件系统。若卸载成功则返回0若失败则返回对应错误码。
该函数用于卸载指定路径上挂载的文件系统若卸载成功返回0失败返回对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -49,7 +49,7 @@ int xs_UnmountFileSystem(const char *path);
int open(const char *path, int flags, ...);
```
该函数用于打开一个文件。若文件打开成功则返回该文件的描述符(非负),后续读写该文件由该描述符标识若不成功则返回-1此时errno会被置为对应错误码。在打开文件时可以指定打开选项即flags参数。可选的选项有打开时截断文件O_TRUNC和向末尾写入O_APPEND
该函数用于打开一个文件。若文件打开成功则返回该文件的描述符(非负),后续读写该文件由该描述符标识若不成功则返回-1此时errno会被置为对应错误码。在打开文件时可以指定打开选项即flags参数。可选的选项有打开时截断文件O_TRUNC和向末尾写入O_APPEND
| 参数 | 描述 |
| --- | --- |
@ -60,7 +60,7 @@ int open(const char *path, int flags, ...);
int close(int fd);
```
该函数用于关闭一个已打开的文件。若文件关闭成功则返回0若不成功则返回-1此时errno会被置为对应错误码。
该函数用于关闭一个已打开的文件。若文件关闭成功则返回0若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -70,7 +70,7 @@ int close(int fd);
int read(int fd, void *buf, size_t len);
```
该函数用于从文件读取数据。若读取成功则返回读取到的字节数若不成功则返回-1此时errno会被置为对应错误码。
该函数用于从文件读取数据。若读取成功则返回读取到的字节数若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -82,7 +82,7 @@ int read(int fd, void *buf, size_t len);
int write(int fd, const void *buf, size_t len);
```
该函数用于向文件写入数据。若写入成功则返回读取到的字节数若不成功则返回-1此时errno会被置为对应错误码。
该函数用于向文件写入数据。若写入成功则返回读取到的字节数若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -94,7 +94,7 @@ int write(int fd, const void *buf, size_t len);
off_t lseek(int fd, off_t offset, int whence);
```
该函数用于重定位文件读写指针。若重定位成功则返回新的读写指针位置,即距离文件起始处的字节数若不成功则返回-1此时errno会被置为对应错误码。
该函数用于重定位文件读写指针。若重定位成功则返回新的读写指针位置,即距离文件起始处的字节数若不成功则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -106,7 +106,7 @@ off_t lseek(int fd, off_t offset, int whence);
int rename(const char *from, const char *to);
```
该函数用于重命名文件。若重命名成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于重命名文件。若重命名成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -117,7 +117,7 @@ int rename(const char *from, const char *to);
int unlink(const char *path);
```
该函数用于删除一个文件。若删除成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于删除一个文件。若删除成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -127,7 +127,7 @@ int unlink(const char *path);
int stat(const char *path, struct stat *buf);
```
该函数用于获取文件的元数据。stat结构与POSIX定义相同。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于获取文件的元数据。stat结构与POSIX定义相同。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -138,7 +138,7 @@ int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
```
该函数用于获取文件的元数据。stat结构与POSIX定义相同。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于获取文件的元数据。stat结构与POSIX定义相同。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -149,7 +149,7 @@ int fstat(int fd, struct stat *buf);
int fsync(int fd);
```
该函数用于将指定文件数据写回存储设备从而防止系统掉电数据丢失。若写回成功则返回0;若失败则返回-1此时errno会被置为对应错误码。
该函数用于将指定文件数据写回存储设备从而防止系统掉电数据丢失。若写回成功则返回0失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -159,7 +159,7 @@ int fsync(int fd);
int ftruncate(int fd, off_t length);
```
该函数用于将文件截断至指定长度。若截断成功则返回0;若失败则返回-1此时errno会被置为对应错误码。
该函数用于将文件截断至指定长度。若截断成功则返回0失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -170,7 +170,7 @@ int ftruncate(int fd, off_t length);
int mkdir(const char *path, mode_t mode);
```
该函数用于创建一个目录。若创建成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于创建一个目录。若创建成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -181,7 +181,7 @@ int mkdir(const char *path, mode_t mode);
DIR *opendir(const char *path);
```
该函数用于打开一个目录。若打开成功则返回一个目录句柄若失败则返回XS_NULL。
该函数用于打开一个目录。若打开成功则返回一个目录句柄若失败则返回XS_NULL。
| 参数 | 描述 |
| --- | --- |
@ -191,7 +191,7 @@ DIR *opendir(const char *path);
int closedir(DIR *dirp);
```
该函数用于关闭一个已打开的目录。若关闭成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于关闭一个已打开的目录。若关闭成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -201,7 +201,7 @@ int closedir(DIR *dirp);
struct dirent *readdir(DIR *dirp);
```
该函数用于读取目录的目录项。目录项由dirent结构表示目前该结构仅包含文件或目录的类型d_kind与名称d_name。若读取成功则返回一个dirent指针若读取失败则返回XS_NULL此时errno会被置为对应错误码。
该函数用于读取目录的目录项。目录项由dirent结构表示目前该结构仅包含文件或目录的类型d_kind与名称d_name。若读取成功则返回一个dirent指针若读取失败则返回XS_NULL此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -211,7 +211,7 @@ struct dirent *readdir(DIR *dirp);
int rmdir(const char *path);
```
该函数用于删除一个目录。若删除成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于删除一个目录。若删除成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -221,7 +221,7 @@ int rmdir(const char *path);
int chdir(const char *path);
```
该函数用于切换当前工作目录。若切换成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于切换当前工作目录。若切换成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -231,7 +231,7 @@ int chdir(const char *path);
char *getcwd(char *buf, size_t size);
```
该函数用于获取当前的工作目录。若获取成功则返回工作目录字符串与buf参数相同;若失败则返回XS_NULL此时errno会被置为对应错误码。
该函数用于获取当前的工作目录。若获取成功则返回工作目录字符串与buf参数相同,若失败则返回 XS_NULL此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -252,7 +252,7 @@ void rewinddir(DIR *dirp);
long telldir(DIR *dirp);
```
该函数用于获取目录的读取位置即下一个readdir返回目录项的位置。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于获取目录的读取位置即下一个readdir返回目录项的位置。若获取成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |
@ -262,7 +262,7 @@ long telldir(DIR *dirp);
void seekdir(DIR *dirp, off_t offset);
```
该函数用于设置目录的读取位置即下一个readdir返回目录项的位置。若设置成功则返回0若失败则返回-1此时errno会被置为对应错误码。
该函数用于设置目录的读取位置即下一个readdir返回目录项的位置。若设置成功则返回0若失败则返回-1此时errno会被置为对应错误码。
| 参数 | 描述 |
| --- | --- |

View File

@ -14,11 +14,11 @@
shell的运行过程
* 在命令行输入命令
* shell对命令进行解析
* 执行相应的操作
* 执行相应的操作
建立一个命令与函数的一一对应的关系,定义结构体。
根据定义建立一个表,将所有的命令以及对应的函数进行声明
获得输入的命令,并将其和命令表中的命令进行匹配,然后执行相应的函数
获得输入的命令,并将其和命令表中的命令进行匹配,然后执行相应的函数
使用串口进行命令的输入和输出,在输入命令并回车之后,程序解析命令,根据空格将输入分开为命令和参数,对命令进行匹配,匹配到命令之后,执行函数。伪代码如下:
```c
@ -26,17 +26,17 @@ shell的运行过程
while(TRUE) {                  /* repeat forever */
  type_prompt();               /* display prompt on the screen */
  read_command(command,parameters);    /* read input from terminal */
  read_command(command, parameters);   /* read input from terminal */
  execve(command,parameters,0);     /* execute command */
}
```
### 总结
与linux的bash、csh 等相比,我们实现的tshell比较简洁不能执行shell脚本没有编写完整解释器的缘故,不支持正则表达式等高端的功能。优点是资源占用率低,对串口的兼容性较好。
与linux的bash、csh 等相比,我们实现的 tshell 比较简洁目前不兼容shell 脚本。由于没有编写完整解释器的缘故,不支持正则表达式等高端的功能。优点是资源占用率低,对串口的兼容性较好。
## LittlevGL
随着智能家用电器、智能手环、手表等物联网智能设备的普及嵌入式系统对GUI的界面需求也越来越高。基于此背景XiUOS集成了开源图形库LittlevGL开发框架提供创建嵌入式GUI所需的一切。目前XiUOS已经支持KD233开发板。
随着智能家、智能手环、手表等物联网智能设备的普及嵌入式系统对GUI的界面需求也越来越高。基于此背景XiUOS集成了开源图形库LittlevGL开发框架提供创建嵌入式GUI所需的一切。目前XiUOS已经支持KD233开发板。
LittlevGL是一个基于MIT协议的免费开源图形库具有易于使用的图形元素、漂亮的视觉效果和低内存占用它支持常用的控件如按钮、图表、列表、滑块、图像等并且支持触摸、鼠标、键盘等多种输入方式。更多特性访问官方网址[https://littlevgl.com/](https://littlevgl.com/)。

View File

@ -11,20 +11,20 @@
## 简介
每一个操作系统都需要一个时钟计数,提供“心跳”计数,该时钟可以提供系统处理所有和时钟相关的事件。
XiUOS的“心跳”通过芯片提供的硬件定时器产生的周期性中断进行计数XiUOS可以在menuconfig界面进行配置,配置单位为毫秒。
配置界面如下
XiUOS的“心跳”通过芯片提供的硬件定时器产生的周期性中断进行计数XiUOS可以在menuconfig界面进行配置配置单位为毫秒。
配置界面如下
<img src="./imagesrc/tmr_config.png" width="100%"/>
界面中的数值将配置给变量XS_TICK_PER_SECOND,该变量解释为每秒钟支持的节拍数tick。例如XS_TICK_PER_SECOND
界面中的数值将配置给变量 XS_TICK_PER_SECOND该变量解释为每秒钟支持的节拍数tick。当 XS_TICK_PER_SECOND
配置为100则tick节拍表示10毫秒即一个时间片timeslice为10毫秒。
节拍配置成功后系统支持的调度算法、软件定时器等依赖于该时钟周期服务的事件就可以正常工作了。例如在XiUOS支持的时间片轮转算法当中每进行的一次线程切换为10个tick。
节拍配置成功后系统支持的调度算法、软件定时器等依赖于该时钟周期服务的事件就可以正常工作了。例如在XiUOS支持的时间片轮转算法当中每进行的一次线程切换为10个tick。
节拍计数执行流程如下图所示
节拍计数执行流程如下图所示
<img src="./imagesrc/tmr_process.png" width="100%"/>
在每一个定时器中断到来时进行常规的中断执行流定时器按照每一个tick单位进行触发中断在中断服务程序当中进行自增并对当前运行线程的时间片进行计算同步可处理定时器的计数时间。
在每一个定时器中断到来时,系统进行常规的中断执行流定时器按照每一个tick单位进行触发中断在中断服务程序当中进行自增并对当前运行线程的时间片进行计算同步可处理定时器的计数时间。
<span id="func_api"></span>