您的位置 首页 IOT

PIC 单片机 C 言语编程简介(3)

例11-5C语言中断函数举例PICC会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场,所以编程员无需象编写汇编程序那样

例 11-5 C 言语中止函数举例

PICC 会主动参加代码完成中止现场的保护,并在中止结束时主动康复现场,所以编程

员无需象编写汇编程序那样参加中止现场保护和康复的额定指令句子。但假如在中止服务程

序中需求修正某些大局变量时,是否需求保护这些变量的初值将由编程员自己决议和施行。

用 C 言语编写中止服务程序有必要遵从高效的准则:

&O1540; 代码尽量简略,中止服务着重的是一个“快”字。

&O1540; 防止在中止内运用函数调用。尽管 PICC 答应在中止里调用其它函数,但为了处理

递归调用的问题,此函数有必要为中止服务独家专用。既如此,无妨把原本要写在其

它函数内的代码直接写在中止服务程序中。

&O1540; 防止在中止内进行数学运算。数学运算将很有或许用到库函数和许多中心变量,就

算不呈现递归调用的问题,光在中止进口和出口处为了保护和康复这些中心暂时变

量就需求许多的开支,严重影响中止服务的功率。

中档系列 PIC 单片机的中止进口只需一个,因而整个程序中只能有一个中止服务函数。

11.6.5 规范库函数

PICC 供给了较完好的 C 规范库函数支撑,其间包括数学运算函数和字符串操作函数。

在程序中运用这些现成的库函数时需求留意的是进口参数有必要在 bank0 中。

假如需求用到数学函数,则应在程序前 “#include ” 包括头文件;假如要使

用字符串操作函数,就需求包括“#include ”头文件。在这些头文件中供给了函数

类型的声明。经过直接检查这些头文件就能够知道 PICC 供给了哪些规范库函数。

C 言语中常用的格局化打印函数“printf/sprintf”用在单片机的程序中时要特别慎重。

printf/sprintf 是一个十分大的函数,一旦运用,你的程序代码长度就会添加许多。除非是在

编写实验性质的代码,能够考虑运用格局化打印函数以简化测验程序;一般的终究产品规划

都是自己编写最精简的代码完成特定格局的数据显现和输出。原本,在单片机运用中输出的

数据格局都相对简略并且固定,完成起来应该很简略。

关于规范 C 言语的操控台输入(scanf)/输出(printf)函数,PICC 需求用户自己编写

其底层函数 getch()和 putch()。在单片机体系中完成 scanf/printf 原本就没什么太多意义,如

果一定要完成,只需编写好特定的 getch()和 putch()函数,你就能够经过任何接口输入或输

出格局化的数据。

11.7

PICC 界说特别区域值

PICC 供给了相关的预处理指令以完成在原程序中界说单片机的装备字和符号单元。

11.7.1 界说作业装备字

在原程序中界说 PIC 单片机作业装备字的重要性在前面章节中现已论述。在用 PICC 写

程序时相同能够在 C 原程序中界说,具体办法如下:

__CONFIG (HS & UNPROTECT & PWRTEN & BORDIS & WDTEN);

上面的关键词“__CONFIG”(留意前面有两个下划线符)专门用所以芯片装备字的设

定,后边括号中的各项装备位符号在特定类型单片机的头文件中现已界说(留意不是 pic.h

头文件),相互之间用逻辑“与”操作符组合在一同。这样界说的装备字信息终究将和程序

代码一同放入同一个 HEX 文件。

在这里列出了适用于 16F7x 系列单片机装备位符号预界说,其它类型或系列的单片机

装备字界说办法相似,运用前查阅一下对应的头文件即可。

#define RC

#define HS

0x3FFF // RC 振动

0x3FFE // HS 方式

#define XT

#define LP

0x3FFD // XT 方式

0x3FFC // LP 方式

#define WDTEN 0x3FFF // 看门狗翻开

#define WDTDIS

#define PWRTEN

0x3FFB // 看门狗封闭

0x3FF7 // 上电延时定时器翻开

#define PWRTDIS 0x3FFF // 上电延时定时器封闭

#define BOREN 0x3FFF // 低电压复位答应

