qnx 设备驱动开发_QNX驱动开发——应用层与resource manger交互 | 学步园

QNX操作系统是一个类Unix实时操作系统,遵从POSIX规范,驱动程序具有良好的可移植性。

编写任何驱动程序都会遇到同样的一个问题:应用程序与驱动程序之间是如何进行交互的。其实这个问题很简单,QNX有大量资料说明这一点。

当客户端调用fd = open(“dev/mydevice”,O_RDWR)打开设备mydevice,并期望从设定的地址上读写数据时,这个问题就产生了。实际上QNX提供了一套灵活的消息交互机制,大致上可以分为以下三个步骤:

第一,加载驱动程序,创建服务线程,把底层IO函数与POSIX函数进行连接,在命名空间注册设备名,通过Event loop或Thread

pool等待消息的接收,同时使父进程在后台运行以加载其他应用程序。

第二,当应用程序调用open()函数时,process manger受到请求在命名空间中找到名为dev/mydevice的resource

manger,QNX内核库打开它,应用程序通过返回的句柄与之建立连接。

第三,随后当调用read (fd, buf, 512)函数时,内核库发送了一个_IO_READ的消息,此时之前建立的Event loop或Thread

pool就可以接收到这个消息,通过判断消息的类型调用到相应的IO函数,比如:

int io_read (resmgr_context_t *ctp,  io_read_t *msgRESMGR_OCB_T*ocb);

其实可以看出来了,fd, buf, 512这几个参数主要就是通过io_read_t *msg这个参数传过来的。其实client主要指定了一个设备,希望向这个设备的某个地址读取长度为512字节的数据,然后放到buf当中。

接下来发生的事情就比较简单了,就是在自己实现的io_read函数中解析这个消息传递来的参数,并给出回复。在client-server消息交互模型中,此时client就处在了reply

blocked的状态等待server的回复。在io_read中做了哪些事情呢?首先要验证下传来的消息是否是正确的io_read消息,同时检查到底是否是nonblock方式打开。然后解析msg->i.nbytes来确定需要传递多少个数据,然后调用底层函数读取硬件数据,通过_IO_SET_READ_NBYTES

(ctp, msg->i.nbytes);来告诉client可以返回的数据量。

对于如何回复数据来说,QNX确实提供了不少简单的方法。可以使用return(ENOMEM)返回一个错误;或者使用return(EOK)返回操作成功。如果想返回一定量数据的话,可以设置IOV数组返回,

比如通过设置IOV来返回一个或多个数组,比如:

SETIOV (ctp->iov, buffer, nbytes);

return (_RESMGR_NPARTS(1));

或者直接调用宏返回一个完整的buffer:

return (_RESMGR_PTR(ctp, buffer, nbytes));

写数据的操作与读数据的操作类似,不再赘述。这样就完成了上层数据请求,下层数据读取并返回的过程,server重新回到receive blocked的状态。细心的朋友可能已经看出来了,既然是读写数据,那么地址是如何设置的呢?其实是通过devctl来设置的,其格式为

int devctl( int fd, int dcmd, void *data, size_t nbytes, int * return_info);

其中最值得一提的就是int dcmd这个参数,这是一个自定义的命令,可以通过这个命令传递一个结构体指针,比如:

Typedef struct{

Uint32_t addr_t;

Uint32_t status_r;

} my_cfg_t;

#define MYCMD_SET_ADDR  __DIOT(_DCMD_MISC, 0x01, my_cfg_t)

在client应用程序中定义my_cfg_t addr;通过命令

Devctl(fd, MYCMD_SET_ADDR,& addr,sizeof(my_cfg_t),NULL);

完成设置。对于底层来说就比较简单了,主要分为获取数据指针,解析传来的命令获得数据就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring api层打包_Spring项目的按层打包已过时

spring api层打包我认为Spring应用程序不应该以逐层方法构造。 在我看来,按功能打包更有意义。 首先,让我简要描述每种方法。 “按层打包”(在非Java世界中为“按类型折叠”) 该项目结构根据源代码文件所属的体系结构层将其分为…

C++ Primer(第五版)第七章 类 部分答案

第七章 类练习7.2练习7.3练习7.4练习7.6练习7.7练习7.9练习7.14、7.15、7.22练习7.23、7.24、7.26练习7.27练习7.2 曾在 2.6.2 节的练习(第 76 页)中编写了一个 Sales_data类,请向这个类添加 combine 和 isbn 成员。 创建头文件sales.h #ifn…

arpanet(阿帕网)

“阿帕”(ARPA),是美国高级研究计划署(Advanced Research Project Agency)的简称。他的核心机构之一是信息处理技术办公室(IPTO Information Processing Techniques Office),一直在关…

mongodb数据库淘汰_mongodb 内存数据淘汰策略

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼About MongoMongoDB uses memory mapped files.This means the the operating system essentially controls what is paged in and out of memory (to and from disk).The RulesIf your indexes working set exceed memory, the l…

