- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式系统的C语言4 #include FILE2.h //包含文件FILE2.c //中的函数 void main (void){ //第一次进入MyFunction之前,myVar=0。 MyFunction(); //在FILE2.c中 //第二次进入MyFunction之前,myVar=1。 MyFunction(); //在FILE2.c中 } FILE2.c void MyFunction (void){ //FILE2.C中定义 //MyFunction函数 static char myVar = 0; //本地变量 //声明为static myVar = myVar + 1; //尽管myVar是本地变量,但它保持了自己的值。 } 2.2 静态函数 一个静态函数只能被其所在模块中的其它函数调用。使用静态函数是结构化编程的好习惯。你也许惊讶地知道静态函数能产生小/快的代码。这是可能的,因为编译器在编译时确切地知道什么函数能调用一个给定的静态函数。因此,函数的相关内存区域能被调整,以致使用调用的一个短版本或跳转指令。潜在的改进甚至更好,编译器足够聪明地用跳转代替调用。 2.3 关键字“static”的使用 在函数体声明静态的变量,在函数调用期间保持其质; 在模块内声明静态的变量,(但在函数体之外)能被模块内所有函数访问; 在模块内声明静态的函数,只能被模块内其它函数调用。 对于嵌入式系统:封装持续生存的数据(包装);模块化编码(数据隐藏);在每个模块中隐藏内部处理。 2.4 可变(volatile)变量 可变变量是其值在正常程序流程以外可能改变的变量。在嵌入式系统中,这种情况通过两种主要途径发生: 通过一个中断服务程序,或作为硬件动作的结果。例如,通过一个串口接收到一个字符,结果串口状态寄存器更新,这完全在程序流程之外发生。很多程序员知道编译器不会试图优化一个volatile寄存器,而宁可每次重载它。 在嵌入式设备中,将所有外设寄存器声明为volatile是一个好习惯。 许多编译器供应商经常炫耀他们的代码优化,它们通常非常好,它们有些根本不明显,但能极大地减少周期和内存。但有时我们不想编译器聪明和优化一个部份,因为我们确实需要代码那样作。 我们怎样才能达到呢?那么,访问定义为volatile的变量从不会被编译器优化。 让我们分析一个例子,看看编译器是怎样处理一个volatile和一个非volatile变量… volatile unsigned char PORTA @0x00; volatile unsigned char SCS1 @0x16; unsigned char value; void main(void){ PORTA = 0x05; /* PORTA =*/ PORTA = 0x05; /* PORTA =*/ SCS1; value = 10; } 未使用Volatile关键字,编译器将其编译为: MOV #5,PORTA LDA #10 STA @value 使用Volatile关键字后,编译器将其编译为: MOV #5,PORTA MOV #5,PORTA LDA SCS1 LDX #10 STX @value 这段代码实际上不做任何事,但它很好地表达了优化怎样强烈地影响程序的结果。在main()中连续两次使用语句:PORTA=5,这没有意义,但让我们假设这是正确开发程序所必须的…在这两个语句之后,明显地有一条无意义语句“SCS1;”。让我们看当不使用volatile变量会发生什么… 我们得到了优化过的汇编代码。重复的语句Port A = 5消失了只剩下一句“move #5 to Port A”。语句“SCS1;”似乎什么都不做,因此聪明的编译器将它消去了。最后,将10加载到累加器并作为值存贮。 使用volatile关键字声明PORTA 和SCS1,得到的汇编代码没有优化,连续两次在Port A写入数值5,然后将SCS1加载到累加器。最后由于累加器被使用,于是用X寄存器存贮数值10。 好了,连续两次用数值5写PortA,假设这是需要这样做,但是加载SCS1到累加器有一个很有意义的值。这是串行通信接口SCI需要的,读SCS1寄存器目的是清除任何未决的标志。无意义的语句“SCS1;”被翻译为读寄存器的的汇编语句,这将清除SCI中未决的标志。 前面说过,在嵌入式设备中将所有外设寄存器声明为volatile是一个好习惯。在分开的头文件中定义所有外设的名字,能使所写代码更友好并使迁移简化。下面这个例子用volatile变量声明所有寄存器,这样做较妥当,因为任何这些寄存器能在任何时候在程序流程之
您可能关注的文档
最近下载
- 大连市跨境电商综合实验区建设的SWOT分析【论文范文】.doc VIP
- “一带一路”下我国物流企业与跨境电商协同发展研究论文.doc VIP
- bga返修台_zm-r5860说明书8800元.pdf VIP
- 药物外渗的预防及处理试题.docx
- 2025年辽宁中考英语试题【附答案】.doc
- 传统企业向跨境电商转型的模式及运营机理论文.doc VIP
- 老年保健卫生知识竞赛100题及答案.pdf VIP
- 西南18J515_室内装修 标准图集.pdf VIP
- Dell戴尔Dell Latitude 12 Rugged Extreme – 7214 用户手册.pdf
- 全球价值链与跨境电商研究.pptx VIP
文档评论(0)