Mkefile文件编写及点亮两个led的mini2440裸机程序

Makefile的语法规则:

                target: ....:prerequisites.....
                command
target:目标文件。
prerequisites:生成的目标所需要的文件或目标,即生成目标文件所要的依赖。
command:make时所执行的命令。

GCC:
        -c 编译或汇编文件,但是不链接。预处理后的代码送往标准输出。
        -o 要求编译器生成制定文件名的目标文件。
        -O 要求编译器对代码进行基本的优化。 
       arm-linux-ld:链接.o文件生成目标文件,通过-Ttext addr、-Tdata addr、-Tbss addr,指明代码段、数据段、bss段。
       arm-linux--objcopy:把目标文件转换为所需要的文件格式,如二进制文件。
       arm-linux-objdump:进行反汇编。

MINI2440裸机程序,点亮两个LED。

mini2440的cpu内部有4KB的ARM,外部有64MB的SDARM,有2MB的NOR FLASH,256MB的NAND FLASH。如果从NAND FLASH启动,cpu会强制把NAND FLASH 的前4KB代码,读到cpu内部的ARM中并开始取指执行,这都是通过硬件电路实现的。如果从NOR FALSH启动,会直接在NOR FALSH中执行程序。NOR FALSH 拥有完整的数据、地址总线并且其能够一字节为单位进行读取。NAND FALSH数据总线和地址总线串行,并且以块为单位进行数据的读取。所一裸机程序要烧写到NAND FLASH中,在加电启动时前4KB被读取到cpu内部的ARM,完成CPU的初始化。

裸机程序如果较小没有函数调用则可以直接下载到NAND FLASH中运行。如果有函数调用并且不超过4KB要初始化堆栈。如果用C写的就必须用启动文件初始化堆栈,因为执行main函数时必须被调用,在操作系统级别操作,系统的库会调用main函数,裸机程序要用启动文件调用main,既然被调用,就需要保护现场,恢复现场,必须要有堆栈保存这些信息。如果大于程序4KB要完成CPU的内存管理等初始化操作。同时一定要关闭看门狗,否则cpu会一直重启。


Makefile文件的内容:
<span style="font-size:14px;">led:start.S led.c
	arm-linux-gcc -g -c start.S -o start.o
	arm-linux-gcc -g -c led.c -o led.o
	arm-linux-ld  -Ttext=0x00000000 -g start.o led.o -o led 
	arm-linux-objcopy -O binary led led.bin
clean:
	rm -f led.o led led.bin start.o *~</span>
目标为led,依赖start.c和led.c。

ledd.h的内容:

<span style="font-size:14px;">#ifndef _LEDD_H_
#define _LEDD_H_
#define GPIO  0x56000000 /*GPIO的基地址*/
#define GPBCON (*(volatile unsigned long *)(GPIO + 0x10)) 
#define GPBDAT (*(volatile unsigned long *)(GPIO + 0x14))
#endif</span>

led.c的全部内容:

<span style="font-size:14px;">#include "ledd.h"
int main()
{  
   GPBCON &=  (~(0x3 << 12 | 0x3 << 14));
   GPBCON |=  ( 0x1 << 12 | 0x1 << 14);
   GPBDAT &= ~(0x1 << 6 | 0x1 << 7);


   while(1);
}</span>

start.c的全部内容:

<span style="font-size:14px;">@#############################################################
@        关闭看门狗,设置堆栈,为调用C做准备
@#############################################################

.text
.global _start
_start:
         
            ldr r0, =0x53000000  @设置看门狗地址
            mov r0, #0x00        @关闭看门狗       

            ldr sp, =0x4*1024    @设置堆栈,4KB

            bl  main             @调用函数
            </span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中编写mkefile编写! 部分内容: 什么是makefile?或许很多Windows 的程序员都不知道这个东西,因为那些Windows 的IDE 都为你做了这个工作,但我觉得 要作一个好的和professional 的程序员,makefile 还是要懂。这就好像现在有这么多的HTML 的编辑器,但如果你想成为一个专 业人士,你还是要了解HTML 的标识的含义。特别在Unix 下的软件编译,你就不能不自己写makefile 了,会不会写makefile, 从一个侧面说明了一个人是否具备完成大型工程的能力。 因为,makefile 关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复 杂的功能操作,因为makefile 就像一个Shell 脚本一样,其中也可以执行操作系统的命令。 makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件 开发的效率。make 是一个命令工具,是一个解释makefile 中指令的命令工具,一般来说,大多数的IDE 都有这个命令,比如: Delphi 的make,Visual C++的nmake,Linux 下GNU 的make。可见,makefile 都成为了一种在工程方面的编译方法。 现在讲述如何写makefile 的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make 各不相同,也有不同的语法, 但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU 的make 进行讲述,我的环境是RedHat Linux 8.0,make 的版本 是3.80。必竟,这个make 是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。 在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各 位查看相关的编译器的文档。这里所默认的编译器是UNIX 下的GCC 和CC。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值