历史上的今天
返回首页

历史上的今天

今天是:2025年03月17日(星期一)

正在发生

2020年03月17日 | PICC——函数

2020-03-17 来源:eefocus

函数的代码长度限制

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 中。


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

推荐阅读

史海拾趣

Alan Industries Inc公司的发展小趣事

随着国内市场的饱和,Alan Industries Inc.开始将目光投向海外市场。公司制定了国际化发展战略,通过设立海外分公司、参加国际展会等方式,积极开拓国际市场。同时,公司还加强了对国际市场的调研和分析,根据不同地区的市场需求和文化特点,推出了针对性的产品和服务。这些努力使得公司在国际市场上也取得了不俗的成绩。

DEWALT公司的发展小趣事

DEWALT公司始终将技术创新作为企业发展的核心动力。在创始人雷蒙得伟的领导下,公司不断投入研发,推出了一系列具有创新性的电动工具产品。这些产品不仅具有高效、耐用的特点,还满足了不同用户的需求。通过不断的技术创新和产品拓展,DEWALT公司逐渐在电动工具行业中占据了重要地位。

Codeco Corporation Of Vermont公司的发展小趣事

随着电子行业的快速发展和变革,Codeco面临着新的挑战和机遇。为了应对这些变革,公司及时调整战略,加大在人工智能、物联网等领域的投入。通过与高校、研究机构的合作,Codeco不断吸收新的技术和理念,推出了一系列符合市场需求的创新产品。这些举措使得Codeco在行业中保持了领先地位。

C&H Technology公司的发展小趣事

随着智能手机市场的快速发展,C&H Technology意识到单纯的芯片制造已经不能满足市场需求。于是,公司开始加大研发投入,致力于在5G通信、人工智能等前沿技术领域取得突破。经过多次试验和失败,C&H Technology的研发团队终于成功开发出了一款集成5G通信功能的手机芯片,并获得了多项专利。这一技术突破不仅提升了公司在行业内的地位,也为公司的未来发展奠定了坚实的基础。

Davico Industrial Ltd公司的发展小趣事

随着智能手机市场的快速发展,C&H Technology意识到单纯的芯片制造已经不能满足市场需求。于是,公司开始加大研发投入,致力于在5G通信、人工智能等前沿技术领域取得突破。经过多次试验和失败,C&H Technology的研发团队终于成功开发出了一款集成5G通信功能的手机芯片,并获得了多项专利。这一技术突破不仅提升了公司在行业内的地位,也为公司的未来发展奠定了坚实的基础。

Anadigm公司的发展小趣事

随着公司的不断发展壮大,C&H Technology开始关注可持续发展问题。公司加大了对环保技术的研发投入,推出了多款环保型芯片产品,降低了生产过程中的能耗和排放。同时,公司还积极参与社会公益事业,通过捐款、设立奖学金等方式回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。


以上便是关于C&H Technology公司发展起来的相关故事。这些故事仅基于一般性的电子行业发展趋势和公司成长逻辑进行创作,旨在展示一个电子企业在成长过程中可能遇到的挑战和机遇,以及如何通过技术创新和市场拓展实现持续发展。

问答坊 | AI 解惑

[下载]美国MSP430电子书(英文)

希望大家喜欢哈! 这本书的作者是个公共遥测工程师 大学用51,工作了用PIC,之后一个项目要求低功耗,所以又用了430。 …

查看全部问答>

在台式数字电子秤的课程设计中 可以用哪些类型的信号放大器?

对于数字电子秤的设计可以用哪些类型的放大器  哪一种的放大器效果更好??请高人指点!  …

查看全部问答>

关于BIB文件中RAMIMAGE类型的问题

MSDN中在关于BIB文件的MEMORY Section部分中提到RAMIMAGE类型时说: Specifies that the region should be treated like RAM. The memory addresses in this entry can physically correspond to RAM or to linear flash memory. 原文见: http ...…

查看全部问答>

Ubuntu下的一些小问题

1. 帮忙说明下linux(ubuntu)中,configure的参数问题,--prefix=/路径 和--exec-prefix=/路径,还有with-xxx-prefix=/路径 又什么区别吗 2. 说能解释下\"sed\",\"set\",\"eval\",\"tee\" and \"getopt\" in shell,推好能推荐个教程,找了半天没什 ...…

查看全部问答>

[DIY]再造二十四小时的感动【古典版II】 自制QS18-12辉光电子钟 附百图

        前几天刚刚完成QS30-1管的辉光钟,有不少朋友在向我讨教如何制作。说实话,就个人而言,我更喜欢QS18-12辉光管。         QS30-1的辉光管制作贴在这里:https://bb ...…

查看全部问答>

【光耦技术资料汇总】

声明:展现在你眼前的所有文档都非本人的智慧所编写,而只是转发,但所有文档也都非具有相同层次的专业人士所作,你需要的是学习与思考,融合与创新。你的灵感,将来自於你的头脑,你的知识,确来自于其他人的智慧。包容糟粕,取其精华,你必能智於 ...…

查看全部问答>

电池供电单片机如何提高程序的可靠运行?

系统是一个手持设备,用电池供电,电量低时,通过外部充电器充电。 平时不使用时,进入休眠状态,通过按键(有三个不同功能的按键)唤醒(IO口电平变化中断)结束休眠。 如何才能保证系统能可靠的运行? 就是每次在休眠中,按键按下都能够唤醒, ...…

查看全部问答>

编写字符设备驱动框架的步骤(简要)

        作者:武汉华嵌嵌入式培训  长沙中心        讲师: 周龙         Step 1:  申请设备号(主要是申请主设备号)         ...…

查看全部问答>

TIVA C Launchpad 是否可以外接其他电源?

具体就是想问一下 : 当我用PC下载完程序后, 要让TIVA C Launchpad  单独运行,没法再提供USB接口; TIVA C Launchpad有没有简单的供电方法。…

查看全部问答>