打印

关于const定义的数据不能正确初始化的问题SDRAM

[复制链接]
3123|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
有意思|  楼主 | 2011-8-4 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, SDRAM, dc, ge, rc
本帖最后由 有意思 于 2011-8-4 14:35 编辑

在uboot中定义一个const的数组 unsigned char const gImage_0[48] = { /* 0X00,0X04,0X40,0X01,0XF0,0X00, */
0XCD,0XDD,0XDD,0XDD,0XDD,0XDD,0XDD,0XDD,0XDD,0XDD,0XDD,0XCC,0XDC,0XCC,0XCC,0XCC,
0XCC,0XCC,0XCC,0XCC,0XCC,0XCC,0XCC,0XCC,0XCC,0XCC,0XCB,0XBB,0XBB,0XBB,0XBB,0XBB,
0XBB,0XBB,0XBB,0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,0X99,0X99,0X99,0X99,0X99,0X99
};


这个数组在上电时打出的数据时0xFF 为什么

相关帖子

沙发
有意思|  楼主 | 2011-8-4 14:42 | 只看该作者
const修饰的变量一般被编译器 存储在只读区,作为只读常量,我的编译器是arm-gcc-linux
在uboot中定义这样一个全局常量,但是这个数组是在什么时候初始化的,如果初始化的时候SDRAM
还没有做初始化,那么是不是就会出现异常数据,
系统的初始化过程是这样的
uboot的start.s中调用lowlevel_init进行初始化,lowlevel_init中对memap,pll dram等进行初始化
其代码如下:

void
lowlevel_init(void)
{

  /********************************************************************************************
   * Remap vectors for RAM execution
   ********************************************************************************************/
  MEMMAP = 1;
  
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
        /* move vectors to beginning of SRAM */
        asm volatile("  mov        r2, #0x40000000\n"
                     "  mov        r0, #0x00000000\n"
                     "  ldmneia r0!, {r3-r10}\n"
                     "  stmneia r2!, {r3-r10}\n"
                     "  ldmneia r0, {r3-r9}\n"
                     "  stmneia r2, {r3-r9}\n" : : :
                     "r0","r2","r3","r4","r5","r6","r7","r8","r9","r10");
#else
  /* move vectors to beginning of SRAM */
  asm volatile("  mov r2, #0x40000000\n"
               "  mov r0, #0xa0000000\n"
               "  ldmneia r0!, {r3-r10}\n"
               "  stmneia r2!, {r3-r10}\n"
               "  ldmneia r0, {r3-r9}\n"
               "  stmneia r2, {r3-r9}\n" : : :
         "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10");
#endif

  //initialize the exception vector mapping
  MEMMAP = MEM_MAP;

#if USE_USB
        PCONP |= 0x80000000;                /* Turn On USB PCLK */
#endif

  ConfigurePLL();

  /* Set system timers for each component */
#if (Fpclk / (Fcclk / 4)) == 1
    PCLKSEL0 = 0x00000000;        /* PCLK is 1/4 CCLK */
    PCLKSEL1 = 0x00000000;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
    PCLKSEL0 = 0xAAAAAAAA;        /* PCLK is 1/2 CCLK */
    PCLKSEL1 = 0xAAAAAAAA;         
#endif
#if (Fpclk / (Fcclk / 4)) == 4
    PCLKSEL0 = 0x55555555;        /* PCLK is the same as CCLK */
    PCLKSEL1 = 0x55555555;       
#endif

  /* Set memory accelerater module*/
//  MAMCR  = 0;
//  MAMTIM = 4;
  MAMCR  = 0;
  MAMTIM = 3;
  MAMCR  = 2;

  //Init GPIO
  GPIOinit();

  //initialize VIC
  VICinit();

  //initialize UART #0 to 38400, 8N1
  UART0init();

#ifndef USE_32_BIT_DATABUS
    //initialize UART #1
    UART1init();
#endif
    //short delay
    delayMs(10);


  /********************************************************************************************
   * Initialize external memory interface (EMC)
   ********************************************************************************************/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    ConfigureEMC();
#endif

        LcdInit();//gimag_0的数据在该函数中打出来,
}

1. 掉电1分钟后,在上电,打出的数据全部为0xFF
2. 快速的断电,上电,断电上电,打出数据,是正确的
3.在上电后,并且进入linux内核GUI以前进行热复位,通过HJTAG,打印,是正确的
4.在进入linux的GUI之后热复位,打印的是错误,且数据是随机的

问题会出在哪个部分??

使用特权

评论回复
板凳
请、铭记| | 2011-8-4 16:34 | 只看该作者
你确定就是const的问题吗??

使用特权

评论回复
地板
有意思|  楼主 | 2011-8-4 18:22 | 只看该作者
搞定了 哈哈

我没有说是const的问题,只是想知道const是在什么时候分配,分配在哪个区域,

记得在keil的单片机中,code修饰是放在代码段得

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

331

帖子

0

粉丝