AVR_C语言应用.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AVR_C语言应用

第九章AVR C 语言的应用91第九章AVR C 语言的应用本章程序是用 IAR C 正版软件编译通过的 ,并可产生 *.HEX 烧录文件 ,用其它 C 语言 编译是有差异的,不一定能通过,请用户注意这点 !本章最后附几种 C 语言的比较,不仿一 读更详细资料参阅光盘文件 AVR C 语言的应用9.1AVR – 支持 C 和高级语言编程的结构一般高级语言提高了 MCU 的重要性–缩短产品上市的时间– 简化了维护工作,可读性好– 轻便– 缩短学习时间– 可重复使用,便于移植– 方便调用库文件潜在的缺点– 代码较大– 执行速度慢为什么 AVR 适宜用高级语言编程?因为它是为高级语言而设计的!IAR 对 AVR 结构和指令集的影响在结构/指令集确定之前编译器的开发就开始了潜在的瓶颈得到确认并消除IAR 的反馈在硬件设计上得到了反映几次循环反复修改后的结果从代码当中可看出来存储器?32 通用寄存器– 数量多– 直接 与 ALU 连接– 可保存变量指针和之间结果? 线性程序存储空间– 1KBytes - 8MBytes– 无需页寻址– 常数区(SPM 可修改)? 线性数据存储空间– 16 MBytes– 无需页寻址类似于C 的寻址模式C 源代码无符号的字符*var1, *var2;*var1++ = *--var2;第九章 AVR C 语言的应用92产生的代码LD R16,-XST Z+,R16带偏移量的间接寻址?有效访问数组和结构?Auto (local variables)放置于软件堆栈之中– 为适应重入的要求高级语言都基于堆栈结构四种指针16 和 32 位支持加法指令– 加和减– 寄存器之间– 寄存器和立即数之间– Zero 标志的传播 SUB R16,R24SUBIR16,1SBCR17,R25SBCIR17,0所有的跳转都基于最后结果两个 16 位数相减第九章 AVR C 语言的应用93Non-destructive comparisonCPR16,R24CPCR17,R25CPCR18,R26CPCR19,R27带进位比较Zero 传播无需保存结果可使用所有形式的跳转Switch 支持Switches 在 CASE 语句中经常遇到Straight forward approach 效率低间接跳转适合于紧凑的 switch 结构switch 由通用库管理摘 要AVR 结构从一开始就是针对高级语言设计的Atmel 与 IAR 在结构和指令调整上的合作第九章 AVR C 语言的应用94? 从而编译器可以产生高效的代码AVR—高效的 C 编译器减少代码的提示和诀窍汇编(Assembly)与C比较汇编:可以完全控制资源在小应用当中可以产生紧凑的高速的代码在大的应用当中代码效率低可读性差Cryptic code不好维护不易移植Non-portableC 编译器:对资源的控制有限在小应中产生的代码量大执行速度慢在大的应用当中代码效率高结构化的代码容易维护容易移植访问 I/O? 读I/O: temp = PIND;INR16,LOW(16)? 写I/O: TCCR0 = 0x4F; LDI R16,79OUTLOW(51),R16I/O 的位设置与清除地址小于 0x1F 的 I/O:PORTB |= (1PIND2);SBI LOW(24),LOW(2) ADCSR = ~(1ADEN);CBILOW(6),LOW(7)? 地址高于0x1F的I/O:TCCR0 = ~(0x80); IN R16,LOW(51)ANDIR16,LOW(127)OUTLOW(51),R16测试 I/O 的单个位? 等待地址低于0x1F的单个位的清除 while(PIND (1PIND6));SBIC LOW(16),LOW(6) RJMP ?0002? 等待地址高于0x1F的单个位的设置 while(!(TIFR (1TOV0)));第九章 AVR C 语言的应用95INR16,LOW(56)SBRSR16,LOW(0)RJMP?000416位变量? 总是使用最小的数据类型? 8位计数器:char count8 = 5; do{ }while(--count8); LDI R16,5 DEC R16 BRNE ?0004Total 6 bytes16 位计数器:int count16 = 5; do{ }while(--count16);LDIR24,LOW(5)LDIR25,0SBIWR24,LWRD(1)BRNE?0004Total 8 Bytes全局和局部变量全局变量– 在 startup 初始化– 存储于 SRAM– 必须加载到寄存器堆中局部变量– 在函数初期初始化– 存储于寄存器当中直至函数结束全局变量和局部变量? 局部变量void ma

文档评论(0)

bigone123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档