我的第一个裸机程序
学电子专业的同学伤不起啊,每天都要面对那复杂的数学运算。生活中充满了数字,也就没有什么时间来搞点业余爱好了。只有午睡时有点空来写点;
学习过单片机的应该都写过一点点程序,可是这样一个嵌入式开发平台如何能够做一些很简单的事呢?我用我学过的单片机思路来写点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>