免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10818 | 回复: 12
打印 上一主题 下一主题

[BootLoader] uboot下tftp led_on.bin后go,显示Starting application at ...后挂死 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-25 09:42 |只看该作者 |倒序浏览
环境:fs2410 已烧入uboot1.3.1,跳线到nandflash 启动
      led_on.s makefile 来自《嵌入式Linux应用开发完全手册》
      修改makefile中arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf//0x00000000改为0x30008000
      编译连接后得到led_on.bin

操作及打印:
FS2410# tftp 0x30008000 led_on.bin
    TFTP from server 192.168.27.128; our IP address is 192.168.27.102
    Filename 'led_on.bin'.
    Load address: 0x30008000
    Loading: #
    done
    Bytes transferred = 36 (24 hex)
FS2410# go 30008000
    setup linux parameters at 0x30000100
    linux command line is: " console=ttySAC0,115200 root=/dev/nfs rw nfsroot=192.168.0.100:/opt/filesystem
        ip=192.168.0.251:192.168.0.100:192.168.0.1:255.255.255.0arsight:eth0n"
    ## Starting application at 0x30008000 ...
请教问题:
1.为什么go命令执行后,除了Starting...的打印外还有别的
2.不能执行是不是还有什么需要设置或者uboot移植的时候需要什么更改?为什么会停在那里呢?

背景介绍 :本人刚入手了一块板子,该板已被更改过,具体更改不清楚,上面烧有uboot。现在因为家中没有并口的电脑,看到韦东山《嵌入式Linux应用开发完全手册》书中介绍可以用tftp下载后,直接go执行bin,特想先在没有os的裸环境上熟悉各种硬件,望各位指教了~。

论坛徽章:
0
2 [报告]
发表于 2011-10-25 15:45 |只看该作者
你这个是应用程序, 是需要运行在linux操作系统上的

想学裸机,熟悉硬件的话, 仔细学习u-boot好了,
u-boot就是一个裸机程序,一个功能非常强大的大裸机程序

u-boot那套全搞熟悉了,基本就是半个高手了,
努力ing

论坛徽章:
0
3 [报告]
发表于 2011-10-25 15:51 |只看该作者
回复 2# senioryzc


他这个不是应用程序,是可以直接运行在裸机上的


经过楼主的描述,我认为程序按照楼主意愿执行了

但是楼主认为没有执行,halt 住了,是不是因为led没有点亮?

如果没有点亮,是不是IO管脚设置的有问题,确定原理图和程序一致?

论坛徽章:
0
4 [报告]
发表于 2011-10-25 16:01 |只看该作者
回复 2# senioryzc
这个不是应用程序,是不依赖于os的bin,正常运行是会点灯的,从打印上看,我怀疑板子的前任把uboot中的do_go函数做了修改,导致了我的调用出错

论坛徽章:
0
5
发表于 2011-10-25 16:04
本帖最后由 luoxb 于 2011-10-25 16:10 编辑

回复 3# npuazm
板子都是基于s3c2410应该都一样,只是我怀疑烧到板子里面的uboot其中do_go函数被改动以便于传递参数给内核启动时用但不适用于调用一般函数,有对uboot研究深入的大侠出来讲解吧,恭候~
在网站上搜到这样一个更改,与我的打印很像,怀疑对uboot做了相同更改。不清楚红色部分的更改,是不是会影响除内核调用外的调用

1:例子一:通过param_struct让uboot中的go命令可以传递参数
分析:go的代码在common/cmd_boot.c中,里面并没有拷贝启动参数的代码,转向内核的时候也没有传送
启动参数所在的地址,因此添加如下代码用于拷贝参数,可以看到,对于param_struct只需要设置cmmandline
u1.s.page_size,u1.s.nr_pages三个域
               char *commandline = getenv("bootargs");
        struct param_struct *lxy_params=(struct param_struct *)0x80000100;

        printf("setup linux parameters at 0x80000100\n");
        memset(lxy_params,0,sizeof(struct param_struct));
        lxy_params->u1.s.page_size=(0x1<<12); //4K 这个是必须有的,否则无法启动
        lxy_params->u1.s.nr_pages=(0x4000000)>>12; //64M 这个是必须有的,否则无法启动
        memcpy(lxy_params->commandline,commandline,strlen(commandline)+1);
        printf("linux command line is: \"%s\"\n",lxy_params->commandline);
