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()
返回0-100的值,表示系统使用率
文件系统访问#
1.4 chdir
#
uos.chdir(path)
更改当前目录。
1.5 getcwd
#
uos.getcwd()
获取当前目录。
1.6 ilistdir
#
uos.ilistdir([dir])
此函数返回一个迭代器,然后生成与列出的目录中的条目对应的元组。如果不传参数,它列出了当前目录,否则它列出了dir给出的目录。
元组具有形式(名称,类型,inode [,大小]):
name: 是一个字符串(如果dir是一个字节对象,则为字节),并且是条目的名称;
type: 是一个整数,指定条目的类型,目录为 0x4000,常规文件为 0x8000;
inode: 是对应于文件inode的整数,对于没有这种概念的文件系统可以是0。
某些平台可能会返回包含条目大小的4元组。对于文件条目,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单位中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`,因为它们在特定于硬件的实现中不可用。
1.14 sync
#
uos.sync()
同步所有文件系统。
终端重定向和复制#
1.15 dupterm
#
uos.dupterm(stream_object, index = 0)
在给定的stream
类对象上复制或切换MicroPython终端(REPL)。 stream_object参数必须实现readinto()
和write()
方法。流应处于非阻塞模式,如果没有可用于读取的数据,readinto()
应返回’None`。
调用此函数后,将在此流上重复所有终端输出,并且流上可用的任何输入都将传递到终端输入。
index参数应为非负整数,并指定设置的复制槽。给定端口可以实现多个槽(槽0将始终可用),并且在这种情况下,终端输入和输出在所有设置的槽上复制。
如果None
作为stream_object传递,则在索引给出的槽上取消复制。
该函数返回给定槽中的前一个类似流的对象。
2. 例程#
2.1 例程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.2 例程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')