#define BORDIS

0x3FBF // 低电压复位制止

#define UNPROTECT 0x3FFF // 没有代码保护

#define PROTECT 0x3FEF // 程序代码保护

例 11-6 头文件预界说的装备信息符号

11.7.2 界说芯片符号单元

PIC 单片机中的符号单元界说能够用下面的__IDLOC(留意前面有两个下划线符)预处

理指令完成,办法如下:

__IDLOC (1234);

其特别之处是括号内的值悉数为 16 进制数,不需求用“0x”引导。这样上面的界说就设定

了符号单元内容为 01020304。

11.8

MPLAB-IDE 中完成 PICC 的编译选项设置

在 11.3 节中现已介绍了怎么完成 PICC 和 MPLAB-IDE 开发渠道的挂接。一旦项目树立

成功、程序编写完成后即能够经过 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 一般编译选项(General)设定

参阅第三章 3.2.7 节的内容和图 3-20 的指示阐明,发动编译选项设定对话框。在运用

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” /> %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/10.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/10.jpg” />

图 11-3 PICC 一般选项设定图 11-4 PICC 大局选项设定

11.8.3 PICC 大局选项设定(PICC Global)

大局选项将影响项目中一切 C 和汇编原程序的编译,具体的设定内容见图 11-4。其间

有必要重视的有:

&O1540; Compile for MPLAB ICD:假如你准备用 ICD 调试 C 言语编译后的代码,那么此项

就有必要打钩选中。这样编译后的成果就能确保 ICD 自身运用的芯片资源(一小部

分的程序和数据空间)不被运用程序所占用。

&O1540; Treat ‘char’ as signed:为了进步编译后的代码功率,PICC 缺省确定‘char’型变量也

是无符号数。假如在规划中需求运用带符号的‘char’型变量,此项就应该被选中。

&O1540; Floating point ‘double’ width:相同为了进步编译后的代码功率,PICC 缺省确定

‘double’型的双精度浮点数变量的完成长度为 24 位(等同于一般 float 型浮点数)。

在这里能够挑选使其长度达 32 位。这样数值核算的精度将得到进步,但代码长度

将添加,核算速度也会下降,所以请在权衡利弊后作出你自己的决议。

11.8.4 C 编译器选项设定(PICC Compiler)

项目中一切的 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” /> %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/12.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/12.jpg” />

(A)常用选项 (B) 高档选项

图 11-5 C 编译器选项设定

不会由于运用优化从而使生成的程序呈现过错。碰到的一些问题也根本都是用户编写的原程

序有缝隙所导致,例如一些变量应该是 volatile 型但编程员没有清晰界说,在优化前程序可

以正常运转,一旦运用优化,程序运转就呈现异常。明显,把呈现的这些问题归罪到编译器

是毫无道理的。

运用优化后或许对原程序级的调试带来一些不便利之处。因 PICC 或许会重组编译后的代

码,例如多处重复的代码或许会改成同一个子程序调用以节省程序空间,这样在调试进程中

盯梢原程序时或许会呈现程序乱跳的现象,这根本是正常的。若为了着重更直观的代码调试

进程,你能够将优化等级下降乃至封闭一切优化功用,这样调试时程序的运转就能够按部就

班了。

C 编译器的高档选项设定根本都是针对确诊信息输出的,和生成的代码无关。用得相对

较多的选项有:

&O1540; Generate assembly list file:编译器生成 C 原程序的汇编列表文件(*.lst)。在此文件

中列出了每一行 C 原代码对应的汇编指令,但这些都是优化前的代码。简略的一

C 句子被翻译成汇编指令后或许有好几条。有时汇编列表文件能够作为处理问

题的辅佐手法。假如你置疑编译器生成的代码有过错,无妨先发生对应的汇编列表

文件,看看在优化前一条 C 句子被编译后的汇编码究竟是什么。

&O1540; Compile to assembly only:这一选项的作用是把&n, bsp; C 原程序编译成汇编指令文件

(*.as),此刻将不生成方针文件,也不进行终究的衔接定位。这一选项在 C 和汇

编混合编程时特别有用。经过解读 C 程序对应的汇编指令,能够把握 C 程序中存

