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相似或者是对应的。
本文关键字:程序 嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术
上一篇:VxWorks汉字显示解决方案