1.5 uos
– 基本操作系统服务#
该模块提供了部分 CPython 操作系统模块的功能子集。有关详细信息,请参阅原始 CPython 文档:os。
uos
模块包含用于文件系统的访问与挂载、终端重定向与复制,以及诸如 uname
和 urandom
等系统信息和随机数生成函数。
1. 函数#
基础功能#
1.1 uname
#
uos.uname()
返回一个包含有关底层机器及其操作系统信息的元组。该元组包含以下五个字段,每个字段均为字符串:
sysname
– 底层操作系统名称。nodename
– 节点名称(可能与sysname
相同)。release
– 操作系统的版本号。version
– MicroPython 版本及构建日期。machine
– 硬件标识符(如主板型号、CPU 类型等)。
1.2 urandom
#
uos.urandom(n)
生成并返回包含 n
个随机字节的字节对象。随机字节尽可能由硬件随机数生成器提供。
1.3 cpu_usage
#
uos.cpu_usage()
返回当前系统 CPU 的使用率,范围为 0
到 100
。
文件系统操作#
1.4 chdir
#
uos.chdir(path)
更改当前工作目录。
1.5 getcwd
#
uos.getcwd()
获取当前工作目录的路径。
1.6 ilistdir
#
uos.ilistdir([dir])
返回指定目录(或当前目录)的条目信息。该函数生成一个元组迭代器,其中每个元组的形式为 (name, type, inode [, size])
。
name
:条目名称,字符串类型。type
:条目类型,目录为0x4000
,普通文件为0x8000
。inode
:文件系统的 inode 值,对于不支持 inode 的文件系统则为0
。size
(可选):文件大小,若无法获取则为-1
。
1.7 listdir
#
uos.listdir([dir])
列出指定目录中的所有条目。如果未指定目录,则列出当前目录。
1.8 mkdir
#
uos.mkdir(path)
在指定路径创建一个新目录。
1.9 remove
#
uos.remove(path)
删除指定路径的文件。
1.10 rmdir
#
uos.rmdir(path)
删除指定路径的目录。
1.11 rename
#
uos.rename(old_path, new_path)
重命名指定路径的文件或目录。
1.12 stat
#
uos.stat(path)
返回指定路径的文件或目录的状态信息。
1.13 statvfs
#
uos.statvfs(path)
获取指定路径文件系统的状态,返回一个元组,包含以下字段:
f_bsize
– 文件系统块大小。f_frsize
– 片段大小。f_blocks
– 文件系统总大小,以f_frsize
为单位。f_bfree
– 空闲块数。f_bavail
– 非特权用户可用的空闲块数。f_files
– inode 总数。f_ffree
– 可用 inode 数量。f_favail
– 非特权用户可用的 inode 数量。f_flag
– 挂载标志。f_namemax
– 最大文件名长度。
1.14 sync
#
uos.sync()
同步所有文件系统,将挂起的写操作写入存储设备。
1.15 dupterm
#
uos.dupterm(stream_object, index = 0)
在指定的 stream
对象上复制或切换 MicroPython 终端(REPL)。stream_object
必须实现 readinto()
和 write()
方法。stream
应以非阻塞模式运行,readinto()
在没有可读数据时应返回 None
。
调用后,所有终端输出将被复制到该流对象,同时该流上提供的任何输入也将被传递到终端。index
参数应为非负整数,指定要设置的复制槽。
如果 stream_object
为 None
,则取消指定槽的终端复制。
返回先前在指定槽中的流对象。
2. 使用示例#
示例 1:基于 FAT 文件系统的块设备实现
以下示例使用 bytearray
在 RAM 中模拟块设备,并基于 FAT32 文件系统进行操作:
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: # 获取块数
return len(self.data) // self.block_size
if op == 5: # 获取块大小
return self.block_size
或:
import uos
bdev = RAMBlockDev(512, 50)
uos.VfsFat.mkfs(bdev)
vfs = uos.VfsFat(bdev)
uos.mount(vfs, '/ramdisk')
示例 2:基于 SPIFFS 文件系统的块设备实现
以下示例在 RAM 中模拟 SPIFFS 文件系统的块设备:
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
使用 SPIFFS 文件系统挂载该块设备:
blkdev = RAMFlashDev()
vfs = uos.VfsSpiffs(blkdev)
vfs.mkfs(vfs)
uos.mount(vfs, '/ramdisk')