天天看点

[转]QNX驱动开发-Resource manger framework

声明:本文只用于个人学习交流,若不慎造成侵权,请及时联系我,立即予以改正

如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额0.1元起步,多少随意

锋影

email:[email protected]

在QNX下开发驱动程序,最主要的工作除了了解底层硬件具体工作流程外,就是建立一个能与操作系统兼容且支持POSIX的Resource manger框架了。在任何一段程序的执行过程中一段都是从main函数开始的,然而在操作系统中的main函数还传递了两个参数:int argc, char **argv,这两个参数是用来传递从shell命令行或者buildfile中传来对Resource manger具体参数的,使用options (int argc, char **argv);函数实现,所以这个函数在main函数中最开始的位置,可以开发的driver具有不同可选的特性,提供使用的便利性。

        第一步:书写options (int argc, char **argv);的具体实现;

        第二步:建立一个上下文切换句柄dpp = dispatch_create ();这个东东主要用在mainloop中产生一个block特性,可以让我们等待接受消息;

        第三步:iofunc初始化。这一步是将自己实现的函数与POSIX层函数进行接口,解析从read、write、devctl等函数传来的消息进行解析,以实现底层与应用层函数之间的交互,通过io_funcs.read = io_read,io_funcs.write = io_write,进行函数重载;

        第四步:注册设备名,使设备在命名空间中产生相应的名称,这一点是整个过程的关键了,形如  pathID = resmgr_attach (dpp, &rattr, "/dev/Null",_FTYPE_ANY, 0, &connect_funcs, &io_funcs, &ioattr),这样不仅注册了一个设备名,还让系统知道了我们实习的IO函数对应关系;

        第五步:为之前创建的上下文句柄分配空间,例如ctp = dispatch_context_alloc (dpp);为了第六步使用;

        第六步:通过不断循环等待dispatch_block()来调用MsgReceive()使Resource manger处于receive block状态,以接收上层发送来的消息,通过dispatch_handler (ctp)去调用我们自己定义的IO函数。

        这样一个single thread设备驱动dev/Null就创建好了,是不是很简单。

继续阅读