- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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{
您可能关注的文档
最近下载
- SYT 5547-2000螺杆钻具使用、维修和管理.pdf
- 第三方产品节能环保ccc证书---服务器.docx VIP
- 一种连续酶解制备蛋白肽的系统及工艺.pdf VIP
- (高清版)B-T 40815.2-2021 电气和电子设备机械结构 符合英制系列和公制系列机柜的热管理 第2部分:强迫风冷的确定方法.pdf VIP
- 2025幼儿园园级家委会ppt全新 .pdf VIP
- PEP人教版六年级下册英语全册导学案.pdf VIP
- 鲁科版六年级上生物思维导图.pptx
- 电商运营方案电商运营方案.pptx VIP
- 计数型MSA测量系统分析报告(模板).xls VIP
- 发展低空经济课件.pptx VIP
文档评论(0)