例 11-5
PICC 会主动参加代码完成中止现场的保护,并在中止结束时主动康复现场,所以编程
员无需象编写汇编程序那样参加中止现场保护和康复的额定指令句子。但假如在中止服务程
序中需求修正某些大局变量时,是否需求保护这些变量的初值将由编程员自己决议和施行。
用 C 言语编写中止服务程序有必要遵从高效的准则:
&O1540;
&O1540;
递归调用的问题,此函数有必要为中止服务独家专用。既如此,无妨把原本要写在其
它函数内的代码直接写在中止服务程序中。
&O1540;
算不呈现递归调用的问题,光在中止进口和出口处为了保护和康复这些中心暂时变
量就需求许多的开支,严重影响中止服务的功率。
中档系列 PIC 单片机的中止进口只需一个,因而整个程序中只能有一个中止服务函数。
11.6.5
PICC 供给了较完好的 C 规范库函数支撑,其间包括数学运算函数和字符串操作函数。
在程序中运用这些现成的库函数时需求留意的是进口参数有必要在 bank0 中。
假如需求用到数学函数,则应在程序前
用字符串操作函数,就需求包括“#include ”头文件。在这些头文件中供给了函数
类型的声明。经过直接检查这些头文件就能够知道 PICC 供给了哪些规范库函数。
C
printf/sprintf 是一个十分大的函数,一旦运用,你的程序代码长度就会添加许多。除非是在
编写实验性质的代码,能够考虑运用格局化打印函数以简化测验程序;一般的终究产品规划
都是自己编写最精简的代码完成特定格局的数据显现和输出。原本,在单片机运用中输出的
数据格局都相对简略并且固定,完成起来应该很简略。
关于规范 C 言语的操控台输入(scanf)/输出(printf)函数,PICC 需求用户自己编写
其底层函数 getch()和 putch()。在单片机体系中完成 scanf/printf 原本就没什么太多意义,如
果一定要完成,只需编写好特定的
出格局化的数据。
程序时相同能够在 C 原程序中界说,具体办法如下:
__CONFIG (HS & UNPROTECT & PWRTEN & BORDIS & WDTEN);
上面的关键词“__CONFIG”(留意前面有两个下划线符)专门用所以芯片装备字的设
定,后边括号中的各项装备位符号在特定类型单片机的头文件中现已界说(留意不是
头文件),相互之间用逻辑“与”操作符组合在一同。这样界说的装备字信息终究将和程序
代码一同放入同一个 HEX 文件。
在这里列出了适用于
装备字界说办法相似,运用前查阅一下对应的头文件即可。
#define RC
#define HS
0x3FFF // RC 振动
0x3FFE // HS 方式
#define XT
#define LP
0x3FFD // XT 方式
0x3FFC // LP 方式
#define WDTEN
#define WDTDIS
#define PWRTEN
0x3FFB //
0x3FF7 //
#define PWRTDIS
#define BOREN
#define BORDIS
0x3FBF //
#define UNPROTECT
#define PROTECT
例 11-6 头文件预界说的装备信息符号
11.7.2
PIC 单片机中的符号单元界说能够用下面的__IDLOC(留意前面有两个下划线符)预处
理指令完成,办法如下:
__IDLOC (1234);
其特别之处是括号内的值悉数为 16 进制数,不需求用“0x”引导。这样上面的界说就设定
了符号单元内容为 01020304。
成功、程序编写完成后即能够经过 MPLAB 环境下的项目管理东西完成程序的编译、衔接和
调试。它们的意义别离
是:
-项目保护(Make):MPLAB 检查项目中的原程序文件,只编译那些在前次编
译后又被修正过的原程序,终究进行衔接;
-项目重建(Build All):项目中的一切原程序文件,不论是否有修正,都将被
从头编译一次,终究进行衔接。
也能够经过 Project 菜单挑选“Make”或“Build All”完成项目编译。不论选用何种方
式,在发动编译进程前一般都要设定一些编译选项。
11.8.1
在挑选 PICC 作为言语东西并树立了项目后,相同经过菜单项 Configure&O1616;Select Device
在 MPLAB 环境中挑选具体单片机类型。请回忆一下例 11-1 的代码,咱们在原程序一开始
运用了“#include ”完成了相关单片机的一些预界说符号的直接引证,但没有具体指
明是哪一个类型。实践上,“pic.h”头文件仅仅一个简略的管理东西(条件判别),它会依照
MPLAB 所挑选的特定类型的单片机,把真实对应的头文件包括进来。有爱好者能够直接用
文本编辑东西翻开 pic.h 文件检查其是怎么依据不同的单片机类型包括对应的头文件。
这样对编程员而言,程序中只需加上一句“#include ”即可。
11.8.2
参阅第三章
PICC 言语东西时对话框的内容和用 MPAMS 汇编东西比较彻底不同。图 11-3 为 PICC 编译
环境下一般选项设定的界面。
在此界面中用户仅有能改动的是编译器查找头文件时的指定途径(Include Path),实践
上假如编译器装置没有问题,在此界面中这些一般选项的设定无需任何改动,编译器会主动
到缺省确定的途径中(编译器装置后的相关途径)查找编译所需的各类文件。
%C3%82%C2%B3%C3%83%C2%8C%C3%82%C2%BD%C3%83%C2%8C%C3%82%C2%B3%C3%83%C2%8C.files/9.jpg” src=”file:///F:/data/%C3%83%C2%8F%C3%83%C2%82%C3%83%C2%94%C3%83%C2%98/PIC%C3%82%C2%B5%C3%82%C2%A5%C3%83%C2%86%C3%82%C2%AC%C3%82%C2%BB%C3%83%C2%BAC%C3%83%C2%93%C3%83%C2%AF%C3%83%C2%91%C3%83%C2%94%C3%82%C2%B1%C3%83%C2%A0%3Cwbr%3E%C3%82%C2%B3%C3%83%C2%8C%C3%82%C2%BD%C3%83%C2%8C%C3%82%C2%B3%C3%83%C2%8C.files/9.jpg” />
大局选项将影响项目中一切 C 和汇编原程序的编译,具体的设定内容见图 11-4。其间
有必要重视的有:
&O1540;
就有必要打钩选中。这样编译后的成果就能确保
分的程序和数据空间)不被运用程序所占用。
&O1540;
是无符号数。假如在规划中需求运用带符号的‘char’型变量,此项就应该被选中。
&O1540;
‘double’型的双精度浮点数变量的完成长度为 24 位(等同于一般 float 型浮点数)。
在这里能够挑选使其长度达 32 位。这样数值核算的精度将得到进步,但代码长度
将添加,核算速度也会下降,所以请在权衡利弊后作出你自己的决议。
11.8.4
项目中一切的 C 原程序都将经过 C 编译器编译成机器码,这些选项决议了 C 编译器是
怎么作业的。一切选项又分为两组:一般选项(General)和高档选项(Advanced),别离见
图 11-5A 和 11-5B。
C 编译器的一般选项最重要的便是针对代码优化的设定。假如没有特别原因,应该设定
大局优化等级为 9 级(最高档别优化),一起运用汇编级优化,这样终究得到的代码功率最
高(长度和履行速度两方面)。按笔者的运用经历,仅从代码长度去比较,运用最高档别优
化子孙码长度至少能够削减 20%(2K 字以上的程序)。并且 PICC 的优化器适当牢靠,一般
%C3%82%C2%B3%C3%83%C2%8C%C3%82%C2%BD%C3%83%C2%8C%C3%82%C2%B3%C3%83%C2%8C.files/11.jpg” src=”file:///F:/data/%C3%83%C2%8F%C3%83%C2%82%C3%83%C2%94%C3%83%C2%98/PIC%C3%82%C2%B5%C3%82%C2%A5%C3%83%C2%86%C3%82%C2%AC%C3%82%C2%BB%C3%83%C2%BAC%C3%83%C2%93%C3%83%C2%AF%C3%83%C2%91%C3%83%C2%94%C3%82%C2%B1%C3%83%C2%A0%3Cwbr%3E%C3%82%C2%B3%C3%83%C2%8C%C3%82%C2%BD%C3%83%C2%8C%C3%82%C2%B3%C3%83%C2%8C.files/11.jpg” />
(A)常用选项
不会由于运用优化从而使生成的程序呈现过错。碰到的一些问题也根本都是用户编写的原程
序有缝隙所导致,例如一些变量应该是 volatile 型但编程员没有清晰界说,在优化前程序可
以正常运转,一旦运用优化,程序运转就呈现异常。明显,把呈现的这些问题归罪到编译器
是毫无道理的。
运用优化后或许对原程序级的调试带来一些不便利之处。因 PICC 或许会重组编译后的代
码,例如多处重复的代码或许会改成同一个子程序调用以节省程序空间,这样在调试进程中
盯梢原程序时或许会呈现程序乱跳的现象,这根本是正常的。若为了着重更直观的代码调试
进程,你能够将优化等级下降乃至封闭一切优化功用,这样调试时程序的运转就能够按部就
班了。
C 编译器的高档选项设定根本都是针对确诊信息输出的,和生成的代码无关。用得相对
较多的选项有:
&O1540;
中列出了每一行
条
题的辅佐手法。假如你置疑编译器生成的代码有过错,无妨先发生对应的汇编列表
文件,看看在优化前一条 C 句子被编译后的汇编码究竟是什么。
&O1540;
(*.as),此刻将不生成方针文件,也不进行终究的衔接定位。这一选项在 C 和汇
编混合编程时特别有用。经过解读 C 程序对应的汇编指令,能够把握 C 程序中存
取变量的具体办法,然后用在自己编写的汇编指令中。咱们将在稍后专门做介绍。
11.8.5
衔接器 PICC Linker 的选项根本不用作太多的改动,在图 11-6 的对话框中显现了可设定的各类
项目。其间有两项有用的信息输出能够考虑加以运用:
&O1540;
序用到的变量的具体物理地址;一切函数的进口地址;函数相互之间调用的层次联系和深度等。这
些信息关于程序的调试将十分有用。此文件将以扩展名“*.map”的方式存放在同一个项目途径
下,需求时能够用任何文本编辑器翻开调查。
%C3%82%C2%B3%C3%83%C2%8C%C3%82%C2%BD%C3%83%C2%8C%C3%82%C2%B3%C3%83%C2%8C.files/13.jpg” src=”file:///F:/data/%C3%83%C2%8F%C3%83%C2%82%C3%83%C2%94%C3%83%C2%98/PIC%C3%82%C2%B5%C3%82%C2%A5%C3%83%C2%86%C3%82%C2%AC%C3%82%C2%BB%C3%83%C2%BAC%C3%83%C2%93%C3%83%C2%AF%C3%83%C2%91%C3%83%C2%94%C3%82%C2%B1%C3%83%C2%A0%3Cwbr%3E%C3%82%C2%B3%C3%83%C2%8C%C3%82%C2%BD%C3%83%C2%8C%C3%82%C2%B3%C3%83%C2%8C.files/13.jpg” />
图 11-6
&O1540;
了解到程序空间和数据存储器空间资源分配的细节。下面列举了在一个项目编译后实践的内存运用
信息,为便利了解笔者用“//”添加了一些注释:
Psect Usage Map:
Psect
———-|——————————|——————–
powerup
intentry
intcode
intret
init
end_init
clrtext
const3
const
const2
text
text
float_te
rbss_0
temp
nvram
intsave
intsave
intsave_1 | Saved copy of W in bank 1
rbit_0
config
Memory Usage Map:
//程序空间代码定位地址散布
//存储空间运用情况陈述
Program
Program
//bank0 数据空间变量地址散布
Bank
Bank
//bank1 数据空间变量地址散布
Bank 1 RAM
//bank0 数据空间位变量地址散布
Bank 0 Bits
//装备字地址
Config Data
Program statistics:
//程序整体资源耗费计算
Total ROM used
Total RAM used
例 11-7
11.8.6
PICC 环境供给了自己的汇编编译器,它和 Microchip 公司供给的 MPASM 编译器在原
程序的语法表达方面要求稍有不同。别的,PICC 的汇编编译器要求输入原程序文件的扩展
名是“*.as”,而 MPASM 缺省确定的原程序以“*.asm”为扩展名。
器,除非是在混合言语编程时用汇编言语编写完好的汇编原程序模块文件。其编译选项设定
的对话框见图 11-7,最重要的是优化使能操控项“Enable optimization”,一般情况下应该使
用汇编器的优化以节省程序空间。