上一篇文章写的是linux下通过gcc完成程序源文件的编译执行的过程。以及makefile文件的编写,最后在终端平台输出myhello word!
有了这个基础,这次学习的就是通过linux编译生成的代码在ARM上完成硬件实现。因为还不涉及到系统移植,所以还是裸板程序开发。


1.源代码编写

ARM裸板程序需要代码原料主要包括:汇编文件,C文件,makefile文件。每个文件都有各自功能。
(1)汇编文件
完成关看门狗;配置时钟;初始化sdram;设置栈;以及跳转到C函数执行入口(相当于main函数),代码如下(该例程不需要配置时钟和sdram)。

@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************       

@注:正常汇编程序还需要初始化时钟,SDRAM功能,但对于点亮LED不需要。直接使用12Mhz
.text
.global _start
_start:                                             @程序代码段开始处,各段在链接脚本定义
                ldr     r0,=0x53000000  @看门狗控制寄存器地址(32位地址赋值语句,r0地址为0x53000000) 
                                      @ ldr和mov区别就是,ldr传输32位数据,而mov只能传8位数
                mov     r1,  #0x0        @立即数赋值给r1寄存器
                str     r1,  [r0]       @把r1寄存器内的数据0x0给r0地址

              @以上三条语句为看门狗控制寄存器赋值为0

              ldr   sp,= 4*1024      @设置堆在大小为4K(NAND FLASH前4k)
                bl      main                        @跳转 到main函数,同时保存了下一条指令地址
haltloop:

(2)C文件
汇编的代码量相对较少,只执行一些必要的初始化功能,真正功能部分在C文件里。C文件主要执行:寄存器地址宏定义;外设初始化;功能实现等。

本例点亮的led引脚是GPF4,因此需要查询2440的参考手册,查看GPF的相关寄存器地址,主要配置的寄存器是GPFCON(控制寄存器)和GPFDAT(数据寄存器)。GPFCON主要控制引脚的工作模式(模式有:输入,输出,复用),其中每两位控制一个引脚的状态,从下图可以看出:
这里写图片描述

引脚的高低电平由GPFDAT控制,每一位控制一个引脚,如图:
这里写图片描述

所以学会看芯片手册还是很重要的,明白各个寄存器并进行编程,同时应该掌握移位操作,在寄存器编程比较常用。该部分代码如下:

#define GPFCON          (*(volatile unsigned long*)0x56000050)
#define GPFDAT          (*(volatile unsigned long*)0x56000054)
#define GPFUP         (*(volatile unsigned long*)0x56000058)
#define GPIO_Pin_0       ((volatile unsigned char)0x00)
#define GPIO_Pin_1       ((volatile unsigned char)0x01)
#define GPIO_Pin_2       ((volatile unsigned char)0x02)
#define GPIO_Pin_3       ((volatile unsigned char)0x03)
#define GPIO_Pin_4       ((volatile unsigned char)0x04)
int main()
{
    GPFCON =  0X01<<(GPIO_Pin_4*2);         //GPF_4输出模式
    GPFDAT = ~(0X01 << (GPIO_Pin_4));      //GPF_4输出0
    return 0;
}

(3)makefile文件
编写编译规则,和上篇文章原理一样。linux有专门针对ARM的编译工具,主要用到的有这个3个:

  1. arm-linux-gcc:主要在文件编译时,由(.C/.S)文件编程成.o目标文件时使用。
  2. arm-linux-ls:主要对所有.o目标文件链接生成一个可执行文件
  3. arm-linux-objcopy:主要对可执行文件进行二进制转换成.bin可以烧录用的文件

文件代码如下:

led_on.bin : crt0.S  led_lighton.c
    arm-linux-gcc -g -c -o crt0.o crt0.S
    arm-linux-gcc -g -c -o led_lighton.o led_lighton.c  
    arm-linux-ld -Ttext 0x0000000 -g -o led_on_elf  crt0.o led_lighton.o
    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
    rm -f   led_on.bin led_on_elf *.o

上述的3个文件分别为:crt0.S,led_lighton.c,Makefile。这是最简单的例程文件了,合适入门。代码文件下载地址链接:
http://download.csdn.net/download/ludaoyi88/10151739

1.文件编译链接

汇编文件和C文件需要编译链接后生成可执行文件,可执行文件再转换成.bin二进制文件,才能烧录到开发板上执行。而这些编译链接与转换都在makefile里写好,只需在linux终端输入make命令执行即可。
通过secureCRE远程登录到linux主机(这里用虚拟机),FTP文件传输工具连接到linux主机,在Windows下编写上述3个代码文件,整个过程和上篇文章一样,不再赘述。
将3个代码文件上传上linux主机的相关文件路径下,在终端键入make命令,执行makefile文件,执行结果如下图:

这里写图片描述

上述可以看到生成了led_on.bin的二进制文件,将此文件烧录到开发板,烧录方法可以用:oflash,dnw,tftpd,nfs等方法下载,前3种方法之前文章有讲解使用方法。这里使用Windows下由dnw下载程序,先将二进制文件传入window再下载(开发板应拨码至nand)。如图:

这里写图片描述

下载成功后,复位开发板,可以看到一个led灯变亮。效果如图(成功咯O(∩_∩)O哈哈~)。这仅仅是裸板开发的入门,如果有其他外设话就复杂了,同志仍需努力!
这里写图片描述