RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

serialX的posix接口測(cè)試

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

測(cè)試環(huán)境

開發(fā)板: NK-980IOT V1.0 的開發(fā)板
rt-thread 版本:4.1.1
IDE:keil + env

啟用 posix

首先,啟用 DFS:”RT-Thread Components” -> “DFS: device virtual file system” 。進(jìn)入子菜單,選擇

“Using posix-like functions, open/read/write/close”
“ Using devfs for device objects”

其它項(xiàng)可以取消選擇。

然后進(jìn)入 “RT-Thread Components” -> “C/C++ and POSIX layer” -> “POSIX (Portable Operating System Interface) layer” 子菜單項(xiàng),選擇

“Enable POSIX file system and I/O”
“Enable I/O Multiplexing select() “
“Enable Terminal I/O “

其它項(xiàng)可以取消選擇。

測(cè)試

我們繼續(xù)使用 rt-thread 驅(qū)動(dòng)篇 之 serialX 全網(wǎng)公測(cè) 提供的測(cè)試方案,但是把里面的讀寫 API 改一改,rt_device_open 改成 open,rt_device_read 改成 read,rt_device_write 改成 write,rt_device_close 改成 close。

我們知道, open/read/write/close 分別對(duì)應(yīng)調(diào)用 dfs_file_(open/read/write/close) 進(jìn)而調(diào)用 struct dfs_file_ops 結(jié)構(gòu)體中定義的 open/read/write/close 接口。在串口驅(qū)動(dòng)框架里就是 serial_fops_(open/read/write/close) 等幾個(gè)函數(shù)。

serial_fops_open

需要說明的是,我們只能選擇“中斷”或者“DMA”中的一種模式了。另外,除了 O_RDONLY O_WRONLY O_RDWR 三種讀寫標(biāo)志,還可以支持 O_NONBLOCK ,它等于 RT_DEVICE_OFLAG_NONBLOCKING。

serial_fops_read

原來的實(shí)現(xiàn)有如下一個(gè) while 循環(huán),這個(gè)循環(huán)的本意是:非阻塞模式下,如果沒有 read 到數(shù)據(jù)返回 -EAGAIN 錯(cuò)誤值,告知應(yīng)用層無數(shù)據(jù)并可以再次讀;阻塞模式下,如果沒有 read 到數(shù)據(jù)將等待工作隊(duì)列而掛起線程。

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 的阻塞模式概念是一致的,如此一來,我們發(fā)現(xiàn)阻塞模式時(shí) rt_device_read 先阻塞了,并不會(huì)走到 if 條件語句塊內(nèi)。

flush 概念

大家一定知道,flush 支持是 serialX 獨(dú)有的,v1 v2 沒有這個(gè)。當(dāng)我們開啟 posix 之后,發(fā)現(xiàn) dfs 實(shí)現(xiàn)了一個(gè)函數(shù) fsync ,同時(shí)還有一個(gè) dfs_file_flush 函數(shù),以及 struct dfs_file_ops 也定義了 flush 接口。只是在之前的版本里這個(gè)都沒有實(shí)現(xiàn)。于是,我們對(duì) “serialX.c” 做如下修改

找到 const static struct dfs_file_ops _serial_fops = 變量定義代碼行,將 RT_NULL, /* flush / 修改為 serial_fops_flush, / flush */ 。然后在上面添加 serial_fops_flush 函數(shù)實(shí)現(xiàn):

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 復(fù)用

之前設(shè)計(jì)的測(cè)試方案里,只有回環(huán)測(cè)試改動(dòng)比較大。這里我們使用 select 這個(gè)高級(jí)的用法,監(jiān)聽是否有數(shù)據(jù)。

用這種方式,我們可以同時(shí)監(jiān)聽多個(gè)串口設(shè)備了?;蛘哒f,一個(gè)線程“同時(shí)”讀多個(gè)串口設(shè)備。

termios

開啟了 posix ,串口設(shè)備修改波特率、數(shù)據(jù)位等需要使用 termios。這部分的問題留待下一篇 libmodbus 部分詳說。

總結(jié)

