一般咱们开发单片机程序都是运用C言语的,为什么C言语比汇编便利呢?原因便是C编译器在为咱们做着很多的琐碎的安排翻译作业。在此感谢IAR,辛辛苦苦的劳作着,却没有辛苦钱!
好,咱们从新建一个工程开端,翻开IAR,空白,project,create new project,C,main,确认。给工程起个姓名,保存。OK,工程树立结束了。这时工程里现已有个main.c了,并且有一个完好的程序,如下:
#include “io430.h”
int main( void )
{
}
Make一下,保存作业区文件,就可顺畅编译通过了。
(本人所运用的IAR版别为5.3,为了能体会更好的IAR特性,请运用较新且较安稳的版别)
从头文件包括说起,这个io430.h是IAR为C言语所引荐的头文件,这个头文件以匿名结构体的方法对430的寄存器进行声明,匿名结构体现已在C11中归入规范C,这种声明方法在ARM中广为流传。之前较早的版别或许运用的是msp430.h,这个头文件都是以宏界说的方法对寄存器进行声明的,C和汇编都可以包括此文件,这里有丰厚的宏界说,如SELA__REFOCLK,挑选REFOCLK作为ACLK。这在io430.h是没有的,因而假如曾经的工程包括的是msp430.h,那么移植到运用io430.h将会呈现一些问题。
头文件的挑选依据自己的习气决议,可是像弄巧成拙相同把头文件改成#inlcude “msp430f149.h”就没有必要了,由于IAR现已主动帮咱们挑选了适宜的头文件,这在移植到其他的器材时,不用做任何更改;咱们所要做的便是在工程的option中,挑选咱们的device,咱们新建的这个工程默许的device为msp430f149,现在咱们替换器材为msp430f5418A,从头make一下。咱们来看工程左面的文件拓扑结构,如图1.1:
1.
2.
现在来了解一下一个耳熟的词汇:C运行时库
众所周知,在单片机上电瞬间,只要flash中有数据和代码,RAM的内容是不确认的。单片机履行的第一条指令肯定不是main函数,而是C运行时库的初始化函数,为咱们写的C代码建立C运行时环境。首要设置SP,也便是设置栈,SP一般设置为RAM的最高地址。其次便是初始化内存,初始化全局变量,静态变量,以及在RAM中的函数,这些数据都是从flash中复制过来的,因而咱们的变量不只仅占用着RAM,还有或许占有着一份flash(未初始化的全局变量和静态变量初始化为0,将未初始化的数据放在一个区域,只需求将这个区域清0即可,不需求从flash复制)。数据初始化结束后就开端从main函数开端了,履行咱们所写的代码。由于430的看门狗在复位之后是开着的,因而需求初始化数据量过大的话,就有或许导致看门狗溢出复位,然后main函数永久得不到履行。处理此问题的方法便是在程序中参加一个函数:int __low_level_init(void),在此函数中参加中止看门狗的句子,并回来1即可,__low_level_init函数将在初始化代码之前履行。
注:初始化代码并未包括在dl430xsfn.r43中,应该是由编译器独自生成的一段代码,我了解这些代码应该归于C运行时库的领域。这都是我的个人见解。
C运行时库还包括着一切的C规范库,如strlen、memcpy等函数;还有乘除法的完成等等。