历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2020年02月13日 | PICC ---- 函数

2020-02-13 来源:eefocus

简介:一个良好的程序设计应该有一个清晰的组织结构,把不同的功能用不同的函数实现是最好的方法,因此一个函数 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 中。


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


推荐阅读

史海拾趣

Crystek公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Crystek公司积极拓展国际市场,与全球多家知名企业建立了合作关系。通过与这些企业的深入合作,Crystek公司的产品得以广泛应用于无线、微波无线电、电信、工业、企业、航空航天和政府部门等各个领域。同时,公司还积极参加国际电子展览和技术交流会议,与全球同行交流学习,不断提升自身的技术水平和市场竞争力。

依必安派特(ebmpapst)公司的发展小趣事

在实现了从贸易到制造的转变后,依必安派特并没有停止前进的步伐。在2012年,依必安派特亚太研发中心正式落户上海,开始了本土化研发之路。这一举措使得依必安派特能够更好地了解中国市场的需求和趋势,为中国客户提供更加符合其需求的产品和解决方案。同时,本土化研发也加速了依必安派特在中国市场的创新步伐,推动了公司业务的快速发展。

天二科技(EVER OHMS)公司的发展小趣事

天二科技始终将产品质量视为企业的生命线。为了不断提升产品品质,公司引进了先进的自动化设备和生产工艺,并建立了严格的质量控制体系。经过多年的努力,天二科技的产品质量得到了显著提升,并先后通过了ISO9001、TS16949等多项国际质量管理体系认证。这些认证的取得不仅证明了天二科技在产品品质方面的卓越表现,更为公司赢得了客户的信任和市场的认可。

CSB公司的发展小趣事

在竞争激烈的电子行业中,成本控制是企业生存和发展的关键。CSB公司深知这一点,因此在供应链管理和成本控制方面下足了功夫。公司通过与供应商建立长期合作关系、优化采购流程、提高生产效率等方式,有效降低了生产成本。同时,公司还注重库存管理和物流配送的优化,确保产品能够及时、准确地送达客户手中。

FORYARD公司的发展小趣事

面对日益激烈的市场竞争和客户需求的变化,FORYARD决定实施智能制造转型。公司投入巨资引进先进的自动化生产线和智能管理系统,实现了从原材料采购、生产加工到成品检验的全流程智能化管理。这一转型不仅大幅提高了生产效率和产品质量,还降低了人力成本和运营成本。同时,FORYARD还积极拥抱工业互联网和大数据等新技术,通过数据分析优化生产流程、预测市场需求,进一步提升了企业的竞争力和市场响应速度。

HEC Inc公司的发展小趣事

随着业务的不断扩展,FORYARD意识到全球化布局的重要性。1995年,公司决定在中国设立研发中心和生产基地,以利用当地丰富的人才资源和成本优势。这一战略决策极大地提升了FORYARD的产能和研发效率,同时也使其能够更好地服务全球客户。此后,FORYARD还陆续在欧洲、亚洲等地建立了多个分支机构,形成了覆盖全球的研发、生产和销售网络。通过全球化布局,FORYARD不仅增强了自身的市场竞争力,还促进了全球电子产业的交流与合作。

问答坊 | AI 解惑

关于PIC系列单片机的应用设计

在微控制器(Microcontroller)应用领域日益广泛的今天,各个领域的应用也向微控制器厂商提出了更高要求,希望速度更快、功耗更低、体积更小、价格更廉以及组成系统时所需要的外围器件更少;随着越来越多的各种非电子工程技术人员的应用需求,他们想 ...…

查看全部问答>

Protel四层板与内层分割入门教程

本教程将详细的讲解Protel 99SE的四层板的设计过程,以及在其中的内电层分割的用法…

查看全部问答>

高精度超声波测距系统设计

高精度超声波测距系统设计…

查看全部问答>

ce 4.2下怎么格式化CF卡啊,用c#写

各位高手,帮帮忙吧。很急啊。以后有分了一定补偿啊。…

查看全部问答>

linux内核中的dts文件

/ {         model = \"MPC8313ERDB\";         compatible = \"mpc83xx\";         #address-cells = ;          ...…

查看全部问答>

在89C51中用计时0做三次定时再装入初值可以吗?

请问大家我可以在遥控解码程式中用计时0做三次定时再装入初值可以吗?是不是第次要设置它的关和开启?? IR_IN:           MOV   R0,#IRCOM I1:      JNB  IRIN,I2  ...…

查看全部问答>

想买ST7开发工具,请问有联系方式吗

现正打算用ST7做车载MCU不知那里有开发工具卖?联系:mikewuhong@163.com       ST7-STICK ST7单片机通用编程器…

查看全部问答>

各位大虾:请教滤波器在对含突变点信号滤波的问题

在对混有锯齿波的信号进行高通滤波的过程中,滤波后在锯齿波的突变点上,总会产生一个尖峰,将锯齿波幅值拉大,从而达不到衰减要求,怎样才能抑制这个尖峰。(RC滤波,LC滤波都用过)求大虾们出出主意啊…

查看全部问答>

【杭州滨江】招聘嵌入式软件工程师和FPGA/芯片工程师各一名

因部门发展需求,需招聘嵌入式软件工程师和FPGA/芯片工程师各一名,工作地点为杭州市滨江区,薪资面议 不知道论坛有没有合适的朋友需要在美丽的杭州找工作,有兴趣的可以与我联系 【嵌入式软件工程师】 1,能熟练地在uC/OS-II下进行应用编程; ...…

查看全部问答>

XDS510仿真器驱动

我的电脑是WIN7 64位的,XDS510仿真器的驱动一直装不上,各路大神有没有解决办法,谢谢各位~…

查看全部问答>