OK6410裸机程序---hello world

上面已经解决 了几个问题。
现在我们的状态:可以在PC - OK6410 之间进行tftp传输,确定了一下可用的地址 空间,下面我们来说一下printf调试
因为没有jlink,只能用printf调试,你也许会问,我们自己实现printf么?答曰:不是,我们只是弄个hello world,何必那么认真呢?
printf函数是uboot 实现的,我们只需要调用就行了。当然了,这个首先得到你uboot 的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了。

下面就可以下到板子 上运行了,把hello.bin放在你PC上的tftp目录下面。板子上电 ,停留在uboot界面上。
tftp 50000000 hello.bin
go 50000000 (跳到这个地址执行,uboot的命令)
hello world 出来没?
没出来就找找哪里错了,找不出来的往后面跟啊童鞋们!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值