然后还要向内核传递参数地址,将下面一行代码修改:
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);  //需要被修改的代码
rc = ((ulong(*)(int,int,uint))addr) (0, gd->bd->bi_arch_number,gd->bd->bi_boot_params);//修改之后的代码


上面文字引自:http://liuyue18301.blog.163.com/ ... 282009930102916727/

论坛徽章:
0
6 [报告]
发表于 2011-10-25 16:07 |只看该作者
led_on.s makefile 来自《嵌入式Linux应用开发完全手册》
      修改makefile中arm-linux-ld -Ttext 0x00000000 -g led_on.o -o led_on_elf//0x00000000改为0x30008000
      编译连接后得到led_on.bin

是不算应用程序的,但也算不上裸机程序

起码你没有指定入口点,如果你这个源文件很大,说不定0x30008000处是什么东西

论坛徽章:
0
7 [报告]
发表于 2011-10-25 16:16 |只看该作者
led_on.s makefile 来自《嵌入式Linux应用开发完全手册》
      修改makefile中arm-linux-ld -Ttext 0x000 ...
senioryzc 发表于 2011-10-25 16:07

兄台,我们关注问题本身吧,是不是裸机程序,并不重要。另外,该位置可以确保没有占用过

论坛徽章:
0
8 [报告]
发表于 2011-10-25 16:21 |只看该作者
回复 4# luoxb

回复 4# luoxb

以下是我uboot 中go 的代码

int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
        ulong        addr, rc;
        int     rcode = 0;

        if (argc < 2) {
                cmd_usage(cmdtp);
                return 1;
        }

        addr = simple_strtoul(argv[1], NULL, 16);

        printf ("## Starting application at 0x%08lX ...\n", addr);

        /*
         * pass address parameter as argv[0] (aka command name),
         * and all remaining args
         */
        rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
        if (rc != 0) rcode = 1;

        printf ("## Application terminated, rc = 0x%lX\n", rc);
        return rcode;
}


可以看出不会打印linux 参数信息
我觉得楼主说的有道理,uboot 可能修改了go 的命令执行的函数
建议楼主从新编译干净 uboot 下载进去,在看看实验的结论

论坛徽章:
0
9 [报告]
发表于 2011-10-25 16:22 |只看该作者
回复 3# npuazm


现在初步怀疑是uboot的do_go函数被更改过,根据是参看一篇使用go命令来传参数启动内核的网络文章:http://liuyue18301.blog.163.com/ ... 282009930102916727/
但不清楚红色标记部分对其他调用的影响。

1:例子一:通过param_struct让uboot中的go命令可以传递参数
分析:go的代码在common/cmd_boot.c中,里面并没有拷贝启动参数的代码,转向内核的时候也没有传送
启动参数所在的地址,因此添加如下代码用于拷贝参数,可以看到,对于param_struct只需要设置cmmandline
u1.s.page_size,u1.s.nr_pages三个域
               char *commandline = getenv("bootargs");
        struct param_struct *lxy_params=(struct param_struct *)0x80000100;

        printf("setup linux parameters at 0x80000100\n");
        memset(lxy_params,0,sizeof(struct param_struct));
        lxy_params->u1.s.page_size=(0x1<<12); //4K 这个是必须有的,否则无法启动
        lxy_params->u1.s.nr_pages=(0x4000000)>>12; //64M 这个是必须有的,否则无法启动
        memcpy(lxy_params->commandline,commandline,strlen(commandline)+1);
        printf("linux command line is: \"%s\"\n",lxy_params->commandline);
然后还要向内核传递参数地址,将下面一行代码修改:
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);  //需要被修改的代码
rc = ((ulong(*)(int,int,uint))addr) (0, gd->bd->bi_arch_number,gd->bd->bi_boot_params);//修改之后的代码

论坛徽章:
0
10 [报告]
发表于 2011-10-25 16:25 |只看该作者
回复  luoxb

回复  luoxb

以下是我uboot 中go 的代码

int do_go (cmd_tbl_t *cmdtp, int flag,  ...
npuazm 发表于 2011-10-25 16:21



谢谢好心的npuazm,我手头暂时没有并口机器呢, 想考虑下为什么强转的函数类型发生了变化,会影响这段二进制代码执行吗?有没有办法让它不受影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP