PICC ---- 函数

2020-02-13来源: eefocus关键字:PICC  函数  长度限制

简介:一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。

函数的代码长度限制


PICC决定了C原程序中的一个函数经编译后生成的机器码一定会放在同一个程序页面内。中档系列的 PIC 单片机其一个程序页面的长度是 2K字,换句话说,用 C 语言编写的任何一个函数最后生成的代码不能超过 2K字。一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 2K字长的限制一般不会对程序代码的编写产生太多影响。如果为实现特定的功能确实要连续编写很长的程序,这时就必须把这些连续的代码拆分成若干函数,以保证每个函数最后编译出的代码不超过一个页面空间。


调用层次的控制


中档系列 PIC 单片机的硬件堆栈深度为 8 级,考虑中断响应需占用一级堆栈,所有函数调用嵌套的最大深度不要超过 7 级。编程员必须自己控制子程序调用时的嵌套深度以符合这一限制要求。


PICC 在编译时将严格进行函数调用时的类型检查。一个良好的习惯是在编写程序代码前先声明所有用到的函数类型。例如:


void Task(void);


unsigned char Temperature(void);


void BIN2BCD(unsigned char);


void TimeDisplay(unsigned char, unsigned char);


这些类型声明确定了函数的入口参数和返回值类型,这样编译器在编译代码时就能保证生成正确的机器码。笔者在实际工作中有时碰到一些用户声称发现 C 编译器生成了错误的代码,最后究其原因就是因为没有事先声明函数类型所致。


建议大家在编写一个函数的原代码时,立即将此函数的类型声明复制到原文件的起始处,见例 11-1;或是复制到专门的包含头文件中,再在每个原程序模块中引用。


PICC 可以实现 C 语言的中断服务程序。中断服务程序有一个特殊的定义方法:


void interrupt ISR(void);


其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数和返回参数类型必须是“void”型,亦即没有入口参数和返回参数,且中间必须有一个关键“interrupt”。


中断函数可以被放置在原程序的任意位置。因为已有关键词“interrupt”声明,PICC 在最后进行代码连接时会自动将其定位到 0x0004 中断入口处,实现中断服务响应。编译器也会实现中断函数的返回指令“retfie”。一个简单的中断服务示范函数如下:


void interrupt ISR(void) //中断服务程序


{


if (T0IE && T0IF) //判TMR0中断


{


T0IF = 0; //清除TMR0中断标志


//在此加入TMR0中断服务


}


if (TMR1IE && TMR1IF) //判TMR1中断


{


TMR1IF = 0; //清除TMR1中断标志


//在此加入TMR1中断服务


}


} //中断结束并返回


PICC 会自动加入代码实现中断现场的保护,并在中断结束时自动恢复现场,所以编程员无需象编写汇编程序那样加入中断现场保护和恢复的额外指令语句。但如果在中断服务程序中需要修改某些全局变量时,是否需要保护这些变量的初值将由编程员自己决定和实施。


用 C 语言编写中断服务程序必须遵循高效的原则:


代码尽量简短,中断服务强调的是一个“快”字。


避免在中断内使用函数调用。虽然 PICC 允许在中断里调用其它函数,但为了解决递归调用的问题,此函数必须为中断服务独家专用。既如此,不妨把原本要写在其它函数内的代码直接写在中断服务程序中.


避免在中断内进行数学运算。数学运算将很有可能用到库函数和许多中间变量,就算不出现递归调用的问题,光在中断入口和出口处为了保护和恢复这些中间临时变


中档系列 PIC 单片机的中断入口只有一个,因此整个程序中只能有一个中断服务函数。


PICC 提供了较完整的 C标准库函数支持,其中包括数学运算函数和字符串操作函数。在程序中使用这些现成的库函数时需要注意的是入口参数必须在 bank0 中。


变量就需要大量的开销,严重影响中断服务的效率。


