Segmentation fault code

内核编译和嵌入式产品的设计与开发
回复
cskywit
帖子: 7
注册时间: 2008-11-28 16:32

Segmentation fault code

#1

帖子 cskywit » 2009-03-17 21:34

求助:小弟在ubuntu下交叉编译一个控制ARM9的GPIO的程序,开发板上已经有Linux操作系统,但是在板子上运行时出现如下错误:
pc : [<000084a4>] lr : [<00008608>] Not tainted
sp : bffffe24 ip : bffffe38 fp : bffffe34
r10: 40127c98 r9 : 00008564 r8 : 00000001
r7 : 4000b040 r6 : 000082c4 r5 : bffffe84 r4 : 4001c720
r3 : 00000003 r2 : 00000003 r1 : 40129940 r0 : ffffffff
Flags: nZCv IRQs on FIQs on Mode USER_32 Segment user
Control: C000717F Table: 00AC0000 DAC: 00000015
Segmentation fault
我的程序代码是:
//程序控制GPIOE0(GRLED)和GPIOE1(RDLED)连接的红绿灯闪烁
#include<stdio.h>
#include <stdlib.h>
#include <math.h>
#include<sys/mman.h>
#include<fcntl.h>
#include <asm/page.h>

//定义GPIOE端口地址
#define GPIO_BASE 0x80840020
#define rPEDR 0x00000000 //E口数据寄存器
#define rPEDDR 0x00000004 //E口数据方向寄存器

volatile unsigned int *PEDR,*PEDDR;
static void Delay() //延时函数
{
int j;
for(j=0;j<0xffff;j++)
;
}
void Display() //显示函数
{
int h;
*PEDDR=0x3 ; //初始化GPIO,设置方向为出
for(h=0;h<10;h++)
{
*PEDR=0x1;
Delay();
printf("Now,Green Light\n");
*PEDR=0x2;
Delay();
printf("Now,Red Light\n");
*PEDR=0x0;
printf("Now,No Light\n");
Delay();
*PEDR=0x3;
printf("Now,both Light\n");
}
printf("It's done\n");
}

int main()
{
int gpio_fd;
unsigned char *gpio_map;
gpio_fd =open("/dev/mem",O_RDWR);
if (gpio_fd == -1)
{
printf("can't open /dev/mem.\n");
}
gpio_map = (unsigned char *)mmap(NULL, 0x30,PROT_READ | PROT_WRITE, MAP_SHARED,gpio_fd, GPIO_BASE);
PEDR = (volatile unsigned int *) (gpio_map+rPEDR);
PEDDR = (volatile unsigned int *) (gpio_map+rPEDDR);
Display();
if (gpio_fd != 0x0)
{
close(gpio_fd);
}
printf("GPIO Control Test end\n");
return 0;
}
我一直困惑不知道为什么?求助各位,是不是嵌入式Linux不能直接控制硬件,进行地址映射后也不行吗?
头像
weilichun
帖子: 218
注册时间: 2007-09-09 15:41
来自: Beijing
联系:

Re: Segmentation fault code

#2

帖子 weilichun » 2009-03-21 13:57

我遇到的这样问题一般都是指针错误。非法使用指针,使用空指针等等。
你可以调试下,单步跟踪看看哪儿出错了
cskywit
帖子: 7
注册时间: 2008-11-28 16:32

Re: Segmentation fault code

#3

帖子 cskywit » 2009-03-22 15:22

我单步调试过,就是在给PEDR指向的寄存器写内容时出错,地址映射没有问题,这就不明白是为什么了
回复