为什么会出现segmentation fault?
本帖最后由 sa1148260 于 2014-4-25 21:23 编辑我在主机上写了一个简单的C程序
#include<stdio.h>
#define GPHCON (*(volatile unsigned *)0x56000070)
int main()
{
GPHCON = 0x0;
return 0;
}
我只是想配置GPHCON的工作模式而已
为什么用 arm-linux-gcc3.4.1 编译后在博创s3c2410开发板上运行总是出现 segmentation fault 一直想不明白!
0x56000070是端口H引脚配置寄存器GPHCON的地址, GPHCON = 0x0; 不管我给什么值都会出现segmentation fault
望大侠指点! 如果尝试写入不可写的内存会导致那个错误,比如
char *s = "hello world";
*s = 'H';
本帖最后由 sa1148260 于 2014-4-25 22:02 编辑
找到一个可能的原因:虚拟地址和物理地址问题
物理地址被操作系统屏蔽。
应用程序只能访问虚拟地址
如果一定要访问物理地址。
你必须把这些物理设备的操作,写成驱动
应用程序再跟驱动交互
不过还是不知道怎么访问虚拟地址。。再研究一下 本帖最后由 NJ8888 于 2014-4-25 22:40 编辑
linux下不能直接这样操作地址的,要map,奶奶的,去年写了篇linux下高效访问物理地址的文章,投稿某期刊没被用,我直接在EEWORLD上贴出了 我只是路过的,别在意我的出现,顺便学习学习。 你是要写应用?写驱动?
写应用要配合驱动,不能直接控制GPHCON
写驱动要ioremap,如:
volatile unsigned long *gphcon = NULL;
gphcon = (volatile unsigned long *)ioremap(0x56000070, 16);
还要注册字符设备等,不能象裸奔一样直接控制的。 本帖最后由 sa1148260 于 2014-4-26 12:59 编辑
Yaksa 发表于 2014-4-26 12:11
你是要写应用?写驱动?
写应用要配合驱动,不能直接控制GPHCON
写驱动要ioremap,如:
我应该要写应用程序吧(我发现自己竟然分不清楚应用程序和驱动的区别。。),只是从GPHCON端口中读数据。
我去找本相关的书看看,我发现不懂的东西太多了!
谢谢你! 貌似linux下要用硬件设备,需要在驱动文件里使用ioremap函数映射,然后在应用程序里用read write ioctrl函数操作设备。 咖啡可乐 发表于 2014-4-26 12:48
貌似linux下要用硬件设备,需要在驱动文件里使用ioremap函数映射,然后在应用程序里用read write ioctrl函 ...
非常有用的信息,谢谢!
页:
[1]