主题 : Segmentation fault 复制链接 | 浏览器收藏 | 打印
Don't judge me with those universal values, or I'll give you one punch!
级别: 新手上路
UID: 65845
精华: 0
发帖: 38
金钱: 195 两
威望: 39 点
综合积分: 76 分
注册时间: 2012-03-23
最后登录: 2013-06-10
楼主  发表于: 2012-05-13 21:30

 Segmentation fault

最近想把原来写的裸机程序拿来在linux下运行(不知道这个想法本身是不是有问题……)

gcc编译通过后,运行提示Segmentation fault

用gdb调试发现是初始化寄存器的时候出现错误的

怀疑是x86平台的问题,使用arm-linux-gcc编译后直接在开发板上运行还是同样的问题

本人对linux系统还不是很了解,求解答啊~谢谢!

畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 554
金钱: 3075 两
威望: 615 点
综合积分: 1188 分
注册时间: 2010-12-03
最后登录: 2015-09-22
1楼  发表于: 2012-05-13 22:37

 回 楼主(ngc501) 的帖子

注意使用配套的arm-linux-gcc
好好学习,天天鲁管
Don't judge me with those universal values, or I'll give you one punch!
级别: 新手上路
UID: 65845
精华: 0
发帖: 38
金钱: 195 两
威望: 39 点
综合积分: 76 分
注册时间: 2012-03-23
最后登录: 2013-06-10
2楼  发表于: 2012-05-15 16:00
我用的是友善mini2440光盘带的arm-linux-gcc-4.4.3.tar

linux版本是linux-2.6.32.2-mini2440-20110413.tar,也是光盘带的

可以吗?
Don't judge me with those universal values, or I'll give you one punch!
级别: 新手上路
UID: 65845
精华: 0
发帖: 38
金钱: 195 两
威望: 39 点
综合积分: 76 分
注册时间: 2012-03-23
最后登录: 2013-06-10
3楼  发表于: 2012-05-15 16:42
试着将原来的.c用makefile转换成了elf和bin格式的,bin可以在开发板上运行,但是elf还是提示Segmentation fault,而且bin的运行结果也不对

我的bin编译出来比elf大很多,不知道这是不是也有问题,希望有高手能解答啊~
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2012-05-15 17:00
把你的程序源代码贴出来看看。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
Don't judge me with those universal values, or I'll give you one punch!
级别: 新手上路
UID: 65845
精华: 0
发帖: 38
金钱: 195 两
威望: 39 点
综合积分: 76 分
注册时间: 2012-03-23
最后登录: 2013-06-10
5楼  发表于: 2012-05-16 16:44
试了很多程序都不行,贴个最简单的吧
# include "linux/option.h"
# include "linux/2440addr.h"
# include "linux/2440lib.h"
# include "linux/2440slib.h"
# include "linux/s3c2440.h"
# include "linux/profile.h"
# include "linux/mmu.h"

void Uart_init()
{
      rULCON0 = 0x03;
      rUCON0 = 0x05;
      rUFCON0 = 0x00;
      rUMCON0 = 0x00;
      rUBRDIV0 = 0x144;
  
      //rGPHCON = rGPHCON & (~(0xffff)) ;
      rGPHCON = rGPHCON | (0xaaa0) ;    

      rULCON1 = 0x03;  
      rUCON1 = 0x05;  
      rUFCON1 = 0x00;
      rUMCON1 = 0x00;
      rUBRDIV1 = 0x144;
}

void Uart_send_bit(unsigned char c, int n)
{
     switch (n)
     {
          case 0 :  
                while(!(rUTRSTAT0 & 0x2));      //等待并判断发送缓存是否为空
                rUTXH0 = c;
                break;
          case 1 :    
                while(!(rUTRSTAT1 & 0x2));      //等待并判断发送缓存是否为空
                rUTXH1 = c;
                break;
     }
}

unsigned char Uart_get_bit(int n)
{
      switch (n)
      {
          case 0 :
                while(!(rUTRSTAT0 & 0x1)); //等待并判断接收缓存是否准备好
                return  rURXH0;                     //接收一个字节数据
                break;
          case 1 :
                while(!(rUTRSTAT1 & 0x1)); //等待并判断接收缓存是否准备好
                return  rURXH1;                     //接收一个字节数据
                break;
      }
}

int main()
{
     unsigned char i;
     Uart_init();
     //初始化串口

     while(1)
     {
         for(i=0; i<100; i++)
         {
            Uart_send_bit(i,0);
         }
     }
     return 0;
}

都是在寄存器初始化的时候FAULT的
Don't judge me with those universal values, or I'll give you one punch!
级别: 新手上路
UID: 65845
精华: 0
发帖: 38
金钱: 195 两
威望: 39 点
综合积分: 76 分
注册时间: 2012-03-23
最后登录: 2013-06-10
6楼  发表于: 2012-05-16 16:47
换了makefile的写法,bin倒是变小了,不过运行还是不对啊