第三章汇编语言与C语言3.1C语言与汇编语言的比较本课程全程使用C语言来开发S3C2410A。目前很少有用汇编语言来开发ARM系统了。相比较而言汇编语言的优势是执行效率高,但其劣势是代码效率较低,而C语言正好相反,其代码效率较高,执行效率较低。什么是执行效率?什么是代码效率?在嵌入式设计领域,一般执行效率就是程序的执行时间可以精确控制,从而可以使程序高效率的运行。采用汇编语言编写ARM程序,每一条指令的执行时间都是固定不变的(外部时钟确定),所以写出的程序每一步的执行时间都是可以精确控制的。这是采用汇编语言的优势所在。但是,相信有过用汇编语言进行程序设计经验的读者在读别人用汇编语言写的程序时都会觉得十分吃力,尤其在碰到一些编程习惯不好的coding,整个程序注释寥寥或者干脆没有,那么对于一般的设计人员来讲,这样的程序就是天书一卷了。这也就是所谓的程序可读性不高,不便于维护和移植重用。这也可以说是代码效率底下。C语言编写的程序相对来说可读性高,便于移植重用,结构灵活。一个注释完全,结构完整的C程序很容易就读懂了,而且我们还可以把一些常用的代码封装成函数,这样就可以根据需要来直接调用这些函数。C语言有了这些性质,相对于汇编语言其代码效率就较高了。C语言有其优点,必然在嵌入式领域内还有其不足的地方。采用C语言编写的ARM驱动代码需要经过编译器编译而生成相对应的汇编代码,最后生成可下载执行的二进制文件在这个过程中,所生成的汇编代码完全由编译器所决定,这样一来对于一条C语句来讲预先不知道所生成的汇编代码有几多,所以也就无从精确判断程序执行的时间,这种特质也就是所谓的执行效率相对较低。在嵌入式控制领域,有一些设计对于程序的执行时间需要精确的把握,大多数设计对于程序的时间要求没有那么精确。故此,一般情况下C语言完全能够胜任开发任务。如果在设计中碰到了需要严格把握程序执行时间的地方,可以根据需要采取C语言和汇编语言混合编程的方法来处理。3.2应用C语言开发ARM入门学过51单片机开发的读者都知道,控制单片机其实就是对其内部的一些寄存器进行配置和操作。ARM开发与单片机开发十分相似,只不过ARM的结构相对于单片机更为复杂,内部寄存器更多而已。1.访问S3C2410A的功能寄存器采用汇编程序可以对ARM的寄存器进行操作,而采用C语言开发驱动则需要定义寄存器的头文件。对于达盛的试验系统来讲,S3C2410A的寄存器定义头文件为2410ADDR.H。在这个文件中,所有的2410芯片开发所用到的寄存器全部都进行了定义。在用C语言开发程序时,必须先包含这个头文件,然后在主程序中可以直接对定义好的寄存器进行操作。//I/OPORT#definerGPACON(*(volatileunsigned*)0x56000000)//PortAcontrol#definerGPADAT(*(volatileunsigned*)0x56000004)//PortAdata#definerGPBCON(*(volatileunsigned*)0x56000010)//PortBcontrol#definerGPBDAT(*(volatileunsigned*)0x56000014)//PortBdata#definerGPBUP(*(volatileunsigned*)0x56000018)//Pull-upcontrolB上面几行程序就是从2410ADDR.H摘录出来的I/O口寄存器的部分定义。比如第一行定义意思是说端口A的控制寄存器命名为rGPACON,其在S3C2410A芯片中的访问地址是0x56000000,在编写程序时,可以直接给rGPACON赋值,实际上也就是给地址0x56000000赋值。例如:rGPGCON=rGPGCON&0xfff0ffff|0x00050000;上面这个操作其实是对寄存器rGPGCON进行了相应的配置。再比如第二行程序定义了端口A的数据寄存器并且命名为rGPADAT,其在S3C2410A芯片中的访问地址是0x56000004,我们也可以在程序中对rGPADAT进行赋值,例如:rGPGDAT=rGPGDAT&0xeff|0x300;2.跳转操作在ARM汇编指令中有相应的跳转指令可以使用,那么对应于C语言,跳转语句可以翻译成ifelse模式或者switchcase模式。3.循环操作在C语言中循环操作最为简单,可以采用for语句或者while语句都可以实现循环操作。4.C语言变量的位数ARM为32位CPU,在ARM开发中有时会需要定义8位、16位或者32位变量,这些变量实际上就对应着处理器中的通用寄存器。在一些特殊的时候还需要对数据精确到bit来操作,这样就需要定义特殊的位段结构来...