今天,主要内容为S5PV210编程_汇编调用C语言及Makefile规则:
一、Makefile最简单的规则 二、汇编语言调用C程序
注意:如果前面的内容都看完了,且“没有明白”或者“操作成功”的,请回过头,人人真真的再看一看,如果还是不能够明白,就想一想其他的办法吧~如百度提问、找我、找一些高手...为什么这么说?因为吧,这些都是基础,基础不代表水平,但是却决定走的长度。 我现在就严重觉得自己基础不足!很多东西都是建立在空中,坍塌很容!
加入看着、看着,突然发现我的文章写得非常差劲,或者不再需要了,我会非常开心。 我写这些的目的,根本原因就是希望“更多的朋友能够从底层还是了解嵌入式”... 现在网上关于S5PV210的资料不少,甚至学习过Arm11的几天就能够上手了。 但是,我还是认为,要学好嵌入式系统,不能够拘泥于外表。
说这些,并不是要说我多么厉害,也不是为了说我多么伟大。只是在强调基础的重要! 中国有句古话,“万丈高楼平地起,地基却没有打牢,塌了”... O(∩_∩)O哈!我杜撰的。接下来文章会非常重要!
第一部分 Makefile最简单规则
1、 说明
为什么要先学习Makefile规则呢?告诉你,我不远再敲那么多代码了! 中国有句古话说的好,“想要成为一名优秀的程序员,就要学会偷懒...” 哈哈,当然这句是我杜撰的了!
不过,Makefile可不是偷懒,这个是一个高级程序员的思想的体现! 像这个“流水灯似的程序”,才几行,根本不能够体现Makefile规则的伟大,更体现不出一个高级程序员的思想,其实,这个思想也是在一方面指“编程思想”了! 在最前面学习Makefile也是为了强调编程思想对于程序员的重要性! 可以说,“编程思想”决定一个程序员的水平以及成就。
我只说,我写S5PV210程序的时候是先写Makefile,再写程序的。 如果,对这句话不理解,不会影响下面的学习!!O(∩_∩)O哈哈~废话少说,开始正题。
2、改装上一个程序
上一篇文章我们的只有一个“led.s”文件,在执行一些命令后生成了我们最后下载到开发板的程序。
这篇文章,要把后期执行的命令写入一个文件。然后用一条命令去完成它,其实,这个就是传说中的最简单的Makefile了。
当然,我们在以后的文章中逐渐去完善。
首先,用vi编辑去建立一个Makefile文件,其实,这个名字可以用你任何想要的,但是需要加入-f参数,最主要的经过多年发展,Makefile这个名字已经被规范化了,所以,-f参数的使用,玩玩还行,正规程序,用于存档的还是用Makefile吧。O(∩_∩)O~潜规则哦~
led.bin : led.o arm-linux-ld -Ttext 0 -o led.elf led.o arm-linux-objcopy -O binary led.elf led.bin led.o : led.s arm-linux-gcc -c -o led.o led.s
操作方法:vi Makefile
直接进入的是“命令模式”,需要按“i”键进入“文本模式”。
另外,这里我们再学一个“单行模式”的命令,还记得进入“单行模式”的方法吗?
在“文本模式”按”ESC”键,进入“命令模式”,或者直接在“命令模式”下,输入“:”进入单行模式,在进入单行模式后,输入“set nu”。
然后,我们将上面的命令写入进去后,保存退出!
还记得保存退出的方法吗? 在单行模式下,输入“wq”...
没有把这些常用命令一次学完,一方面是担心记不住,还有就是有的时候多的我都想不起来! 而且,如果,一下子说出来,岂不是在学习Linux...
我们看看这篇Makefile,看之前,首先要知道两个概念,“目标”、“依赖”! 目标,写在前面,与依赖用“:”隔开。
如本文,led.bin文件是目标,led.s文件是依赖。
查看时,会确定led.bin为最终文件,依赖led.s,然后,就会去找led.s了。
然后发现下面的三条命令,在输入命令前,要输入一个
这就完事了,想要使用Makefile,就用make一下就Ok了... 操作方法: make
当然,面对这样一个小程序的时候,根本不能够体现Makefile的强大,试想一下,当你面对成千上万个程序的错综复杂关系时候,你会不会有些痛苦?如果你修改一个文件后呢? 当然,我们还有集成开发环境,这才是答案,O(∩_∩)O哈! 好了,我们接下来对Makefile升级,为它添加伪指令“clean”,去删除中间文件“*.o”“*.elf”,这个同样可以用其他的名字,但是多年的使用,几乎成为规范了!我虽然不喜欢墨守成规,但还是非常喜欢用这个。
伪指令要如何写呢?其实,就是指没有“依赖”的“目标”会去直接执行下面的命令。 如何使用伪指令?用make调用即可。 操作方法:make clean
第二部分 汇编语言调用C程序
1、说明:本程序为汇编调用C程序,实现流水灯功能 创建启动文件“start.s”,主要为C语言设置栈,栈的作用可以用于存储局部变量什么滴~ 下面给出文件内容及其功能介绍: .global _start
_start: ldr sp, =0xD0037F80 #设置栈,以便调用c函数 #栈的地址是任意选取的,但是要是一块不用的空区域
#这里面我们就先把它放在这个地址了,以后会有更先进的方法(DDR) bl main #调用C函数, 使LED闪烁, #这个是可以随便定义的,但是要在函数里面的main也修改,这个就是C程序的入口
halt: #防止程序跑飞 b halt
汇编语言部分是不是很简单?的确如此,它什么都没有做,就是在为C语言开发设置栈。 下面我们看看C语言程序。
建立C程序文件,我的就叫做“led_lsd.c”:
要求,文件内部主函数必须与汇编语言函数bl跳转过来的名字相同,我的就叫做main了,强烈建议命名为main,多少年都这么过来了。
#define GPJ2CON (*(volatile unsigned long *) 0xE0200280) #define GPJ2DAT (*(volatile unsigned long *) 0xE0200284)
#define uint unsigned int
void delay(uint delay){ while(delay--); }
void gpioInit(void){ GPJ2CON = 0x00001111; GPJ2DAT = 1; }
int main(void){ uint i = 1; uint j = 1; gpioInit(); while(1){ j = ~i; GPJ2DAT = j; i = i+i; if(i == 16) i = 1; delay(0x100000); } }
C程序文件就这些了,程序很简单我就不解释了。
可以对比着我们上一个的汇编语言程序看看,我把两个的操作过程写的一模一样了。 至于,volatile 的作用就是一个防止被编译器优化的命令。详细的就查一查百度... 下面我们看看Makefile文件。
对比于我们前面的Makefile,没有加入什么新东西。 只是将最后的目标文件led.bin有了两个依赖。 我就不多说了。
led.bin : start.o led_lsd.o arm-linux-ld -Ttext 0 -o led.elf start.o led_lsd.o arm-linux-objcopy -O binary led.elf led.bin
start.o : start.s arm-linux-gcc -c -o start.o start.s
led_lsd.o : led_lsd.c arm-linux-gcc -c -o led_lsd.o led_lsd.c
clean : rm -f *.o rm -f *.elf
用汇编语言调用C程序的实现就是这些了。 但是让人不满意的地方有很多,比如,我们在操作这四个LED的同时,会影响其他的IO口。 比如,我们的延时函数的函数体写在了led_lsd.c文件下。
所以,我们要对这个流水灯再一次进行升级,让它更漂亮一些。 这个将在下一篇文章内完成,同时对Makefile也进行一下升级,Makefile以后的变更更容易!
效果我就不展示了,和汇编语言的一样。
这篇文章的内容不是很多,但是要学习的东西却是非常多的。
尤其是Makefiel规则的使用,我会分享一个网络上的热心高手分享的资料 同时在这里表示感谢!O(∩_∩)O哈!
作者:小王
发布于: www.armdiy.cn
联系方式: QQ: 1320465765
TEL:18745950097