Markdown常用转义字符

如果字符无法正常输出,则在前面加\试试。 空格: 数学公式 数学公式要使用$$,需将公式放在两个$中间。 下标: _上标: ^分数:方法1:\frac{分子}{分母} 方法2:分子 \over 分母 对于\frac的方法…

互联网工程任务组(IETF)

国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)是一个公开性质的大型民间国际团体,汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和研究人员,并欢迎所有对此行业感兴趣…

javafx 打印控件_Java的新视差控件(JavaFX)

javafx 打印控件介绍 视差是一种视觉效果,您可以组合以不同速度移动的两个分层图像以获得深度感。 想想一下,当您在道路上行驶时,您会看到附近的树木在快速移动,而距离较远的树木将沿同一方向移动但速度较慢,结果是您…

beoplay耳机序列号查询_BOSE耳机序列号如何查询?

展开全部 大多数序列号可在产品的背面或底部找到,一般位于条形码旁。e69da5e6ba903231313335323631343130323136353331333431363532序列号长度为 17 位(还有一些耳机是 4 位),可包含字母和数字。 另外,与 Bose Connect 应用程序兼容的产品将在应用程序的设置和gt; 产品信息下…

编译原理总概述笔记

编译原理编译原理程序设计语言分类翻译编译解释编译的转换过程两阶段的转换三阶段的转换编译程序的工作词法分析语法分析中间代码生成优化目标代码生成表格与表格管理出错处理语句翻译实例过程编写编译程序方式编译原理 是介绍高级程序设计语言变换成计算机硬件所能识别的机器…

RFC(一系列以编号排定的文件)

Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内…

deprecated_使用Java的@Deprecated前瞻

deprecated我偶尔会遇到一种情况,我需要引入新的API或构造以供其他人试用,但是我知道在使用某些API后,它可能会根据其他人的反馈而改变。 在这种情况下,我想以某种方式注释该构造,以警告其他开发人员此新添加的构造的暂…

fusionsphere的核心组件_FusionSphere架构详解

FusionSphere架构详解关键字:云计算XEN Hypervisor FusionSphere摘要:本技术案例主要针对Huawei FusionSphere云计算软件架构进行深入分析,总结概括出我们的FusionSphere云计算产品技术及课程内容中的关键点,为产品技术学习和云计…

将py文件打包成exe可执行文件

使用pyinstaller库即可将py文件打包成exe文件 安装pyinstaller库 pip install pyinstaller将py文件打包成exe文件 1.首先进入cmd,用cd命令定位到要打包的py文件所在的文件夹 2.使用以下命令打包py文件 pyintaller -F xxx.py #xxx.py就是要打包的文件之后会生成…

文件的 MD5 签名介绍

在 RFC1321 中有 MD5 的详细描述。简单的说,MD5 根据文件的内容用算法产生一个唯一的128位签名,用任何方法改变文件都会导致签名改变。尽管人们一直在讨论修改文件后能保持签名不变的理论可能性,但截止到目前还没有人能够做到。所以在文件使用…

apache.camel_Apache Camel 2.21发布–新增功能

apache.camel我们刚刚发布了Apache Camel 2.21,我将在此博客中重点介绍值得注意的更改。 此版本不支持Spring Boot2。对Spring Boot 2的支持将在Camel 2.22中提供, 我们计划在2018年夏季之前发布。 1)处理大型JMS消息 我们在JMS组件中添加了…

人生永无止境的意思是什么_励志人生:生活不会给任何脆弱鼓掌。

每一日你所付出的代价都比前一日高,因为你的生命又消短了一天,所以每一日你都要更积极。今天太宝贵,不应该为酸苦的忧虑和辛涩的悔恨所销蚀,抬起下巴,抓住今天,它不再回来。一个人失败的最大原因&#xff0…

精通 RPM 之校验篇_检验篇_检测篇

文章目录一、校验介绍二、参考示例(一)校验某个已安装的软件包的所有文件(一)校验系统中所有已安装的软件包(二)校验含有指定文件的软件包(三)校验指定类别的软件包(四&a…

python关于路径需使用的方法笔记

关于python中有关路径实现代码的方法常用的python方法join()方法split()方法关于文件路径\ / // \\的用法解释斜杠/反斜杠\读取某个路径的文件双斜杠//双反斜杠\\\os.path库的方法连接路径与路径或文件名获取绝对路径获取当前文件的绝对路径返回文件名字返回文件所在文件夹的路…

不同的Hibernate命名策略

本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.implicit_naming_strategy和hibernate.physical_naming_strategy的转变。最后,我们将研究一下在Hibernate和配置中实施自…

设置按峰值带宽计费_西部数码使用指南:云服务器计费模式说明

版权归西部数码所有,原文链接:https://www.west.cn/faq/list.asp?unid2370一、付费模式1、包年包月先付费后使用模式,资源固定,按年或者按月付费购买可享受较大的价格优惠,帮您更大程度节省支出,并且时间固…