以前自学arm的时候就接触过裸机的一些内容,但是有很多东西一直没有弄明白,现在自己报了培训班来系统的学习arm的内容。
已经学了有2个月了,最近刚好在学裸机开发的内容,和以前单片机开发大体上是差不多,都是在玩寄存器,但是有很多地方还是值得去注意的。下面分别说下自己的体会。
1-开发平台
相信用单片机的肯定也一定是用的集成开发环境IDE,比如有什么keil、IAR等。arm裸机开发当然也会是在一些集成环境中去做,不过由于arm到现在基本上很少有芯片是为了跑裸机来设计的,基本上都是要设计到操作系统。所以像keil什么的对很多arm的芯片是不支持的。这时候就得要自己想办法搭这样的一个开发环境,目前培训机构所学的是用eclipse软件来做。至于为什么要用这个软件,个人觉得是因为它可以实现自己选择编译器,调试器等东西(目前我也只接触了这两个)。
这里提出来两个概念编译器和调试器。一般一个集成开发环境都会有编译器、调试器、文本编辑器这三个东西。
编译器就是我们make project的一个软件,调试器就是在debug的时候用的软件,文本编辑器自然就是我们写入代码的地方。编译器有很多种GCC,ICC(avr单片机的一种)等,不同的IDE可能会集成不同的编译器。gcc对于不同的硬件平台也有不同的版本,有x86的,有arm的,有avr的等等,要做arm裸机开发就必须使用arm对应的gcc。
调试器目前我知道的主要是gdb,大家也基本都用gdb的包括一些IDE的大多用的也是GDB。目前我这边使用的是arm-none-eabi-gdb。
文本编辑器就不用说了。
2-编程
用单片机有很多东西都不需要自己处理,当然高手在处理复杂的单片机程序也会自己去处理的,比如makefile,这个是个很重要的东西,就是告诉编译器如何编译我们写好的代码,当我们代码比较多的时候就必须使用makefile来管理。
当然makefile只是一方面,在编程上比较重要的区别是程序从哪里开始入口的,这个是我以前做单片机开发的时候一直没有弄明白的。只知道c编程的时候从main函数开始写,就完事了。但实际上是怎么跑到main中的一直也不明白,虽然以前也学了汇编,但是在开发单片机的时候从来都没有写过汇编的东西,所以就不了解汇编的必不可少性。
arm程序的开始执行地方,也就是pc刚开始的值,是在编译的时候在makefile中由—Ttext指定地址,当然这个地址也可以在map.lds文件中指定。这个地址的处理通常会用汇编处理,在汇编中写好中断向量表和处理、一些关键设备的初始化,然后用一个b命令跳转到c代码中的main函数中去执行。
3-寄存器
由于我接触arm的这个编程也不是很深,目前感觉在写寄存器上和以前不一样的就是:以前做单片机寄存器和地址的对应一般在集成开发环境中就已经写好了,但是在现在需要使用什么寄存器都需要自己去写宏定义定义地址。这个事个人感觉还只是目前目前我的了解还比较少,像这些寄存器定义地址什么的去了公司肯定会直接用前人的,要不然每次开发一个项目都要自己去写定义地址表,太浪费时间,效率太低。