主题 : uboot全局变量访问不到的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
楼主  发表于: 2012-08-09 06:39

 uboot全局变量访问不到的问题

uboot移植到tiny6410上 运行到for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
        if ((*init_fnc_ptr)() != 0) {
            hang ();
        }
    }
就运行不了了 我直接调用了board_init并在里面点灯 是亮的(arch_cpu_init没有调用) 但用全局变量就不行,没有进到hang()就挂掉了
之前在start.s的改动是去掉了如下的宏

init_fnc_t *init_sequence[] = {
#if defined(CONFIG_ARCH_CPU_INIT)
    arch_cpu_init,        /* basic arch cpu dependent setup */
#endif
    board_init,        /* basic board dependent setup */
#if defined(CONFIG_USE_IRQ)
    interrupt_init,        /* set up exceptions */
#endif
    timer_init,        /* initialize timer */
#ifdef CONFIG_FSL_ESDHC
    get_clocks,
#endif
    env_init,        /* initialize environment */
    init_baudrate,        /* initialze baudrate settings */
    serial_init,        /* serial communications setup */
    console_init_f,        /* stage 1 init of console */
    display_banner,        /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
    print_cpuinfo,        /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
    checkboard,        /* display board info */
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
    init_func_i2c,
#endif
    dram_init,        /* configure available RAM banks */
#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)
    arm_pci_init,
#endif
    display_dram_config,
    NULL,
};

void start_armboot (void)
{
    init_fnc_t **init_fnc_ptr;
    char *s;
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
    unsigned long addr;
#endif
    
    /* Pointer is writable since we allocated a register for it */
    gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));
    /* compiler optimization barrier needed for GCC >= 3.4 */
    __asm__ __volatile__("": : :"memory");

    memset ((void*)gd, 0, sizeof (gd_t));
    gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
    memset (gd->bd, 0, sizeof (bd_t));

    gd->flags |= GD_FLG_RELOC;

    monitor_flash_len = _bss_start - _armboot_start;

    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
        if ((*init_fnc_ptr)() != 0) {
            hang ();
        }
    }
。。。
start.s改动
;#ifndef CONFIG_S3C6400
    ldr    r1, [r0, #OTHERS_OFFSET]
    bic    r1, r1, #0xC0
    orr    r1, r1, #0x40
    str    r1, [r0, #OTHERS_OFFSET]

wait_for_async:
    ldr    r1, [r0, #OTHERS_OFFSET]
    and    r1, r1, #0xf00
    cmp    r1, #0x0
    bne    wait_for_async
;#endif

级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
1楼  发表于: 2012-08-09 08:01
还有的改动是gd = (gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));中的_armboot_start给为了TEXT_BASE 以前怀疑 memset ((void*)gd, 0, sizeof (gd_t));memset (gd->bd, 0, sizeof (bd_t));这两句话造成删掉了也不行
级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
2楼  发表于: 2012-08-12 12:32
还是没解决 请大家帮助
级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
3楼  发表于: 2012-08-21 10:57
两周了 怎么办
级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
4楼  发表于: 2012-08-22 09:07
请版主帮帮忙
级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
5楼  发表于: 2012-08-25 11:26
uboot默认烧写到0x5e700000中  我读去了一下里面的内存都是零 我发现串口输出superboot时显示地址是0x50000000 我尝试把dnw的地址写到0x57e000000和0x50000000
级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
6楼  发表于: 2012-08-25 11:27
我尝试把dnw的地址写到0x57e000000和0x50000000都不行
级别: 新手上路
UID: 51354
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2011-07-02
最后登录: 2013-03-19
7楼  发表于: 2012-08-25 11:29
发现在调用函数时走的是相对位置0xxxxxxxx  调用全局变量函数指针时是0x57exxxxxxx绝对地址