您的位置 首页 设计

OK6410裸机程序—hello world

上面已经解决了几个问题。现在我们的状态:可以在PC-OK6410之间进行tftp传输,确定了一下可用的地址空间,下面我们来说一下printf调试、…

上面现已处理了几个问题。

现在咱们的状况:能够在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 出来没?
没出来就找找哪里错了,找不出来的往后面跟啊童鞋们!!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/276907.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部