我的第一个裸机程序

学电子专业的同学伤不起啊,每天都要面对那复杂的数学运算。生活中充满了数字,也就没有什么时间来搞点业余爱好了。只有午睡时有点空来写点;

学习过单片机的应该都写过一点点程序,可是这样一个嵌入式开发平台如何能够做一些很简单的事呢?我用我学过的单片机思路来写点ARM11裸机程序。

我用的是FriendlyARM tiny6410。我写的一个最容易的LED程序,程序我只用了C语言,没有用汇编(汇编真的不是那么好写,蛋疼)

下面是我写的程序的源代码:

//Copyright  - (c) 2011/1/10 xueyang

#define rGPKCON0        (*(volatile unsigned *)(0x7F008800))
#define rGPKCON1        (*(volatile unsigned *)(0x7F008804))
#define rGPKDAT         (*(volatile unsigned *)(0x7F008808))
#define rGPKPUD         (*(volatile unsigned *)(0x7F00880C))

#define rMPLLCON      (*(volatile unsigned *)0x7E00F010)
#define rCLKDIVN      (*(volatile unsigned *)0X7E00F020) 
void delay(void);
_start(void)
{
    rGPKCON0 = (rGPKCON0 & ~(0xffffU<<16))|(0x1111U<<16);
    rGPKPUD  = (rGPKPUD  & ~(0xffU << 8))|(0x00U<<8);
    for(;;)
    {
        int data = 0x09;
        rGPKDAT = (rGPKDAT & ~(0xf<<4)) | ((data & 0xf)<<4);
        delay();
        data = 0x06;
        rGPKDAT = (rGPKDAT & ~(0xf<<4)) | ((data & 0xf)<<4);
        delay();
    }
}
void delay(void)
{
    unsigned int k;
     for(k = 0; k < 200000; k++);
}

 

程序是非常的容易的,我这里就不多讲了。

可以用仿真器下载到开发板上去,也可以用dnw下载到开发板(方法的驱动/程序源码后面有时间再写一篇)

我们程序中可以不用汇编,

我们的C编译器会给我们带来一些新的问题:

1.头文件

2.库函数

3.地址

4.多个程序文件编译时的依赖

但编译要注意,我用的下面的命令编译来解决目前面临的问题(环境是之前配置好的交叉编译环境):

arm-none-linux-gnueabi-gcc -c hello.c -o hello.o                                        //编译生成可执行文件

arm-none-linux-gnueabi-ld -Ttext=0x50000000 hello.o -o hello -e _start      //编译生成无.o的文件,指定_start处开始运行,并指定运行地址0x50000000

arm-none-linux-gnueabi-objcopy -I elf32-littlearm -O binary hello hello.bin              //去头(格式转换)

由于水平有限,若有什么错误,欢迎大家指正!<xueyang1122@gmail.com>

posted @ 2012-02-22 14:06  blunsmith  阅读(640)  评论(0编辑  收藏  举报