注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

一步一步写嵌入式操作系统2—入门的程序  

2011-10-03 23:52:58|  分类: ARM学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一步一步写嵌入式操作系统2—入门的程序
我们写一个非常简单的程序,打印一个“my helloworld”的字符串,程序如下:
#define UFCON0  ((volatitle unsigned int*)(0x50000020))

void helloworld(void)
{
 const char*p = "my helloworld\n";

 while (*p)
 {
  *UFCON0 = *p++;
 };
 
 while (1);
}
我们用如下命令来编译他:
arm-elf-gcc -O2 -c helloworld.c
这里我们使用了上文中的配置好的环境,这个命令是生成一个.o的文件,然后再使用下面的命令链接:
arm-elf-ld -e helloworld -Ttest 0x0 helloworld.o -o helloworld
我们-e这个命令选项来指定程序的入口函数,这个与平时看到的MAIN函数入口有所不同,但实际上意义是一样的,没有哪条法律规

定或者说天生就应该是main必须做为主函数的入口。
然后再用:
arm-elf-objcopy -O binary helloworld helloworld.bin
来形成二进制的可执行文件,然后再按照上文中讲的写做skyeye.conf的方法重新写一个配置文件,并将其与bin,skyeye三个放到一

起,然后执行./skyeye,即可看到我们需要的效果。

这里有一种简单的方法,即可以实现一个脚本文件来达到链接目标文件的目的,先看一个具体的链接文件,加深一下印象:
ENTRY(helloworld)
SECTIONS
{
. = 0x00000000;
.text :
{
 *(.text)
}
. = ALIGN(32);
.data :
{
 *(.data)
}
. = ALIGN(32)
.bss :
{
 *(.bss)
}
}
将其保存为helloworld.lds.
这里需要说明的是,那个点儿符号后面要有一个空格,否则会报错误。其它的倒没有别的特别的。这样我们可以改用下面的方法来

达到链接的目的:
arm-elf-ld -T helloworld.lds helloworld.o -o helloworld
这样的话和前面直接用语句生成的结果一样。
一步步的,接近了我们的目的,但在实际情况里,大家都知道,一般系统的起始部分大多是用汇编语言实现的,然后再跳到具体的

用C语言写的文件函数中去。这里,也要模拟一下具体的方法:
在start.s文件中写下列代码:
.arch armv4
.global _start

.equ REG_FIFO, 0x50000020

.text
.align 2

_start:
 ldr r0,=REG_FIFO
 adr r1,.L0
 bl helloworld
.L1:
 b .L1

.align 2
.L0: 
 .ascii "my helloworld\n\0"
然后再重写一个C语言的代码程序helloworld.c:
int helloworld(unsigned int *addr,const char *p)
{
 while(*p)
 {
  *addr=*p++;
 };
 return 0;
}

这样我们重新编译,然后再使用arm-elf-ld  -e _start -T helloworld.lds start.o helloworld.o -o helloworld
可以再次实现我们的目标。
讲到这里,makefile文件就不得不祭出来,因为以后的文件会越来越多,每次都手动的生成,会很累人的,这个就不把代码写下来

了,注意的是:命令行必须要以tab键开头,切记,切记。
生成MAKEFILE后,直接make,即可生成前面好多步骤才生成的东东,要想重新编译,只要执行make clean,然后再make,一切OK。
今天到这为止,明天再接着。每天前进一点点。
积少成多,积水成渊。

  评论这张
 
阅读(1184)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017