# 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_范例