关于代码功率
MSP430系列的程序规划原则,有利于进步代码功率。应该指出,这些原则根本上是依据MSP430系列的硬件结构特色而提出的。
1.位域类型的履行时很慢的,所以应当在只是为了节约数据存储空间时才运用位域办法。假如用户有必要运用位域存储,能够用char或unsigned int的位屏蔽操作来替代位域操作。
2.在模块之外不运用的变量应当声明为staTIc,这样在编译时有或许使这些变量分配在寄存器中暂存,然后进步了代码功率。
3.尽或许运用unsigned数据类型。许多状况下,对unsigned数据类型的操作,比对signed数据类型的操作功率更高,特别关于除法和求模运算更是如此。
4.程序规划中应该运用ANSI-C原型函数。对ANSI函数的调用比对K&S函数的调用功率更高。
5.MSP430系列单片机对16位数据类型的操作功率最高。如:short、int、unsigned int类型等。一般来说,运用8位数据类型能够节约数据的存储空间,但这样并不会削减程序代码的存储空间;而关于运用32位数据类型,因为MSP320系列的结构并不直接支撑,履行的功率是较低的。
6.标量主动变量(scalar auto)一般分配在寄存器中,因而,只需有或许就应该用auto类型而不必staTIc类型。
7.函数的头两个参数是用寄存器传送的,因而,将参数传递给函数时,用参数办法常比用staTIc变量功率更高。
8.仿制结构和联合数据类型是开支很大的操作。应该尽量防止在程序运转中做结构和联合的赋值操作,防止以结构和联合数据类型作为函数的参数,防止让函数回来结构和联合数据类型。只需有或许,就应该选用指向结构和联合的指针来完成上述的各种操作。
9.函数中声明的无初值非标量主动变量(结构、联合和数组等),会在程序运转中每次调用函数时作数据的仿制操作。假如是常量,能够用staTIc const存储类来防止发生这种状况。
此外,选用C程序调用汇编子程序的办法也是进步代码功率的有用手法。
衔接指令文件的效果
使程序规划合适于用户的方针体系。每一个项目都需求一个包括方针体系存储器映射细节的衔接指令文件。它的文件扩展名为.xcl,能够用文本修正器来阅读其内容。
衔接指令文件有根本相同的结构。以MSP430F149C.xcl为例。文件中含有很多的注释行,以增加可读性。实践起效果的指令行并不多。
首先用-c指令将cpu类型界说为MSP430
-cMSP430
然后用一系列-Z指令以界说编译器运用的存储器段,别离界说了数据、仓库、信息、代码、中断向量等功用区域,指令如下:
-Z(DATA)UDATA0,IDATA0,ECSTR=0200-09FF
-Z(DATA)CSTACK#0200-0A00
-Z(CODE)INFO=1000-10FF
-Z(CODE)CODE,CONST,CSTR,CDATA0,CCSTR=1100-FFDF
-Z(CODE)INTVEC=FFE0-FFFF
再用-e指令界说合适用户的运用要求和空间约束的用于printf和scanf的底层输入输出函数,指令如下
-e_small_write=_formatted_write
-e_medium_read=_fomatted_read
最终,指明加载的C库(运转时刻库文件),以习惯不同CPU的差异,如是否含硬件乘法器等:
cl430ksm.r43
用户能够直接从ICC430子目录中挑选合适方针体系的衔接指令文件,可是,为了更好的适运用户的规划方针,也能够自行修正修正衔接指令文件。
C430的装备
设定方针机类型的头文件
依据方针机类型(例如MSP430F149)在源文件开端增加如下句子:
#include ‘MSP430X14X.h’
这个文件包括详细MSP430方针机器中特别功用寄存器的地址阐明。在后续的代码编写中就能够直接运用寄存器的称号。MSP430X14X.h文件的内容能够在软件的INC子目录下找到。
1.存储器的分配
经过衔接指令文件,能够阐明方针体系硬件环境中的ROM和RAM的地址。衔接的选项规则:
*ROM区域用于存储函数、常数和初始化值
*RAM区域用于存储仓库和变量
*非易失RAM区能够经过no_init类型修饰符和存储器#pragma编译指令来阐明将驻留变量。编译器将这种变量放在独立的no_init段中。它的地址规模由用户在非易失RAM区中指定。程序运转时体系不对这些变量作初始化。
2.仓库体积
默许的是512Bytes,用了行指令:-Z(DATA)CSTACK+200
3.输入输出
*printf和sprintf函数运用名为_formatted_write的通用格局化函数。ANSI规范版别_formatted_write
体积非常大,而它所供给的功用在不少运用中并不需求。为了削减存储器的开支,在规范C库中供给了两种能够替代的较小版别:
1)_medium_write
除了不支撑浮点数之外,它与_formatted_write相同。因而,假如运用%f,%g,%G,%e和%E阐明符将发生过错。_medium_write比_formatted_write小得多。
2)_small_write
与_medium_write挨近,可是对int类型只支撑%%,%d,%o,%c,%s和%x阐明符,而且不支撑位域和精度参数。_small_write巨细约为_formatted_write的10%—15%。
C430编译器的默许版别便是_small_write:-e_small_write=_formatted_write
要挑选完好的ANSI版别,能够删去这一行。
*简化printf
有时为了支撑特别输出格局的需求,或支撑非规范输出设备的需求,有必要订制特别的输出子程序。文件imwri.c中供给了高度简化的printf函数的源文件,其间不包括sprintf。这一源程序版别能够依照用户要求加以修正,然后把编译好的模块加入库中,替代原有的模块。
*scanf和sscanf
与printf和sprintf类似,scanf和sscanf运用名为_formatted_read的通用格局化函数。ANSI规范版别_formatted_read体积非常大,而它所供给的功用在不少运用中并不需求。为了削减存储器的开支,在规范C库中相同也供给了体积较小的版别:_medium_read。除了不支撑浮点数之外,它与_formatted_read功用相同,可是_medium_read比_formatted_read要小得多。
C430的默许版别是_medium_read。
4.硬件与存储器初始化
创立cstartup.r43的方针模块文件,然后用户应当在衔接指令文件中运用下列指令,使XLINK引证用户界说的CSTARTUP模块来替代库中的模块:
-A cstartup
-C library
在Workbench中,能够将修正后的cstartup文件加到用户的项目中,并在衔接指令文件中的library之前加上-C指令。