您当前的位置:五五电子网电子知识单片机-工控设备嵌入式系统-技术QNX 4.25设备驱动程序的编写 正文
QNX 4.25设备驱动程序的编写

QNX 4.25设备驱动程序的编写

点击数:7355 次   录入时间:03-04 12:02:19   整理:http://www.55dianzi.com   嵌入式系统-技术
}

mem_base=page_ptr+(PCI_MEM_ADDR(address)&0xfff);

close(fd);

}

printf("MEM" address:%lx",PCI_MEM_ADDR(address));

if(PCI_IS_MEM(address))

printf("mapped at : %lx",mem_base);

现在可以使用指针mem_base来进入设备寄存器了。例如:

mem_base[SHUTDOWN_REGISTER]=0x0xdeadbeef;

2.3 中断资源

超级用户(root)可以调用qnx_hint_attach()将一个中断处理程序绑定到一个设备上。中断处理程序作为一个远程调用(far),在进程空间(LOCaldescriptor Table set)运行。该函数最后一个参数设置数据段。寄存器SS为一个特别的内核栈,这不同于数据段(DS)。因此,需要在中断处理程序及其调用的函数中关断栈检查。大部分系统库中的函数在编译的时候都关断了栈检查,然而,对于需要使用大量内存的函数可能并非如此。后者即是那些在中断处理程序中不可调用的函数,如printf()、open()。通过QNX具体函数在线资源的Safety→Interrupt handler项进行判断该函数是否可以调用。如果函数中包括任何自动(auto)变量,强烈建议将中断函数放在自身文件中,然后利用参数-zu选项编译之。这样能够告知编译器,使得SS!=DS。

任何被中断处理程序修改的变量需要指定为volatile关键字。中断处理程序的返回值必须为0;或某个有效的代码号(proxy pid),以此来触发一个代码从而发送一则消息。

下面总结一个中断处理程序编写时的注意点:

①只能和自己的硬件对话(如,清除设备的中断状态位),千万不要对8259中断控制器编程!

②使中断处理程序尽可能的短小。如果有很多的工作需要做,必须触发一个代理,并且它唤醒一个进程完成这些工作,以保证其它进程及低优先级的中断正常运行,提高系统的实时响应能力。

③中断处理程序不能调用含有内核调用的例程。

④中断处理程序必须是一个远程(far)调用函数。

⑤中断处理程序必须在自己的模块中。

⑥无论程序中其它模块是如何编译的,包含中断处理程序的模块必须是利用-zu和-s选项编译。(利用cc-zu-Wc-s)这些选项能够保证SS!=DS,并且关断栈检查。当然,也可使用:

#pragma off(check_stack);

pid_t far handler_xxx(){

return(proxy_xxx);

}

#pragma on(check_stack);

在试图编写执行一个中断处理程序前,务必仔细阅读在线文档。现在,可以参照硬件手册自由地对您的设备寄存器进行操作了。

结语

在HT-7U极向场电源控制系统中,我们在QNX4.25下开发了多种设备的驱动程序。这些程序工作稳定、性能优异、工作量小且易于控制。此外,QSSL公司的新版本QNX6.x下开发驱动更为方便,其原理同QNX4.25相似或者是对应的。



上一页  [1] [2] 


本文关键字:程序  嵌入式系统-技术单片机-工控设备 - 嵌入式系统-技术