AVRC语言的应用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
AVRC语言的应用

第九章 AVR C语言的应用 ★ 更详细资料参阅光盘文件 AVR C语言的应用 9.1 AVR – 支持C和高级语言编程的结构 高级语言 ? 提高了MCU的重要性 –上市的时间 –简化维护工作 –轻便 –学习时间 –可重用性 –库 ? 潜在的缺点 –代码大小 –执行速度 为什么 AVR适宜用高级语言编程? 因为它是为高级语言而设计的! IAR对AVR结构和指令集的影响 ? 在结构/指令集确定之前,编译器的开发就开始了 ? 潜在的瓶颈得到确认并消除 ? IAR的反馈在硬件设计上得到了反映 ? 几次循环反复 ? 修改后的结果从代码当中可看出来 Memory system ?32 通用寄存器 –数量多 –直接 与ALU连接 –可保存变量,指针和之间结果 ? 线性程序存储空间 –1KBytes - 8MBytes –无需页寻址 –常数区(SPM可修改) ? 线性数据存储空间 –16 MBytes –无需页寻址 类似于C的寻址模式 C 源代码 unsigned char *var1, *var2; *var1++ = *--var2; 产生的代码 LD R16,-X ST Z+,R16 带偏移量的间接寻址 ?有效访问数组和结构 ?Auto (local variables)放置于软件堆栈之中 –为适应重入的要求,高级语言都基于堆栈结构 四种指针 16和32位支持 ? 加法指令 –加和减 –寄存器之间 –寄存器和立即数之间 –Zero标志的传播 SUB R16,R24 SUBI R16,1 SBC R17,R25 SBCI R17,0 所有的跳转都基于最后结果 两个16位数相减 Non-destructive comparison CP R16,R24 CPC R17,R25 CPC R18,R26 CPC R19,R27 ? 带进位比较 ? Zero传播 ? 无需保存结果 ? 可使用所有形式的跳转 Switch 支持 ? Switches在CASE语句中经常遇到 ? Straight forward approach 效率低 ? 间接跳转适合于紧凑的switch结构 ? switch由通用库管理 摘 要 ? AVR结构从一开始就是针对高级语言设计的 ? Atmel与IAR在结构和指令调整上的合作 ? 从而编译器可以产生高效的代码 Efficient C-coding for AVR 减少代码的提示和诀窍 汇编(Assembly) 与 C比较 汇编: ? 可以完全控制资源 ? 在小应用当中可以产生紧凑的、高速的代码 ? 在大的应用当中代码效率低 ? 可读性差(Cryptic code) ? 不好维护 ? 不易移植(Non-portable) C: ? 对资源的控制有限 ? 在小应中产生的代码量大,执行速度慢 ? 在大的应用当中代码效率高 ? 结构化的代码 ? 容易维护 ? 容易移植 访问 I/O ? 读I/O: temp = PIND; IN R16,LOW(16) ? 写I/O: TCCR0 = 0x4F; LDI R16,79 OUT LOW(51),R16 ? I/O的位设置与清除 ? 地址小于0x1F的I/O: PORTB |= (1PIND2); SBI LOW(24),LOW(2) ADCSR = ~(1ADEN); CBI LOW(6),LOW(7) ? 地址高于0x1F的I/O: TCCR0 = ~(0x80); IN R16,LOW(51) ANDI R16,LOW(127) OUT LOW(51),R16 测试I/O的单个位 ? 等待地址低于0x1F的单个位的清除 while(PIND (1PIND6)); SBIC LOW(16),LOW(6) RJMP ?0002 ? 等待地址高于0x1F的单个位的设置 while(!(TIFR (1TOV0))); IN R16,LOW(56) SBRS R16,LOW(0) RJMP ?0004 16位变量 ? 总是使用最小的数据类型 ? 8位计数器: char count8 = 5; do{ }while(--count8); LDI R16,5 DEC R16 BRNE ?0004 ? Total 6 bytes ? 16位计数器: int count16 = 5; do{

文档评论(0)

haocen + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档