取变量的具体办法,然后用在自己编写的汇编指令中。咱们将在稍后专门做介绍。

11.8.5 衔接器选项设定(PICC Linker)

衔接器 PICC Linker 的选项根本不用作太多的改动,在图 11-6 的对话框中显现了可设定的各类

项目。其间有两项有用的信息输出能够考虑加以运用:

&O1540; Generate map file:生成衔接定位映射文件。在此映射文件中具体列出了一切程

序用到的变量的具体物理地址;一切函数的进口地址;函数相互之间调用的层次联系和深度等。这

些信息关于程序的调试将十分有用。此文件将以扩展名“*.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 PICC 衔接器选项设定

&O1540; Display memory-segment usage:显现具体的内存分配和运用情况陈述。用户能够

了解到程序空间和数据存储器空间资源分配的细节。下面列举了在一个项目编译后实践的内存运用

信息,为便利了解笔者用“//”添加了一些注释:

Psect Usage Map: //程序段定位表

Psect | Contents | Memory Range

———-|——————————|——————–

powerup | Power on reset code | $0000 – $0003

intentry | Interrupt service routine | $0004 – $000C

intcode | Interrupt service routine | $000D – $002C

intret | Interrupt service routine | $002D – $0035

init | Initialization code | $0036 – $003D

end_init | Initialization code | $003E – $0040

clrtext | Memory clearing code | $0041 – $0047

const3 | Strings and constant data | $0048 – $0060

const | Strings and constant data | $0061 – $0071

const2 | Strings and constant data | $0072 – $0076

text | Program and library code | $0576 – $0582

text | Program and library code | $0583 – $07C7

float_te | Arithmetic routine code | $07C8 – $07FF

rbss_0 | Bank 0 RAM variables | $0021 – $0042

temp | Temporary RAM data | $0043 – $0047

nvram | Persistent RAM data | $0048 – $004A

intsave | Registers saved on interrupt | $004B – $004D

intsave | Registers saved on interrupt | $007F – $007F

intsave_1 | Saved copy of W in bank 1 | $00FF – $00FF

rbit_0 | Bank 0 bit variables | $0100 – $0104

config | User-programmed CONFIG bits | $2007 – $2007

Memory Usage Map:

//程序空间代码定位地址散布

//存储空间运用情况陈述

Program ROM $0000 – $0076 $0077 ( 119) words

Program ROM $0576 – $07FF $028A ( 650) words

$0301 ( 769) words total Program ROM

//bank0 数据空间变量地址散布

Bank 0 RAM $0021 – $004D $002D ( 45) bytes

Bank 0 RAM $007F – $007F $0001 ( 1) bytes

$002E ( 46) bytes total Bank 0 RAM

//bank1 数据空间变量地址散布

Bank 1 RAM $00FF – $00FF $0001 ( 1) bytes total Bank 1 RAM

//bank0 数据空间位变量地址散布

Bank 0 Bits $0100 – $0104 $0005 ( 5) bits total Bank 0 Bits

//装备字地址

Config Data $2007 – $2007 $0001 ( 1) words total Config Data

Program statistics:

//程序整体资源耗费计算

Total ROM used 769 words (18.8%) //生成代码字总数和程序空间运用率

Total RAM used 48 bytes (25.0%) //运用数据字节数和数据空间运用率

例 11-7 编译后程序运用的内存信息

11.8.6 汇编器选项设定(PICC Assembler)

PICC 环境供给了自己的汇编编译器,它和 Microchip 公司供给的 MPASM 编译器在原

程序的语法表达方面要求稍有不同。别的,PICC 的汇编编译器要求输入原程序文件的扩展

名是“*.as”,而 MPASM 缺省确定的原程序以“*.asm”为扩展名。

在根据 PICC 编译环境下开发 PIC 单片机的 C 言语运用程序时根本无需关怀其汇编编译

器,除非是在混合言语编程时用汇编言语编写完好的汇编原程序模块文件。其编译选项设定

的对话框见图 11-7,最重要的是优化使能操控项“Enable optimization”,一般情况下应该使

用汇编器的优化以节省程序空间。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/261696.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部