測試環境
開發板: NK-980IOT V1.0 的開發板
rt-thread 版本:4.1.1
IDE:keil + env
啟用 posix
首先,啟用 DFS:”RT-Thread Components” -> “DFS: device virtual file system” 。進入子菜單,選擇
“Using posix-like functions, open/read/write/close”
“ Using devfs for device objects”
其它項可以取消選擇。
然后進入 “RT-Thread Components” -> “C/C++ and POSIX layer” -> “POSIX (Portable Operating System Interface) layer” 子菜單項,選擇
“Enable POSIX file system and I/O”
“Enable I/O Multiplexing select() “
“Enable Terminal I/O “
其它項可以取消選擇。
測試
我們繼續使用 rt-thread 驅動篇 之 serialX 全網公測 提供的測試方案,但是把里面的讀寫 API 改一改,rt_device_open 改成 open,rt_device_read 改成 read,rt_device_write 改成 write,rt_device_close 改成 close。
我們知道, open/read/write/close 分別對應調用 dfs_file_(open/read/write/close) 進而調用 struct dfs_file_ops 結構體中定義的 open/read/write/close 接口。在串口驅動框架里就是 serial_fops_(open/read/write/close) 等幾個函數。
serial_fops_open
需要說明的是,我們只能選擇“中斷”或者“DMA”中的一種模式了。另外,除了 O_RDONLY O_WRONLY O_RDWR 三種讀寫標志,還可以支持 O_NONBLOCK ,它等于 RT_DEVICE_OFLAG_NONBLOCKING。
serial_fops_read
原來的實現有如下一個 while 循環,這個循環的本意是:非阻塞模式下,如果沒有 read 到數據返回 -EAGAIN 錯誤值,告知應用層無數據并可以再次讀;阻塞模式下,如果沒有 read 到數據將等待工作隊列而掛起線程。
do
{
size = rt_device_read(device, -1, buf, count);
if (size <= 0)
{
if (fd- >flags & O_NONBLOCK)
{
size = -EAGAIN;
break;
}
rt_wqueue_wait(&(device- >wait_queue), 0, RT_WAITING_FOREVER);
}
}while (size <= 0);
這和原來 serialX 的阻塞模式概念是一致的,如此一來,我們發現阻塞模式時 rt_device_read 先阻塞了,并不會走到 if 條件語句塊內。
flush 概念
大家一定知道,flush 支持是 serialX 獨有的,v1 v2 沒有這個。當我們開啟 posix 之后,發現 dfs 實現了一個函數 fsync ,同時還有一個 dfs_file_flush 函數,以及 struct dfs_file_ops 也定義了 flush 接口。只是在之前的版本里這個都沒有實現。于是,我們對 “serialX.c” 做如下修改
找到 const static struct dfs_file_ops _serial_fops = 變量定義代碼行,將 RT_NULL, /* flush / 修改為 serial_fops_flush, / flush */ 。然后在上面添加 serial_fops_flush 函數實現:
static int serial_fops_flush(struct dfs_fd *fd)
{
rt_device_t device;
device = (rt_device_t)fd->data;
return rt_device_flush(device);
}
瞧,serialX 的 flush 和 dfs 的 flush 以及 posix 的 fsync 銜接起來了。
select io 復用
之前設計的測試方案里,只有回環測試改動比較大。這里我們使用 select 這個高級的用法,監聽是否有數據。
用這種方式,我們可以同時監聽多個串口設備了。或者說,一個線程“同時”讀多個串口設備。
termios
開啟了 posix ,串口設備修改波特率、數據位等需要使用 termios。這部分的問題留待下一篇 libmodbus 部分詳說。
總結
啟用了 posix 后我們發現,posix 是在原來的設備驅動框架基礎上套的一層殼。增加了函數調用跳轉次數。如果沒有必要的理由,還是不啟用 posix 了。
-
C++語言
+關注
關注
0文章
147瀏覽量
6992 -
Posix
+關注
關注
0文章
36瀏覽量
9497 -
RT-Thread
+關注
關注
31文章
1289瀏覽量
40129 -
DFS
+關注
關注
0文章
26瀏覽量
9164 -
FreeModbus
+關注
關注
0文章
16瀏覽量
4470
發布評論請先 登錄
相關推薦
評論