QNX驱动开发——Resource manger framework

 在 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 就创建好了，是不是很简单.