# uos – 基本的“操作系统”服务
该模块实现了相应CPython模块的子集,如下所述。有关更多信息,请参阅原始CPython文档:[os](https://docs.python.org/3.5/library/os.html#module-os)。
`uos`模块包含用于文件系统访问和挂载,终端重定向和复制以及`uname`和`urandom`等函数。
## 1\. 常用函数
### 1.1. 返回一个元组(可能是一个命名了的元组),其中包含有关底层机器和/或其操作系统的信息。元组按以下顺序有五个字段,每个字段都是一个字符串:
```
uos.uname()
```
* sysname - 底层系统的名称
* nodename - 节点名(/板子名称)(可以与sysname相同)
* release - 底层系统的版本
* version - MicroPython版本和构建日期
* machine - 底层硬件的标识符(例如,板,CPU)
### 1.2. 返回一个包含n个随机字节的字节对象。只要有可能,它就由硬件随机数生成器生成。
```
uos.urandom(n)
```
## 2\. 文件系统访问
### 2.1. 更改当前目录。
```
uos.chdir(path)
```
### 2.2. 获取当前目录。
```
uos.getcwd()
```
### 2.3. 此函数返回一个迭代器,然后生成与列出的目录中的条目对应的元组。如果不传参数,它列出了当前目录,否则它列出了dir给出的目录。
```
uos.ilistdir([dir])
```
元组具有形式(名称,类型,inode \[,大小\]):
* name: 是一个字符串(如果dir是一个字节对象,则为字节),并且是条目的名称;
* type: 是一个整数,指定条目的类型,目录为 0x4000,常规文件为 0x8000;
* inode: 是对应于文件inode的整数,对于没有这种概念的文件系统可以是0。
* 某些平台可能会返回包含条目大小的4元组。对于文件条目,size是表示文件大小的整数,如果未知则为-1。目前条目的含义目前尚未定义。
### 2.4. 如果没有参数,请列出当前目录。否则列出给定目录。
```
uos.listdir([dir])
```
### 2.5. 创建一个新目录。
```
uos.mkdir(path)
```
### 2.6. 删除文件。
```
uos.remove(path)
```
### 2.7. 删除目录。
```
uos.rmdir(path)
```
### 2.8. 重命名文件。
```
uos.rename(old_path,new_path)
```
### 2.9. 获取文件或目录的状态。
```
uos.stat(path)
```
### 2.10. 获取文件系统的状态。
```
uos.statvfs(path)
```
按以下顺序返回包含文件系统信息的元组:
* f\_bsize - 文件系统块大小
* f\_frsize - 片段大小
* f\_blocks - f\_frsize单位中fs的大小
* f\_bfree - 空闲块数
* f\_bavail - 无特权用户的空闲块数
* f\_files - inode数量
* f\_ffree - 免费inode的数量
* f\_favail - 无特权用户的免费inode数
* f\_flag - 挂载标志
* f\_namemax - 最大文件名长度
与inode相关的参数:`f_files`,`f_ffree`,`f_avail`和`f_flags`参数可能返回'0`,因为它们在特定于硬件的实现中不可用。
### 2.11. 同步所有文件系统。
```
uos.sync()
```
## 3\. 终端重定向和复制
### 3.1. 在给定的`stream`类对象上复制或切换MicroPython终端(REPL)。
```
uos.dupterm(stream_object,index = 0)
```
stream\_object参数必须实现`readinto()`和`write()`方法。流应处于非阻塞模式,如果没有可用于读取的数据,`readinto()`应返回'None`。
调用此函数后,将在此流上重复所有终端输出,并且流上可用的任何输入都将传递到终端输入。
index参数应为非负整数,并指定设置的复制槽。给定端口可以实现多个槽(槽0将始终可用),并且在这种情况下,终端输入和输出在所有设置的槽上复制。
如果`None`作为stream\_object传递,则在索引给出的槽上取消复制。
该函数返回给定槽中的前一个类似流的对象。
## 4\. 文件系统挂载
某些端口提供虚拟文件系统(VFS)以及在此VFS中安装多个“真实”文件系统的功能。文件系统对象可以安装在VFS的根目录中,也可以安装在根目录中的子目录中。这允许Python程序看到的文件系统的动态和灵活配置。具有此功能的端口提供`mount()`和`umount()`函数,以及可能由VFS类表示的各种文件系统实现。
### 4.1. 将文件系统对象fsobj挂载到mount\_point字符串指定的VFS中的位置。
```
uos.mount(fsobj,mount_point,*,readonly)
```
fsobj可以是一个具有`mount()`方法或块设备的VFS对象。如果它是块设备,则会自动检测文件系统类型(如果未识别文件系统,则会引发异常)。 mount\_point可以是'/'在根目录下挂载fsobj,或者'/'挂载到根目录下的子目录中。
如果readonly为“True”,则文件系统以只读方式挂载。
在mount过程中,在文件系统对象上调用`mount()`方法。
如果mount_point已经挂载,将引发`OSError(EPERM)`。
### 4.2. 卸载文件系统。 mount_point可以是命名安装位置的字符串,也可以是先前安装的文件系统对象。
```
uos.umount(mount_point)
```
在卸载过程中,在文件系统对象上调用方法`umount()`。
如果找不到mount_point,会引发`OSError(EINVAL)`。
### 4.3.创建使用FAT文件系统格式的文件系统对象。
```
class uos.VfsFat(block_dev)
```
FAT文件系统的存储由block\_dev提供。可以使用`mount()`挂载由此构造函数创建的对象。
#### 在block_dev上构建FAT文件系统。
```
static mkfs(block_dev)
```
## 5\. 文件系统格式化
在MaixPy中,我们提供了对flash进行文件系统格式化的操作。如果用户想要清空flash文件系统那么可以使用该接口`flash_format`来实现
### 5.1. 该接口不需要传入参数,直接使用将对开发板的 flash 进行格式化。
```
uos.flash_format()
```
请注意,格式化将清空所有文件,在使用前请确认 flash 中文件都是需要删除的
## 6\. 块设备
块设备是实现块协议的对象,块协议是由`AbstractBlockDev`类在下面描述的一组方法。该类的具体实现通常允许访问类似存储器的功能作为硬件(如闪存)。特定文件系统驱动程序可以使用块设备来存储其文件系统的数据。
### 6.1. 构造块设备对象。构造函数的参数取决于特定的块设备。
```
class uos.AbstractBlockDev()
```
#### 从索引block_num给出的块开始,将块从设备读入buf(字节数组)。
```
readblocks(block_num, buf)
```
要读取的块数由buf的长度给出,该长度将是块大小的倍数。
####从索引block_num给出的块开始,将buf(字节数组)中的块写入设备。
```
writeblocks(block_num, buf)
```
要写入的块数由buf的长度给出,该长度将是块大小的倍数。
#### 控制块设备并查询其参数。要执行的操作由op给出,它是以下整数之一:
```
ioctl(op, arg)
```
* 1 - 初始化设备(arg未使用)
* 2 - 关闭设备(arg未使用)
* 3 - 同步设备(arg未使用)
* 4 - 获取块数的计数,应该返回一个整数(arg未使用)
* 5 - 获取块中的字节数,应该返回一个整数,或者“None”,在这种情况下使用默认值512(arg未使用)
### 6.2. 例程
#### 例程1
以fat32举例,下面的类将实现一个块设备,它使用`bytearray`将其数据存储在RAM中:
~~~
class RAMBlockDev:
def __init__(self, block_size, num_blocks):
self.block_size = block_size
self.data = bytearray(block_size * num_blocks)
def readblocks(self, block_num, buf):
for i in range(len(buf)):
buf[i] = self.data[block_num * self.block_size + i]
def writeblocks(self, block_num, buf):
for i in range(len(buf)):
self.data[block_num * self.block_size + i] = buf[i]
def ioctl(self, op, arg):
if op == 4: # get number of blocks
return len(self.data) // self.block_size
if op == 5: # get block size
return self.block_size
~~~
或者:
~~~
import uos
bdev = RAMBlockDev(512, 50)
uos.VfsFat.mkfs(bdev)
vfs = uos.VfsFat(bdev)
uos.mount(vfs, '/ramdisk')
~~~
#### 例程2
以spiffs举例,下面的类将实现一个块设备,它使用`bytearray`将其数据存储在RAM中:
~~~
class RAMFlashDev:
def __init__(self):
self.fs_size = 256*1024
self.fs_data = bytearray(256*1024)
self.erase_block = 32*1024
self.log_block_size = 64*1024
self.log_page_size = 4*1024
def read(self,buf,size,addr):
for i in range(len(buf)):
buf[i] = self.fs_data[addr+i]
def write(self,buf,size,addr):
for i in range(len(buf)):
self.fs_data[addr+i] = buf[i]
def erase(self,size,addr):
for i in range(size):
self.fs_data[addr+i] = 0xff
~~~
~~~
blkdev = RAMFlashDev.RAMFlashDev()
vfs = uos.VfsSpiffs(blkdev)
vfs.mkfs(vfs)
uos.mount(vfs,'/ramdisk')
~~~
- 简介
- 关于MixPY
- 准备
- MixPY_函数库
- MicroPython标准库
- gc _控制垃圾回收器
- math_数学函数
- sys_系统相关函数
- ubinascii _ 二进制/ ASCII转换
- ucollections_集合和容器类型
- uerrno _系统错误代码
- uheapq_ 堆队列算法
- ujson_JSON编码与解码
- uos _基本的“操作系统”服务
- ure_正则表达式
- MixPY_特定函数
- lcd_显示驱动
- lcd_范例
- sensor_感光元件
- sensor_范例
- image_机器视觉
- image_函数
- HaarCascade 类_特征描述符
- Similarity 类_相似度对象
- Histogram 类_直方图对象
- Percentile 类_百分比值对象
- Threhsold 类_阈值对象
- Statistics 类_统计数据对象
- Blob 类_色块对象
- Line 类_直线对象
- Circle 类_圆形对象
- Rect 类_矩形对象
- QRCode 类_ 二维码对象
- AprilTag 类_AprilTag对象
- DataMatrix 类_数据矩阵对象
- BarCode 类_条形码对象
- Displacement 类_位移对象
- Kptmatch 类_特征点对象
- ImageWriter 类_ImageWriter对象
- ImageReader 类_ImageReader对象
- Image 类_图像对象
- touchscreen_触摸屏幕
- touchscreen_范例
- video_视频
- video_范例
- audio_音频
- audio_范例
- nes_游戏模拟器
- nes_范例
- machine_板级功能
- I2C_总线协议
- I2C_范例
- PWM_脉宽调制
- PWM_范例
- SPI_同步串行协议
- SPI_范例
- Timer_硬件定时器
- Timer_范例
- UART_异步串口
- UART_范例
- network_网卡驱动
- network_范例
- Maix_功能库
- FPIOA_可编程 IO 阵列
- FPIOA_范例
- GPIO_通用输入/输出
- GPIO_范例
- I2S_驱动I2S设备
- I2S_范例
- freq_频率模块
- freq_范例
- FFT_傅里叶运算
- FFT_范例
- KPU_神经网络处理器
- KPU_范例