BUS Error

怎么这么简单的程序都出现总线错误啊,请指点!
源程序:
#include <stdlib.h>
#include <stdio.h>
#include “mcimx27.h”

void waitdelay(unsigned long dly)
{
for(; dly > 0; dly–);
}

int main(int argc, char *argv[])
{
uintptr_t iobase;
unsigned value;

printf(“Welcome to the Momentics IDE\n”);
if ((iobase = mmap_device_io (MX1_GPIO_SIZE, MX1_GPIOC_BASE)) == (uintptr_t) MAP_FAILED)
{
printf(“MCIMX27: Unable to mmap_device_io\n”);
return (ENODEV);
}
else
{
printf(“mmap_device_io OK\n”);
printf(“iobase = 0x%x\n”, iobase);
}

value = in32(iobase) | 0x04000000;
out32(iobase, value);

value = in32(iobase+MX1_GPIO_OCR2) | 0x00300000;
out32(iobase+MX1_GPIO_OCR2, value);
while(1)
{

value = in32(iobase+MX1_GPIO_DR) | 0x04000000;
out32(iobase+MX1_GPIO_DR, value);
waitdelay(300000);

value = in32(iobase+MX1_GPIO_DR) & 0xfbffffff;
out32(iobase+MX1_GPIO_DR, value);
waitdelay(300000);
}

return EXIT_SUCCESS;
}
运行结果:

testc

Welcome to the Momentics IDE
mmap_device_io OK
iobase = 0x1800200

Process 409607 (testc) terminated SIGBUS code=3 fltno=5 ip=00100670 ref=01800200
Bus error :frowning:

嗯,这个是QNX特殊的地方。

因为QNX里,像这样的驱动程序是在用户空间运行的。为了保证不是任何用户程序都可以去in/out一个寄存器,所有要和硬件打交道的程序都要事先取得IO特权。具体来说就是在你的程序的main()里,先调用一句 “ThreadCtl(_NTO_TCTL_IO, 0);”, 这样io操作就不会BUS Error了。

_NTO_TCTL_IO是一个自动继承的线程标志,如果在main()里用了,那么后开的所有线程都有IO特权。也可以只在某个线程里用,使那个线程有IO特权。

谢谢xtang,非常感谢您的回复,谢谢您的帮助!!!

xtang,你好,我还有一个问题,就是我的bsp包里面没有graphics驱动,我如果想添加graphics驱动需要做哪些工作?

什么板子?什么图形芯片?

最好的办法是去下载有你的图形芯片的BSP。否则要从DDK直接写起的话,可能比较费力。

MX27 LiteKit板,类似MX27ADS板,MX27片内集成了LCD控制器,MX27和MX21相似,我在想可以参考MX21的BSP,它里面有图形驱动,但是就是不知道BSP的工程是怎么组织的,如何在BSP里面添加一个驱动?

http://community.qnx.com/sf/wiki/do/viewPage/projects.bsp/wiki/BSPAndDrivers

这里有27的BSP可以下载。图形驱动应该已经在里面了。

如果你用IDE,File->Import->QNX->QNX Board Support Package,把你下载的ZIP文件import 进去就可以了。

xtang, 您好,我下载的就是这里的MX27的BSP,里面没有图形驱动。
我还有一个问题想问您,就是我看到BSP包里面有些驱动象I2C驱动的代码,
它里面是调用了ThreadCtl函数的,用来获得IO权限,但是象串口、网卡等驱动里面我没有看到在哪里调用了ThreadCtl函数,是不是因为串口、网卡驱动跟DDK有个接口,就不用再调用ThreadCtl来获得IO权限了,而I2C驱动没有跟DDK接口,只是一个普通的驱动类的资源管理器,所以要调用ThreadCtl?

Hmm…

21/31/35的BSP都有图形驱动,就只27没有。或者它跟21有点像的?至少你可以找个相近的,然后改源码。

串口驱动联接了libio-char库,而网卡驱动是由协议栈来调入的;协议栈和libio-char里调用了ThreadCtl()。前面提过,这个是可继承的线程标志,只要做了一次,所有的“子线程”都有这个特权了。

libio-char和协议栈io-pkt的源码网上都有,如果有兴趣,你可以去grep它们看在哪里调了ThreadCtl()。

非常感谢xtang的热情答复 :slight_smile: