如题,实现过程中发现3额问题,先写下来,待解答:

1、uboot启动后再dnw上打印许多信息,我想改变其中的打印信息或加上自己的打印信息以证明程序运行到何处。修改完后重新编译uboot.bin。

在DNW下执行dnw 50008000 USB下载uboot.bin到内存50008000处, go 50008000,从内存50008000处运行我刚下载的程序,发现我修改的内容并未显示。

重新执行dnw 50008000,nand erase 0 100000,nand write.uboot 50008000 0 100000,后从nand直接启动,发现我修改的内容被打印出来了。

总结:可能的原因:1、程序下载到50008000,但50008000处并非有执行命令。2、确实从50008000处执行了,但uboot.bin里的start.s会调用原来nand里的uboot.bin执行

2、uboot里有个examples文件夹里有hello_world应用程序(姑且这么说吧):

我dnw 50008000 hello_world.bin,go 50008000,执行后重启了。

看了makefile里LOAD_ADDR = 0xc100000,dnw c10000 hello_world.bin,go c1008000,执行后停住了

然后又看了半天makefile,太繁琐,无果,没解决掉。

3、自己写了个hello.c

dnw 50008000 ,go 50008000,运行ok,打印出hello world.

参考并引用:http://blog.csdn.net/liushaowei2008/article/details/7739046

printf函数是 uboot 实现的,我们只需要调用就行了。当然了,这个首先得到你u boot 的printf函数地址。这需要你自己 编译 uboot,因为每个人
的printf函数地址不一定一样。查看System.map
文件 ,找到printf地址。就行了。

调用时我们可以这样用:

  1. void (*show)(char*,...) = 0xc7e11650;
  2. ........
  3. show("hello world/n");
  4. .......

现在我们来个hello world 的例子:
贴一下代码:

  1. void (*show)(char *,...) = 0xc7e11650;
  2. int main(void)
  3. {
  4. show("hello world./n");
  5. return 0;
  6. }

(hello.c)
就这么简单。(一个hello world 能多复杂啊?嘎嘎~)
下面我们来说一下编译和连接:
你也会用:arm-linux-gcc hello.c
但是这是不对的,为什么呢? 我们来仔细想一个问题,我们是裸机(好吧,我承认稍微穿了一点),没有操作系统 。想想arm 执行时,它希望
执行的第一条指令是什么?肯定是一条有效的指令了。但是我们生成的这个a.out的前面是有效的可执行的语句么?也许你已经想到了,它的头不是什么
有效指令,是ELF头信息,还有你的用户 名呢,用户名不能执行吧?呵呵,开玩笑。

还有一个问题。
gcc默认的连接地址是你想要的么?八成不是吧。
鉴于以上原因我们要分步进行:
1:编译
arm-linux-gcc -c hello.c -o hello.o
生成hello.o文件。
2:链接 指定我们要的链接地址0x50000000
arm-linux-ld -Ttext=0x50000000 hello.o -o hello
这时你用arm-linux-objdump -d hello 反汇编一下,看看指令的起始地址是50000000吧?
3:去除头ELF头信息
arm-linux-objcopy -L elf32-littlearm -O binary hello hello.bin
这里elf32-littlearm 是指定大小端,咱小端的。
就这样,我们可以在裸板上运行 的二进制程序 就这样成了。为了以后方便可以把上面的指令写在Makefile里,一个make就all了。

总结:就是函数的入口地址搞不清楚,不是在50008000,故失败,先放这里,这个不着急,等有时间再来仔细研究研究。

uboot启动后在内存中运行裸机程序hello的更多相关文章

  1. Java程序在内存中运行详解

    目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...

  2. Oracle安装后命令行中运行sqlplus / as sysdba出现错误ora-01031:insufficient privileges

    Win10安装Oracle后命令行中运行sqlplus as sysdba出现错误ora-01031insufficient privileges的解决方法 情景描述 错误样例 错误分析 解决方法 情 ...

  3. 在 Docker 容器中运行应用程序

    案例说明 运行 3 个容器,实现对网站的监控. 三个容器的说明: 容器 web: 创建自 nginx 映像,使用 80 端口,运行于后台,实现 web 服务. 容器 mailer: 该容器中运行一个 ...

  4. 在Docker for Windows中运行GUI程序

    Docker运行GUI原理 Docker目前大多应用在服务器领域,那么在Docker中可以运行GUI程序吗?怀着好奇心google了一番,还真有人写了一篇文章 running-gui-applicat ...

  5. cmd 窗口中运行 Java 程序

    1.CMD 命令提示符(Command Processor)(CMD) CMD命令:开始->运行->键入 cmd(在命令行里可以看到系统版本.文件系统版本) 2.对文件夹操作的部分命令 启 ...

  6. 在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError

    在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError,可以检查一下几项: 环境变量配置: 注意 ...

  7. 【翻译】Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

    [翻译]Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解) . . .

  8. 【爬坑】在 IDEA 中运行 Hadoop 程序 报 winutils.exe 不存在错误解决方案

    0. 问题说明 环境为 Windows 10 在 IDEA 中运行 Hadoop 程序报   winutils.exe 不存在  错误 1. 解决方案 [1.1 解压] 解压 hadoop-2.7.3 ...

  9. C编译器MinGW安装、下载及在notepad++中运行C程序

    一.C编译器MinGW的下载及安装步骤 打开MinGW官网:http://www.mingw.org/ 图一 图二 图三 图四 图五 图六 系统中配置环境变量: 图七 验证是否安装成功: CMD中运行 ...

随机推荐

  1. Mavne + Spring整合CXF

    http://blog.csdn.net/xiongyu777888/article/details/23787615(没毛病) http://blog.csdn.net/hbsong75/artic ...

  2. [转] NSString / NSMutableString 字符串处理,常用代码

     原文 :  http://justcoding.iteye.com/blog/1405951 Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString , ...

  3. Swift - 18 - 数组的基础操作

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  4. MySQL 管理

    MySQL 管理 启动及关闭 MySQL 服务器 首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql ...

  5. 二十分钟弄懂C++11 的 rvalue reference (C++ 性能剖析 (5))

    C++ 11加了许多新的功能.其中对C++性能和我们设计class的constructor或assignment可能产生重大影响的非rvalue reference莫属!我看了不少资料,能说清它的不多 ...

  6. 【HAOI2007】理想的正方形

    [问题描述] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [输入] 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行 ...

  7. php网站判断用户是否是手机访问的方法

    PHP网站判断用户是否用手机访问,如果是手机的话,就跳转到指定的手机友好页面.随着移动设备的普及,网站也会迎来越来越多移动设备的访问.用适应PC的页面,很多时候对手机用户不友好,那么有些时候,我们需要 ...

  8. Python学习笔记六--文件和输入输出

    6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. ...

  9. 黑马程序员—C语言的函数、数组、字符串

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...

  10. UVa 10020 - Minimal coverage(区间覆盖并贪心)

    Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose the min ...