关键字:PICC  函数  长度限制 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488110.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PICC ---- 各种变量修饰
下一篇:PICC编译指针详解

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PICC环境写PIC单片机程序的探讨
简介:一般C语言产生的代码是比较繁琐的,所以要写出高质量、实用的C语言程序,就必须对单片机体系结构和硬件资源作详尽的了解.目前,Microchip公司生产的PIC系列单片机以其低成本、低功耗、高性能、开发速度快且一次性用户可编程等优点迅速占领了国内市场,成为国内销售量最大的单片机.但国内介绍其C语言开发工具的书籍和文章却比较少,在开发过程中给广大程序员带来了许多困难和不便.Microchip公司没有针对中低档系列PIC单片机的C语言编译器,但很多专业的第三方公司提供众多支持PIC单片机的C语言编译器,常见的有Hitech、CCS、IAR以及Bytecraft等公司.Hitech公司的PICC编译器稳定可靠,编译生成的代码效率高
发表于 2020-02-18
PICC ME16 C简要说明书
第一部分为了对PIC单片机有更好的支持,PICC在标准C的基础上作了一些扩充:定义I/O函数,以便在你的硬件系统中使用中定义的函数。用C语言编写中断服务程序用C语言编写I/O操作程序C语言与汇编语言间的接口1-1 与标准C的不同PICC只在一处与标准C不同:函数的重入。因为PIC单片机的寄存器及堆栈有限,所以PICC不支持可重入函数。1-2 支持的PIC芯片PICC 支持很多PIC单片机,支持PIC单片机的类型在LIB目录下的picinfo.ini 文件中有定义。1-3 PICC 包含一些标准库1-4 PICC 编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD' 格式和 Intel
发表于 2020-02-14
PICC——嵌入汇编
的方法在 C 原程序中直接嵌入汇编指令是最直接最容易的方法。如果只需要嵌入少量几条的汇编指令,PICC 提供了一个类似于函数的语句:asm("clrwdt")双引号中可以编写任何一条 PIC 的标准汇编指令。例如:for (;;) {asm("clrwdt"); //清看门狗Task();ClockRun();asm("sleep"); //休眠asm("nop"); //空操作延时}如果需要编写一段连续的汇编指令,PICC 支持另外一种语法描述:用“#asm”开始汇编指令段,用“#endasm”结束。例如下面的一段嵌入汇编指令实现了将 0x20~0x7F 间的
发表于 2020-02-14
PICC——基本知识(变量)
利用这一技术后所有的动态局部变量都可以按已知的固定地址地进行直接寻址,用 PIC 汇编指令实现的效率最高,但这时不能出现函数递归调用。PICC 在编译时会严格检查递归调用的问题并认为这是一个严重错误而立即终止编译过程。为了使编译器产生最高效的机器码,PICC 把单片机中数据寄存器的 bank问题交由编程员自己管理,因此在定义用户变量时你必须自己决定这些变量具体放在哪一个 bank 中。如果没有特别指明,所定义的变量将被定位在 bank0,除了 bank0 内的变量声明时不需特殊处理外,定义在其它 bank 内的变量前面必须加上相应的 bank序号中档系列 PIC 单片机数据寄存器的一个 bank 大小为 128 字节,刨去前面若干
发表于 2020-02-14
PICC编译指针详解
指向 RAM 的指针如果是汇编语言编程,实现指针寻址的方法肯定就是用 FSR 寄存器,PICC 也不例外。为了生成高效的代码,PICC 在编译C原程序时将指向 RAM 的指针操作最终用 FSR 来实现间接寻址。这样就势必产生一个问题:FSR 能够直接连续寻址的范围是 256 字节(bank0/1或 bank2/3),要覆盖最大 512 字节的内部数据存储空间,又该如何让定义指针?PICC 还是将这一问题留给编程员自己解决:在定义指针时必须明确指定该指针所适用的寻址区域,例如:unsigned char *ptr0; //①定义覆盖bank0/1的指针bank2 unsigned char *ptr1; //②定义覆盖bank2
发表于 2020-02-14
AVR常用库函数介绍
目录:1. Character Type Functions - 字符类型函数2. Standard C Input/Output Functions - 标准输入输出函数3. Standard Library Functions - 标准库和内存分配函数4. Mathematical Functions - 数学函数5. String Functions - 字符串函数6. BCD Conversion Functions - BCD 转换函数7. Memory Access Functions - 存储器访问函数8. Delay Functions - 延时函数9. LCD Functions - LCD函数10. LCD
发表于 2020-02-06
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved