在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

serialX的posix接口測試

冬至子 ? 來源:出出啊 ? 作者:出出啊 ? 2023-10-13 10:30 ? 次閱讀

測試環境

開發板: 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
    DFS
    +關注

    關注

    0

    文章

    26

    瀏覽量

    9164
  • FreeModbus
    +關注

    關注

    0

    文章

    16

    瀏覽量

    4470
收藏 人收藏

    評論

    相關推薦

    rt-thread 驅動篇(六)serialX弊端及解決方法

    serialX 作為一個非阻塞串口驅動框架,在遇到一些異常時,需要做一些特殊處理,今天,筆者帶大家來扒一扒 serialX 使用過程中需要注意哪些問題。
    的頭像 發表于 06-20 11:43 ?3545次閱讀

    請問rtthread的外設驅動為什么不實現posix接口

    外設驅動想支持posix接口,如select\\poll、read、write、ioctl,希望能支持異步通知、輪詢、batch設置功能。但是rtthread在通過
    發表于 07-15 06:34

    在RT-Thread中使用POSIX Threads接口

    POSIX Threads簡稱Pthreads,POSIX是"Portable Operating System Interface"(可移植操作系統接口) 的縮寫,POSIX
    發表于 08-12 15:02

    嘗試一下在freemodbus里使用serialX

    接口中的每一個函數的功能。完全按照每一個函數功能定義去做,后面的事情就是水到渠成的。花了小半天的時間從 drv_uart.c 改成 drv_uartX.c 。然后使用 serialX 中提供的 測試
    發表于 02-13 15:09

    測試serialXposix支持詳解

    看看有什么問題,然后發現困難重重,于是退而求其次,先測試 serialXposix 接口測試環境開發板: NK-980IOT V1.
    發表于 02-14 11:29

    淺析基于serialX串口驅動移植libmodbus

    詳細比對,libmodbus 打開串口設備后使用 termios 配置串口設備的波特率數據位等。而筆者上次在測試 posix 接口時使用的默認配置,并沒有修改波特率。為了驗證并跟蹤問題位置,筆者在
    發表于 02-15 11:07

    嵌入式軟件使用POSIX接口的優缺點

    POSIX既然是可移植操作系統接口,那基于該接口的應用程序可移植性自然是很高的。基于POSIX接口設計的應用程序可以在不做修改或僅做極少量的
    發表于 11-14 08:45 ?5628次閱讀

    posix是什么

    POSIX表示可移植操作系統接口POSIX標準定義了操作系統應該為應用程序提供的接口標準,是IEEE為要在各種UNIX操作系統上運行的軟件而定義的一系列API標準的總稱,其正式稱呼為
    發表于 11-14 15:09 ?1.1w次閱讀
    <b class='flag-5'>posix</b>是什么

    Linux信號量(2):POSIX 信號量

    存儲)置于可選部分中。在 SUSv4 之前,POSIX 信號量接口已經被包含在信號量選項中。在 SUSv4 中,這些接口被移至了基本規范,而消息隊列和共享存儲接口依然是可選的。
    的頭像 發表于 10-29 17:34 ?716次閱讀

    RT-Thread 4.1.0中POSIX淵源介紹

    可移植操作系統接口POSIX 標準定義了操作系統(很多時候針對的是類 Unix 操作系統)應該為應用程序提供的接口標準,從而保證了應用程序在源碼層次的可移植性,如今主流的 Linux 系統都做
    的頭像 發表于 04-27 10:22 ?1808次閱讀

    RT-Thread 大會:POSIX簡介和使用

    可移植操作系統接口POSIX標準定義了操作系統(很多時候針對的是類Unix操作系統)應該為應用程序提供的接口標準,從而保證了應用程序在源碼層次的可移植性。如今主流的Linux系統都做到了兼容
    的頭像 發表于 05-27 16:27 ?1900次閱讀
    RT-Thread 大會:<b class='flag-5'>POSIX</b>簡介和使用

    rt-thread 驅動篇(五)serialX 小試牛刀

    終于來到了 serialX 的實踐篇,期待很久了。
    的頭像 發表于 06-16 11:29 ?4545次閱讀
    rt-thread 驅動篇(五)<b class='flag-5'>serialX</b> 小試牛刀

    基于serialX串口驅動移植libmodbus的步驟

    之前,筆者介紹 serialX 的時候,曾詳細的講解過 struct rt_uart_ops 接口中的每一個函數的功能。完全按照每一個函數功能定義去做,后面的事情就是水到渠成的。
    發表于 08-10 15:25 ?697次閱讀

    基于serialX串口驅動移植freemodbus

    之前,筆者寫過多篇 serialX 的文章,已經把它的原理和理念完完全全明明白白講了,包括它的優勢以及使用它需要注意的方面和可能遇到的問題。
    的頭像 發表于 10-13 14:54 ?842次閱讀

    POSIX適合對象存儲嗎?

    最近,留意到 MinIO 官方博客的一篇題為“在對象存儲上實現 POSIX 訪問接口是壞主意[1]”的文章,作者以 S3FS-FUSE 為例分享了通過 POSIX 方式訪問 MinIO 中的數據時碰到了性能方面的困難,性能遠不如
    的頭像 發表于 10-29 10:19 ?649次閱讀
    <b class='flag-5'>POSIX</b>適合對象存儲嗎?
    主站蜘蛛池模板: 色在线视频网站| 六月婷婷激情| 中文字幕一二三区| 午夜.dj高清在线观看免费8| 国产一区国产二区国产三区| 亚洲美女爱爱| 色播在线| 激情网页| 午夜影视在线免费观看| 久久草在线播放| 在线观看一区二区三区视频| 天堂种子| 久久狠狠色噜噜狠狠狠狠97| 伊人狼人综合网| 国产综合视频| 一区二区三区福利| 五月天福利视频| 免费的毛片| 222www免费观看| 国产伦精品一区二区三区在线观看| 91中文字幕视频| 亚洲人成网站在线观看妞妞网 | 性色视频在线观看| 欧美zooz人禽交免费| 不卡无毒免费毛片视频观看| 全午夜免费一级毛片| xxxx日本黄色| 日本三级在线视频| 一区二区三区免费视频播放器| 欧美成人免费夜夜黄啪啪| 一本到卡二卡三卡免费高| 狼狼色丁香久久女婷婷综合| 国产中文99视频在线观看| 午夜看大片| 国产精品久久新婚兰兰| 国产呦系列呦交| 四虎永久免费在线观看| 国产美女在线精品免费观看| 精品亚洲大全| 伊人婷婷涩六月丁香七月| 美女网站色在线观看|