没有合适的资源?快使用搜索试试~ 我知道了~
首页掌握PIC单片机C语言编程:资源有限下的高效开发
掌握PIC单片机C语言编程:资源有限下的高效开发
5星 · 超过95%的资源 需积分: 50 1 下载量 138 浏览量
更新于2024-07-25
收藏 177KB PDF 举报
本文档深入探讨了PIC单片机的C语言编程技术,强调了C语言在单片机系统开发中的优势,如高效编码、直观调试、易于维护和移植。然而,与在PC机上的编程相比,使用C语言在资源有限且实时性要求高的单片机上编程有着显著的不同。程序员需要充分理解单片机的体系结构和硬件资源,才能编写出高效实用的程序。 作者张明峰指出,Microchip公司并未直接提供针对中低档PIC单片机的C语言编译器,但市场上有第三方工具如Hitech的PICC编译器,它因其稳定性、高效代码生成和广泛接受度受到工程界的好评。虽然全功能的PICC需要购买,但Hitech提供了限时试用版供评估。此外,Hitech还为初学者和爱好者提供了免费的学习版PICC-Lite,支持包括PIC16F84、PIC16F877和PIC16F628在内的几款常见单片机,这些适合初学者入门学习。 对于想要学习C语言编程的PIC单片机开发者,本文推荐从Hitech的PICC-Lite开始,同时提供了Hitech-PICC和IAR等编译器的相关网址供进一步参考。本章旨在引导读者从底层汇编指令理解出发,逐步掌握在特定硬件平台上(如中档PIC单片机)利用C语言编程的实践技巧。通过深入理解单片机特性,结合C语言的优势,开发出满足实际需求的高效软件解决方案。
资源详情
资源推荐
张明峰 2004-4-7 于上海 5 of 26
11.5.2 PICC 中的高级变量
基于表 11-1 的基本变量,除了 bit 型位变量外,PICC 完全支持数组、结构和联合等复
合型高级变量,这和标准的 C 语言所支持的高级变量类型没有什么区别。例如:
数组:unsigned int data[10];
结构:struct commInData {
unsigned char inBuff[8];
unsigned char getPtr, putPtr;
};
联合:union int_Byte {
unsigned char c[2];
unsigned int i;
};
例 11-2 C 语言高级变量举例
11.5.3 PICC 对数据寄存器 bank 的管理
为了使编译器产生最高效的机器码,PICC 把单片机中数据寄存器的 bank 问题交由编程
员自己管理,因此在定义用户变量时你必须自己决定这些变量具体放在哪一个 bank 中。如
果没有特别指明,所定义的变量将被定位在 bank0,例如下面所定义的这些变量:
unsigned char buffer[32];
bit flag1,flag2;
float val[8];
除了 bank0 内的变量声明时不需特殊处理外,定义在其它 bank 内的变量前面必须加上
相应的 bank 序号,例如:
bank1 unsigned char buffer[32]; //变量定位在 bank1 中
bank2 bit flag1,flag2; //变量定位在 bank2 中
bank3 float val[8]; //变量定位在 bank3 中
中档系列 PIC 单片机数据寄存器的一个 bank 大小为 128 字节,刨去前面若干字节的特
殊功能寄存器区域,在 C 语言中某一 bank 内定义的变量字节总数不能超过可用 RAM 字节
数。如果超过 bank 容量,在最后连接时会报错,大致信息如下:
Error[000] : Can't find 0x12C words for psect rbss_1 in segment BANK1
连接器告诉你总共有 0x12C(300)个字节准备放到 bank1 中但 bank1 容量不够。显然,只
有把一部分原本定位在 bank1 中的变量改放到其它 bank 中才能解决此问题。
虽然变量所在的 bank 定位必须由编程员自己决定,但在编写原程序时进行变量存取操
作前无需再特意编写设定 bank 的指令。C 编译器会根据所操作的对象自动生成对应 bank 设
定的汇编指令。为避免频繁的 bank 切换以提高代码效率,尽量把实现同一任务的变量定位
在同一个 bank 内;对不同 bank 内的变量进行读写操作时也尽量把位于相同 bank 内的变量
归并在一起进行连续操作。
张明峰 2004-4-7 于上海 6 of 26
11.5.4 PICC 中的局部变量
PICC 把所有函数内部定义的 auto 型局部变量放在 bank0。为节约宝贵的存储空间,它
采用了一种被叫做“静态覆盖”的技术来实现局部变量的地址分配。其大致的原理是在编译
器编译原代码时扫描整个程序中函数调用的嵌套关系和层次,算出每个函数中的局部变量字
节数,然后为每个局部变量分配一个固定的地址,且按调用嵌套的层次关系各变量的地址可
以相互重叠。利用这一技术后所有的动态局部变量都可以按已知的固定地址地进行直接寻
址,用 PIC 汇编指令实现的效率最高,但这时不能出现函数递归调用。PICC 在编译时会严
格检查递归调用的问题并认为这是一个严重错误而立即终止编译过程。
既然所有的局部变量将占用 bank0 的存储空间,因此用户自己定位在 bank0 内的变量字
节数将受到一定的限制,在实际使用时需注意。
11.5.5 PICC 中的位变量
bit 型位变量只能是全局的或静态的。PICC 将把定位在同一 bank 内的 8 个位变量合并
成一个字节存放于一个固定地址。因此所有针对位变量的操作将直接使用 PIC 单片机的位
操作汇编指令高效实现。基于此,位变量不能是局部自动型变量,也无法将其组合成复合型
高级变量。
PICC 对整个数据存储空间实行位编址,0x000 单元的第 0 位是位地址 0x0000,以此后
推,每个字节有 8 个位地址。编制位地址的意义纯粹是为了编译器最后产生汇编级位操作指
令而用,对编程人员来说基本可以不管。但若能了解位变量的位地址编址方式就可以在最后
程序调试时方便地查找自己所定义的位变量,如果一个位变量 flag1 被编址为 0x123,那么
实际的存储空间位于:
字节地址=0x123/8 = 0x24
位偏移 =0x123%8 = 3
即 flag1 位变量位于地址为 0x24 字节的第 3 位。在程序调试时如果要观察 flag1 的变化,必
须观察地址为 0x24 的字节而不是 0x123。
PIC 单片机的位操作指令是非常高效的。因此,PICC 在编译原代码时只要有可能,对
普通变量的操作也将以最简单的位操作指令来实现。假设一个字节变量 tmp 最后被定位在
地址 0x20,那么
tmp |= 0x80 => bsf 0x20,7
tmp &= 0xf7 => bcf 0x20,3
if (tmp&0xfe) => btfsc 0x20,0
即所有只对变量中某一位操作的 C 语句代码将被直接编译成汇编的位操作指令。虽然编程
时可以不用太关心,但如果能了解编译器是如何工作的,那将有助于引导我们写出高效简介
的 C 语言原程序。
在有些应用中需要将一组位变量放在同一个字节中以便需要时一次性地进行读写,这一
功能可以通过定义一个位域结构和一个字节变量的联合来实现,例如:
剩余25页未读,继续阅读
frmde21
- 粉丝: 0
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 彩虹rain bow point鼠标指针压缩包使用指南
- C#开发的C++作业自动批改系统
- Java实战项目:城市公交查询系统及部署教程
- 深入掌握Spring Boot基础技巧与实践
- 基于SSM+Mysql的校园通讯录信息管理系统毕业设计源码
- 精选简历模板分享:简约大气,适用于应届生与在校生
- 个性化Windows桌面:自制图标大全指南
- 51单片机超声波测距项目源码解析
- 掌握SpringBoot实战:深度学习笔记解析
- 掌握Java基础语法的关键知识点
- SSM+mysql邮件管理系统毕业设计源码免费下载
- wkhtmltox下载困难?找到正确的安装包攻略
- Python全栈开发项目资源包 - 功能复刻与开发支持
- 即时消息分发系统架构设计:以tio为基础
- 基于SSM框架和MySQL的在线书城项目源码
- 认知OFDM技术在802.11标准中的项目实践
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功