啟用了 posix 后我們發(fā)現(xiàn),posix 是在原來的設(shè)備驅(qū)動(dòng)框架基礎(chǔ)上套的一層殼。增加了函數(shù)調(diào)用跳轉(zhuǎn)次數(shù)。如果沒有必要的理由,還是不啟用 posix 了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6987
  • Posix
    +關(guān)注

    關(guān)注

    0

    文章

    36

    瀏覽量

    9496
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1285

    瀏覽量

    40081
  • DFS
    DFS
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    9162
  • FreeModbus
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    4466
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    rt-thread 驅(qū)動(dòng)篇(六)serialX弊端及解決方法

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

    請(qǐng)問rtthread的外設(shè)驅(qū)動(dòng)為什么不實(shí)現(xiàn)posix接口?

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

    在RT-Thread中使用POSIX Threads接口

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

    嘗試一下在freemodbus里使用serialX

    接口中的每一個(gè)函數(shù)的功能。完全按照每一個(gè)函數(shù)功能定義去做,后面的事情就是水到渠成的?;诵“胩斓臅r(shí)間從 drv_uart.c 改成 drv_uartX.c 。然后使用 serialX 中提供的 測(cè)試
    發(fā)表于 02-13 15:09

    測(cè)試serialXposix支持詳解

    看看有什么問題,然后發(fā)現(xiàn)困難重重,于是退而求其次,先測(cè)試 serialXposix 接口。測(cè)試環(huán)境開發(fā)板: NK-980IOT V1.
    發(fā)表于 02-14 11:29

    淺析基于serialX串口驅(qū)動(dòng)移植libmodbus

    詳細(xì)比對(duì),libmodbus 打開串口設(shè)備后使用 termios 配置串口設(shè)備的波特率數(shù)據(jù)位等。而筆者上次在測(cè)試 posix 接口時(shí)使用的默認(rèn)配置,并沒有修改波特率。為了驗(yàn)證并跟蹤問題位置,筆者在
    發(fā)表于 02-15 11:07

    嵌入式軟件使用POSIX接口的優(yōu)缺點(diǎn)

    POSIX既然是可移植操作系統(tǒng)接口,那基于該接口的應(yīng)用程序可移植性自然是很高的?;?b class='flag-5'>POSIX接口設(shè)計(jì)的應(yīng)用程序可以在不做修改或僅做極少量的
    發(fā)表于 11-14 08:45 ?5622次閱讀

    posix是什么

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

    Linux信號(hào)量(2):POSIX 信號(hào)量

    存儲(chǔ))置于可選部分中。在 SUSv4 之前,POSIX 信號(hào)量接口已經(jīng)被包含在信號(hào)量選項(xiàng)中。在 SUSv4 中,這些接口被移至了基本規(guī)范,而消息隊(duì)列和共享存儲(chǔ)接口依然是可選的。
    的頭像 發(fā)表于 10-29 17:34 ?706次閱讀

    RT-Thread 4.1.0中POSIX淵源介紹

    可移植操作系統(tǒng)接口,POSIX 標(biāo)準(zhǔn)定義了操作系統(tǒng)(很多時(shí)候針對(duì)的是類 Unix 操作系統(tǒng))應(yīng)該為應(yīng)用程序提供的接口標(biāo)準(zhǔn),從而保證了應(yīng)用程序在源碼層次的可移植性,如今主流的 Linux 系統(tǒng)都做
    的頭像 發(fā)表于 04-27 10:22 ?1800次閱讀

    RT-Thread 大會(huì):POSIX簡(jiǎn)介和使用

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

    rt-thread 驅(qū)動(dòng)篇(五)serialX 小試牛刀

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

    基于serialX串口驅(qū)動(dòng)移植libmodbus的步驟

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

    基于serialX串口驅(qū)動(dòng)移植freemodbus

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

    POSIX適合對(duì)象存儲(chǔ)嗎?

    最近,留意到 MinIO 官方博客的一篇題為“在對(duì)象存儲(chǔ)上實(shí)現(xiàn) POSIX 訪問接口是壞主意[1]”的文章,作者以 S3FS-FUSE 為例分享了通過 POSIX 方式訪問 MinIO 中的數(shù)據(jù)時(shí)碰到了性能方面的困難,性能遠(yuǎn)不如
    的頭像 發(fā)表于 10-29 10:19 ?645次閱讀
    <b class='flag-5'>POSIX</b>適合對(duì)象存儲(chǔ)嗎?
    RM新时代网站-首页